41 Востаннє редагувалося reverse2500 (18.02.2015 22:16:52)

Re: Низькорівнева всячина

The world's leading source for technical x86 processor information.
цей сайт використовую як підказку коли потрібно щось дізасемблерувати, назразок типу коли в IDA дамп байтів

- Поганому трояну фаєрвол заважає
- Ніколи не програмуйте та не пийте пиво
Якщо ви з першого разу написали програму, в якій немає жодної помилки, повідомте про це системного програмісту: він виправить помилки в компіляторі
Подякували: 0xDADA11C7, leofun012

42

Re: Низькорівнева всячина

Білоруси про трояноподібний яндеск бар
http://replace.org.ua/extensions/om_images/img/5960f3d58c2cb/zjbGEjbRrP8.jpg

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: HetmanNet, VertoX, leofun013

43 Востаннє редагувалося Kane (08.08.2015 16:37:12)

Re: Низькорівнева всячина

Тре було 32-байтовий масив сконвертити у строковий вигляд і навпаки, і я не знав про CryptBinaryToString, і тому створив велик наведений нижче:

format pe console

section '.code' import readable writeable executable

include 'win32ax.inc'

library     msvcrt, 'msvcrt.dll'

import      msvcrt,\
            printf, 'printf',\
            getchar, 'getchar'


proc print, buf
    locals
        frmt db '%02X', 0
    endl

    mov esi, [buf]
    xor ecx, ecx

@@: movzx eax, byte[esi]

    push ecx
    cinvoke printf, addr frmt, eax
    pop ecx

    inc ecx
    inc esi

    cmp ecx, 32
    jne @b

    cinvoke printf, next_line

    ret
endp

proc strkey_to_uint, s, u
    mov esi, [s]
    mov edi, [u]

    xor ecx, ecx
@@: push ecx

    mov eax, ecx
    shr eax, 1

    xor ecx, ecx

.end_step:
    mov dl, byte[esi + ecx]
    sub dl, '0'
    cmp dl, 9
    jng .is_num
    push 'A' - 10
    jmp .is_chr
.is_num:
    push '0'
.is_chr:
    mov dl, byte[esi + ecx]
    pop ebx
    sub dl, bl

    cmp ecx, 0
    jne .next_step
    shl edx, 28
    inc ecx
    jmp .end_step

.next_step:
    mov ebx, edx
    and ebx, 0xF0000000
    shr ebx, 24
    or edx, ebx

    mov byte[edi + eax], dl

    pop ecx
    add ecx, 2
    add esi, 2
    cmp ecx, 64
    jl @b

    ret
endp

proc uint_to_strkey, s, u
    mov esi, [u]
    mov edi, [s]

    xor ecx, ecx
@@: push ecx
    mov cl, 4

.end_step:
    mov al, byte[esi]
    shr al, cl
    and al, 0xF

    cmp al, 9
    jng .is_num
    push 'A' - 10
    jmp .is_chr
.is_num:
    push '0'
.is_chr:
    pop edx

    add eax, edx

    mov byte[edi], al
    inc edi

    cmp cl, 4
    jne .next_step
    xor cl, cl
    jmp .end_step

.next_step:
    pop ecx
    inc ecx
    inc esi
    cmp ecx, 32
    jl @b

    mov byte[edi], 0

    ret
endp

entry $

    stdcall strkey_to_uint, key_str, buf_uint8
    stdcall print, buf_uint8

    cinvoke printf, key_str
    cinvoke printf, next_line

    stdcall uint_to_strkey, buf_char, buf_uint8
    cinvoke printf, buf_char

    cinvoke getchar
    xor eax, eax
    ret


    key_str         db '1122334455667788990011223344556677889900112233445566778899001122', 0
    next_line       db 13, 10, 0

    buf_uint8       rb 32
    buf_char        rb 64 + 1

Ну і до пари на C, навіщо добру пропадать?

typedef enum _KEY_CONV_MODE {
    KEY_ERROR = -1,
    KEY_OK,
    STRKEY_TO_UINT,
    UINT_TO_STRKEY
} KEY_CONV_MODE;


int convert_key(char *s, uint8_t *u, KEY_CONV_MODE m) {
    switch (m) {
        int i;

        case STRKEY_TO_UINT:
            if (strlen(s) != 64)
                return KEY_ERROR;

            for (i = 0; i < 64; i += 2)
                u[i / 2] = (s[i] - (s[i] - '0' <= 9 ? '0' : 'A' - 10)) * 16 + s[i + 1] - (s[i + 1] - '0' <= 9 ? '0' : 'A' - 10);

            break;

        case UINT_TO_STRKEY:
            for (i = 0; i < 32; i++)
                *s++ = (u[i] >> 4) % 16 + ((u[i] >> 4) % 16 <= 9 ? '0' : 'A' - 10),
                *s++ = u[i] % 16 + (u[i] % 16 <= 9 ? '0' : 'A' - 10);

            *s = '\0';

            break;

        default:
            return KEY_ERROR;
    }

    return KEY_OK;
}
Подякували: 0xDADA11C71

44

Re: Низькорівнева всячина

Використання RtlGenRandom на прикладі генератору паролів:

format pe console

section '.code' import readable writeable executable

include 'win32ax.inc'

library     msvcrt, 'msvcrt.dll',\
            advapi32, 'advapi32.dll'

import      msvcrt,\
            printf, 'printf',\
            getchar, 'getchar'

import      advapi32,\
            RtlGenRandom, 'SystemFunction036'

proc xrand, min, max
    locals
        pRandomBuffer rd 1
    endl

    invoke RtlGenRandom, addr pRandomBuffer, 4
    cmp eax, 0
    je .err

    mov eax, [pRandomBuffer]
    xor edx, edx
    mov ecx, [max]
    div ecx
    mov eax, edx
    add eax, [min]
    jmp .fin

.err:
    xor eax, eax
    dec eax
.fin:
    ret
endp

proc rand_char, buf, num
    locals
        c db '0aA'
    endl

    mov edi, [buf]
    xor ecx, ecx
@@: push ecx

    push 3
    push 0
    call xrand

    lea esi, [c]
    add esi, eax

    cmp eax, 0
    je .is_num
    push 26
    jmp .is_chr
.is_num:
    push 10
.is_chr:
    push 0
    call xrand

    mov dl, [esi]
    add dl, al
    mov byte[edi], dl

    pop ecx

    inc edi
    inc ecx
    cmp ecx, [num]
    jl @b

    mov byte[edi], 0

    ret
endp


entry $
    xor ecx, ecx
@@: push ecx
    stdcall rand_char, rand_buf, 32
    cinvoke printf, frmt_str, rand_buf
    pop ecx
    inc ecx
    cmp ecx, 40
    jl @b

    cinvoke getchar
    xor eax, eax
    ret


    frmt_str            db '%s', 13, 10, 0
    rand_buf            rb 32 + 1
Подякували: 0xDADA11C7, leofun012

45 Востаннє редагувалося HetmanNet (08.08.2015 20:06:23)

Re: Низькорівнева всячина

0xDADA11C7 написав:

треба робити УКР. ресурс по reverse engineering software

А цей ресурс чим вам не догодив?

Боїться що коли ресурс приверне увагу, адмін запанікує та всіх здасть.

Віддамся на один вечір в хороші дівочі руки.. не дорого, в у.о. .. Якщо сподобається, то залишуся безкоштовно назавжди..

46

Re: Низькорівнева всячина

Зараз настає час дрібних вікі-проєктів і сект навколо них, а тоді вже колись з'явиться ресурс на основі захищеної мережі, зміненим в бік системності правописом, форумним рушієм з покращеною категоризацією, власними відомими розробками, гривня матиме таке ж ходження, як і вівериця.

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: leofun011

47

Re: Низькорівнева всячина

Є старенька стаття на ксакепі, під назвою "Морфим, не отходя от кассы: Мутация кода во время компиляции". Так ось там розписано про чудові можливості макросів FASM'у, за допомогою яких ми можемо дуже гарно обфускувати сирці.
Основою подібних речей - є генерація випадкових чисел. У тій статті використовувався лінійний конгруентний метод, початковим значенням котрого, є вбудована фішка FASM для отримання timestamp, а саме - %t. Той алгоритм - копія deprecated функції у crt - rand() (натомість, радять використовувати rand_s(), бекендом якої, у windows, є RtlGenRandom).
Значить розвивав я цю тему, пітончик мені генерував FASM'ом різні exe.. морфило доволі непогано. Але потім я запримітив наступне:

use32

min = 0xFFFF
max = 0xFFFFFFFF

rept 10 {
    mov eax, min + %t mod max
}

видає:

mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39
mov eax, 0x55E18A39

Фіговий seed. Через подібну лажу, виникали "пробіли" (колізії) при генерації. Вирішення? або ж треба ставити sleep() на кожній ітерації, або.. тоді я не додумав - додати функціонал до самого FASM.

Версія FASM, яку ми будемо доповнювати - 1.71.39

Відкриваємо PARSER.INC шукаємо наступне:

    cmp    al,'t'
    je    get_timestamp_id

після нього пишемо:

    cmp al, 'r'
    je get_rnd_id

шукаємо:

      get_org_origin_id:
    mov    eax,3
    ret

після пишемо:

      get_rnd_id:
    mov eax, 4
    ret

Відкриваємо EXPRCALC.INC і шукаємо:

    cmp    eax,3
    je    org_origin_label

після нього пишемо:

    cmp eax, 4
    je rnd_label

шукаємо:

      timestamp_label:
    call    make_timestamp
      make_qword_label_value:
    stos    dword [edi]
    mov    eax,edx
    stos    dword [edi]
    add    edi,0Ch
    jmp    calculation_loop

після нього пишемо

      rnd_label:
    call make_rnd
    stos    dword [edi]
    xor    eax,eax
    stos    dword [edi]
    add    edi,0Ch
    jmp    calculation_loop

У FASM.ASM додаєм нову API:

  dd 0,0,0,rva advapi_name,rva advapi_table

  advapi_table:
    RtlGenRandom dd rva _RtlGenRandom
    dd 0

  advapi_name db 'advapi32.dll', 0

  _RtlGenRandom dw 0
    db 'SystemFunction036', 0

у секції зі змінними (section '.data'), додаєм

pRandomBuffer rd 1

Відкриваємо SYSTEM.INC, та у кінці додаєм наступну процедуру:

make_rnd:
    push 4
    push pRandomBuffer
    call [RtlGenRandom]
    
    cmp eax, 0
    je .err
    
    mov eax, [pRandomBuffer]
    jmp .fin

.err:
    xor eax, eax
    dec eax
.fin:
    ret

Компілюємо. Запускаємо наступний код:

use32

min = 0xFFFF
max = 0xFFFFFFFF

rept 10 {
    mov eax, min + %r mod max
}

маємо:

mov eax, 0xAEE20D07
mov eax, 0x475732CE
mov eax, 0x91EDBD28
mov eax, 0x19F13DFD
mov eax, 0xDA4ED476
mov eax, 0xF6563F6F
mov eax, 0xE3C7984B
mov eax, 0xA6C7CB04
mov eax, 0xDCB228FA
mov eax, 0xF4FD6E45

Інша справа :)

Як ви могли помітити, задля своєї забаганки, ми забронювали %r

Подякували: 0xDADA11C7, leofun012

48

Re: Низькорівнева всячина

А чому ви не використовували попереднє значення псевдорандому для генерації наступного?

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

49

Re: Низькорівнева всячина

quez написав:

А чому ви не використовували попереднє значення псевдорандому для генерації наступного?

І не такі милиці було пороблено. Джерело ентропії у даному випадку і для подібної задачі - дуже невдале, а при одночасному запуску декількох процесів FASM - виникає повна або часткова колізія. Працює через раз, що є неприпустимо.

Подякували: 0xDADA11C7, leofun012

50

Re: Низькорівнева всячина

Kane написав:
quez написав:

А чому ви не використовували попереднє значення псевдорандому для генерації наступного?

І не такі милиці було пороблено. Джерело ентропії у даному випадку і для подібної задачі - дуже невдале, а при одночасному запуску декількох процесів FASM - виникає повна або часткова колізія. Працює через раз, що є неприпустимо.

Логічно.

В кінці кінців ви використовуєте RtlGenRandom, який

generates a pseudo-random number.

Чому не викликати її в виконуваному файлі? Це костиль, чи зроблено для зручності, чи просто шукали на свою голову задач?

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

51

Re: Низькорівнева всячина

quez, сенс у використанні випадкового значення на стадії препроцессингу (макроси).

Так, це не погана задача для ознайомлення з нутрощами подібних проектів, спортивний інтерес, ну і для зручності - RtlGenRandom все ж таки краще, аніж я би ліпив коників із суміші декількох технологій, тим паче працює "на стороні" - краще і придумати не можна.

Подякували: quez, 0xDADA11C7, leofun013

52

Re: Низькорівнева всячина

Kane написав:

а при одночасному запуску декількох процесів FASM - виникає повна або часткова колізія. Працює через раз, що є неприпустимо.

Дякую за ваш внесок, бачу працюєте в промислових масштабах 8) До речі, щойно вийшла мова FASM2 й нині розробка мови асемблера для будь-якої залізяки дуже легка справа, бо нова макромова FASM2 добре для цього прилаштована. Найепічніші нововведення:

ієрархічні простори назв

        space:
        space.x = 1
        space.y = 2
        space.color:
        space.color.r = 0
        space.color.g = 0
        space.color.b = 0

те саме

        namespace space
                x = 1
                y = 2
                color:
                .r = 0
                .g = 0
                .b = 0
        end namespace

оператор присвоєння з можливістю скасування нового значення і відновлення попереднього

        a = 1
        a =: 2          ; preserves a = 1
        a = 3           ; discards a = 2 and replaces it with a = 3
        restore a       ; brings back a = 1

Покращені структури

        struc POINT
                label . : qword
                .x dd ?
                .y dd ?
        end struc

        my POINT        ; defines my.x and my.y

покращені цикли

        s = x/2
        repeat 100
                if x/s = s
                        break
                end if
                s = (s+x/s)/2
        end repeat

віртуальний простір пам'яті для збереження констант

Зчитати звідтіля можливо лише за допомогою оператору load

        virtual at 0
                hex_digits::
                db '0123456789ABCDEF'
        end virtual
        load a:byte from hex_digits:10  ; a = 'A'

оператор eval

так, вам не почулося, оператор виконує програму мовою асемблера, що може полегшити розробку макросів

        repeat 26
                eval 'A'+%-1,'=',`%
        end repeat

Також до дистрибутиву додається асемблери для 8051, 8086, Java Bytecode, avr, dcpu-16 писані макромовою FASM2 і приклади роботи з ними

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: Kane, reverse2500, 0x9111A, leofun014

53

Re: Низькорівнева всячина

оператор присвоєння з можливістю скасування нового значення і відновлення попереднього

Навіть не знаю, для чого це може бути використано, окрім як для внесення багів до програми.

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ

54

Re: Низькорівнева всячина

натякну малюнком:
https://pp.vk.me/c619828/v619828546/1ad6/NVrYWRrGbjE.jpg

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

55

Re: Низькорівнева всячина

Вірним шляхом крокує Томаш.
Тільки не вистачає найпримітивнішого I/O для повноцінного щастя. Раз він робить ставку на макроси у ядрі і тільки, було б дуже доречно.

Подякували: 0xDADA11C71

56

Re: Низькорівнева всячина

флейм
Перл з cyberforum)) "Ніколи не здавайся і ти побачиш, як здаються інші".

http://i71.fastpic.ru/big/2015/0829/09/3f3de32ece29972eff736b05ef47df09.png

Подякували: 0xDADA11C7, reverse2500, leofun01, /KIT\4

57

Re: Низькорівнева всячина

quick sort

format pe console

section '.code' import readable writeable executable

include 'win32ax.inc'

library msvcrt, 'msvcrt.dll'

import msvcrt,\
            printf, 'printf',\
            getchar, 'getchar'


proc print, arr, n
    locals
        frmt_byte       db '%d%s',  0

        left_bracket    db '[',     0

        delim_comma     db ', ',    0
        right_bracket   db ']',     13, 10, 0
    endl

    cinvoke printf, edx, addr left_bracket

    mov esi, [arr]
    xor ecx, ecx

@@: push ecx

    mov edx, [n]
    dec edx
    cmp ecx, edx
    jne .comma

    lea edx, [right_bracket]
    push edx

    jmp .next

.comma:
    lea edx, [delim_comma]
    push edx

.next:
    movzx eax, byte[esi]
    cinvoke printf, addr frmt_byte, eax
    add esp, 4

    pop ecx
    inc ecx
    add esi, 4

    cmp ecx, [n]
    jne @b

    ret
endp

proc qsort, arr, left, right
    mov edx, [right]
    mov ebx, [left]
    mov edi, [arr]

@02:
    mov ecx, ebx
    lea eax, [edx + ebx]
    mov esi, edx
    mov eax, eax
    test eax, eax
    jns @03
    add eax, 1

@03:
    sar eax, 1
    mov eax, dword[eax * 4 + edi]
    jmp @05

@04:
    inc ecx

@05:
    cmp dword[ecx * 4 + edi], eax
    jl @04
    jmp @07

@06:
    dec esi

@07:
    cmp dword[esi * 4 + edi], eax
    jg @06
    cmp ecx, esi
    jg @09
    mov ebx, dword[ecx * 4 + edi]
    mov dword[ebp + 8], ebx
    mov ebx, dword[esi * 4 + edi]
    cmp dword[ebp + 8], ebx
    jle @08
    mov dword[ecx * 4 + edi], ebx
    mov ebx, dword[ebp + 8]
    mov dword[esi * 4 + edi], ebx

@08:
    inc ecx
    dec esi
    cmp ecx, esi
    jle @05

@09:
    mov ebx, dword[ebp + 12]
    cmp ecx, edx
    jge @10

    stdcall qsort, edi, ecx, edx

@10:
    cmp ebx, esi
    jge @11
    mov edx, esi
    jmp @02

@11:
    ret
endp


entry $
    stdcall print, arr, arr_sz
    stdcall qsort, arr, 0, arr_sz - 1
    stdcall print, arr, arr_sz

    cinvoke getchar
    xor eax, eax
    ret


    arr         dd 99, 88, 77, 66, 55, 44, 33, 22, 11
    arr_sz      = ($ - arr) / 4

[99, 88, 77, 66, 55, 44, 33, 22, 11]
[11, 22, 33, 44, 55, 66, 77, 88, 99]

Питання до пана 0xDADA11C7 бо він крипт шпрехає: на "ринку" є попит морфу smali-байткоду?

Подякували: 0xDADA11C71

58

Re: Низькорівнева всячина

на ринку попит є на комплексні рішення, якби там був попит на окремі послуги, то третина ринку б озолотилася. Крипт андроїдних застосунків в сенсі? Так, попит є і платять більше ніж за звичайний крипт для вінди.

Я тут низькорівневий кібуц хочу створити для навчання початківців і мистецтва, стукну вам невдовзі з пропозицією.

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»

59

Re: Низькорівнева всячина

Крипт андроїдних застосунків в сенсі?

і криптор і пакер є сенс, вже питали на ехелабі

- Поганому трояну фаєрвол заважає
- Ніколи не програмуйте та не пийте пиво
Якщо ви з першого разу написали програму, в якій немає жодної помилки, повідомте про це системного програмісту: він виправить помилки в компіляторі
Подякували: 0xDADA11C71

60

Re: Низькорівнева всячина

0xDADA11C7 написав:

. Крипт андроїдних застосунків в сенсі?

elf ARM чи байткод?