HOOK

Тема в разделе "WASM.ASSEMBLER", создана пользователем asm0day01, 18 мар 2022.

  1. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    Народ! Накидайте ссылок и исходников, на тему хуков
    зы.
    За ранее спасибо!
     
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
  3. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    ссылку на статьи если можно )
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
  5. asm0day01

    asm0day01 Member

    Публикаций:
    0
    Регистрация:
    7 янв 2020
    Сообщения:
    128
    сайт мертв
     
  6. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Нет, всё работает, кроме третьей статьи, но тебе она не нужна. Читай и изучай.
     
    M0rg0t нравится это.
  7. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    HoShiMin, сейчас окажется, что это не те хуки, а те, что в статья Ицзелиона.
     
  8. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    А что там за хуки? Оконные?
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
  10. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Да. Но кто ж его знает, ТСа, у него каждый пост - как ребус от Жака Фреско.
     
    Rel и Mikl___ нравится это.
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    Пиратские:
     
  12. who_know777

    who_know777 Member

    Публикаций:
    2
    Регистрация:
    29 мар 2021
    Сообщения:
    89
    Адрес:
            
    Код (Text):
    1. ;0 day Hook engine
    2.  
    3. ; Движок для перехвата функций. Подойдет как для ring3 перехватов, так
    4. ; и для ring0. Проблемы могут возникнуть при копировании call в тело
    5. ; функции, но я думаю этого не будет.
    6. ; Функции аллока и освобождения памяти намеренно убраны, т.к. для
    7. ; разных ring свои функции аллока памяти.
    8.  
    9. ; Работает так: дизассемблирует начальный код функции, и копирует
    10. ; в буффер столько кода, чтобы заместо него поместился call. После
    11. ; копирования, начало функции заменяется на call <> + nop для добивки
    12. ; остатков. При исполнении функции, вызывается колл, который вызывает
    13. ; функцию обработки, а затем переходит на исполнение
    14. ; первоначальных комманд из функции.
    15. ; Не будет работать, если сразу же в начале функции есть любые джампы
    16. ; или коллы. В остальных случаях все ок.
    17.  
    18. .686
    19. .model flat, stdcall
    20.         include windows.inc
    21.  
    22.  
    23. .data
    24.         my_struct        db 20h dup(4) ; Структура для одного перехвата
    25.         hook_table       dd 10h dup(3) ; Таблица с перехваченными функциями
    26.         hook_table_c     dd  0h        ;
    27. .code
    28.  
    29.         _salc     equ <db 0D6h>   ;sbb al,al
    30.         NrmTabLen equ 53
    31.         _aam macro num          ;ah=al/num;al=al mod num
    32.          db 0D4h, num
    33.         endm
    34.         _aad macro num          ;al=ah*num+al;ah=0
    35.          db 0D5h, num
    36.         endm
    37.  
    38.         VirXasm32 proc
    39.  
    40.         ; ==========[ disassemble instruction from esi ]===========
    41.                 pushad
    42.         ; ==========[ push packed tables to stack]=========
    43.                 push    000001510h
    44.                 push    0100101FFh
    45.                 push    0FFFFFF55h
    46.                 push    0FFFFFFF8h
    47.                 push    0F8FF7FA0h
    48.                 push    00F0EC40Dh
    49.                 push    007551004h
    50.                 push    001D005FFh
    51.                 push    0550D5D55h
    52.                 push    0555F0F88h
    53.                 push    0F3F3FFFFh
    54.                 push    00A0C1154h
    55.                 mov     edx, esi        ; store esi
    56.                 mov     esi, esp        ; esi = address of unpacked tables
    57.         ; ==========[ push unpack info bits to stack]==========
    58.                 push    11001b
    59.                 push    10110000101011000000101110000000b
    60.                 push    10111111101100011111001100111110b
    61.                 push    00000000000100011110101001011000b
    62.                 mov     ebx, esp        ; ebx = address of unpack info bits
    63.                 sub     esp, 110        ; reserve stack for unpacked tables
    64.                 mov     edi, esp        ; edi = address of buffer for unpacked tables
    65.         ; ==========[ unpack tables to stack ]==========
    66.                 cld
    67.                 push    100
    68.                 pop     ecx             ; total size of unpacked tables is 100 bytes
    69.         xa_nxtIndx:                     ;*xor al,al
    70.                 bt      [ebx], ecx      ; get unpack bit to CF
    71.                 _salc                   ; if bit==0 then al=0 (salc==sbb al,al but not change flags)
    72.                 jnc     xa_is0          ; if bit!=0 then ...
    73.                 lodsb                   ; ... load byte from tables in AL ...
    74.         xa_is0: stosb                   ; ... else write zero
    75.                 loop    xa_nxtIndx      ; next byte
    76.                 mov     esi, edx        ; restore esi
    77.         ; ==========[ process fucking opcodes ]==========
    78.                 push    2
    79.                 pop     ebx             ; ebx=2 (current mode - 32 bits)
    80.                 mov     edx, ebx        ; edx=2 (current addressing mode - 32 bits)
    81.         xa_NxtByte:
    82.                 lodsb
    83.                 push    eax
    84.                 push    eax             ; double store AL
    85.                 cmp     al, 66h         ; if 66h present then ...
    86.                 cmove   ebx, ecx        ; ... ebx=ecx=0 (current mode - 16 bits) *jne n32;xor ebx,ebx;n32:
    87.                 cmp     al, 67h         ; if 67h present then ...
    88.                 cmove   edx, ecx        ; ... edx=ecx=0 (current addressing mode - 16 bits)
    89.                 cmp     al, 0EAh        ; JMP FAR
    90.                 je      xa_jmp
    91.                 cmp     al, 09Ah        ; CALL FAR
    92.                 jne     xa_nocall
    93.         xa_cll: inc     esi
    94.         xa_jmp: lea     esi, [esi+ebx+3]        ; for JMP byte imm will be later
    95.         xa_nocall:
    96.                 cmp     al, 0C8h        ; fucking ENTER i16,i8  :[
    97.                 je      xa_i16
    98.                 and     al, 0F7h        ; C2h, CAh
    99.                 cmp     al, 0C2h        ; IRET i16 RET i16  :[
    100.                 jne     xa_no16
    101.         xa_i16: inc     esi
    102.                 inc     esi             ; imm16
    103.         ; ==========[ process prefixes ]==========
    104.         xa_no16:
    105.                 and     al, 0E7h
    106.                 cmp     al, 26h         ; 26h,2Eh,36h,3Eh (ES,CS,SS,DS)
    107.                 pop     eax             ; first restore AL (don't change flags)
    108.                 je      xa_PopNxt
    109.                 cmp     al, 0F1h        ; int1
    110.                 je      xa_F1
    111.                 and     al, 0FCh
    112.                 cmp     al, 0A0h        ; mov eax,[off16/32]
    113.                 jne     xa_noMOV
    114.                 lea     esi, [esi+edx+2]
    115.         xa_noMOV:
    116.                 cmp     al, 0F0h        ; F0h-F3h (LOCK,..,REPE,REPNE)
    117.                 je      xa_PopNxt
    118.         xa_F1:  cmp     al, 64h         ; 64h,65h,66h,67h (FS,GS,Prfx66,Prfx67)
    119.         xa_PopNxt:
    120.                 pop     eax             ; second restore AL (don't change flags)
    121.                 je      xa_NxtByte
    122.         ; ==========[ prepare opcode ]==========
    123.                 mov     edi, esp        ; edi = normal table (line info bits)
    124.                 push    edx             ; store addressing mode flag
    125.                 push    eax             ; store opcode value
    126.                 cmp     al, 0Fh
    127.                 jne     xa_Nrm          ; if ext. group code then ...
    128.                 lodsb                   ; ... load byte of ext. code
    129.         xa_Nrm: pushfd                  ; store FLAGS
    130.                 _aam    10h             ;*mov ah,al;shr ah,4;and al,0Fh
    131.                 xchg    cl, ah          ; high part of ecx still is zero
    132.                 cwde                    ;*nothing
    133.                 cdq                     ;*xor edx,edx (bicoz eax>0)
    134.                 xor     ebp, ebp
    135.                 popfd                   ; restore FLAGS
    136.                 jne     xa_NrmGroup
    137.         ; ==========[ extended group ]==========
    138.         xa_ExtGroup:
    139.                 add     edi, NrmTabLen  ; edi = extended table (line info bits)
    140.                 jecxz   xa_@3
    141.         xa_@1:  bt      [edi], ebp
    142.                 jnc     xa_@2           ; is not ModR/M only line?
    143.                 inc     edx             ; yeah
    144.         xa_@2:  inc     ebp
    145.                 loop    xa_@1
    146.                 jc      xa_@3
    147.                 _salc                   ;*xor al,al
    148.                 cdq                     ;*xor edx,edx
    149.         xa_@3:  shl     edx, 1
    150.                 jmp     xa_ProcOpcode
    151.         ; ==========[ normal group ]==========
    152.         xa_NrmGroup:
    153.                 sub     cl, 4
    154.                 jns     xa_@4
    155.                 mov     cl, 0Ch         ; bicoz 0xh,1xh,2xh,3xh are equal
    156.                 and     al, 7
    157.         xa_@4:  jecxz   xa_4x
    158.         xa_@5:  adc     dl, 1           ; in first pass CF==0
    159.                 inc     ebp
    160.                 bt      [edi], ebp
    161.                 loop    xa_@5
    162.                 jc      xa_ProcOpcode
    163.         xa_4x:  shr     al, 1           ; al/2
    164.         ; ==========[ process additional fields ]==========
    165.         xa_ProcOpcode:
    166.                 xchg    cl, al
    167.                 lea     edx, [edx*8+ecx]; edx=index of opcode in table
    168.                 pop     ecx             ; restore opcode value to CL
    169.                 pop     ebp             ; restore 67h flag
    170.                 bt      [edi+2], edx    ; edi+2=mod r/m info bits
    171.                 jnc     xa_noModRM
    172.         ; ==========[ process mod r/m bytes ]===========
    173.         xa_ModRM:
    174.                 lodsb
    175.                 _aam    8               ; ah=ModRO; al=RM
    176.                 shl     ah, 4           ; CF=hi Mod; SF=lo Mod
    177.                 jnc     xa_isModRM
    178.                 js      xa_enModRM      ; Mod==11
    179.         xa_isModRM:
    180.                 pushfd                  ; store FLAGS
    181.                 test    ebp, ebp        ; prefix 67 present
    182.                 jnz     xa_addr32
    183.                 sub     al, 6           ; 16 bit addressing
    184.                 jnz     xa_noSIB        ; if RM==6(BP) then ...
    185.                 mov     al, 5           ; ... offset 16
    186.         xa_addr32:                      ; 32 bit addressing
    187.                 cmp     al, 4
    188.                 jne     xa_noSIB        ; if RM==4 then ... (note: after addr16 al<2)
    189.                 lodsb                   ; ... get SIB
    190.                 and     al, 7           ; al=BASE
    191.         xa_noSIB:
    192.                 popfd                   ; restore FLAGS
    193.                 jc      xa_iWD          ; Mod==10
    194.                 js      xa_i8           ; Mod==01
    195.                 cmp     al, 5           ; if (RM==5BASE==5) && Mod==00 then ... (32 bit)
    196.                 jne     xa_enModRM      ; if            RM==6 && Mod==00 then ... (16 bit)
    197.         xa_iWD: add     esi, ebp        ; ... offset 16/32
    198.                 inc     esi
    199.         xa_i8:  inc     esi             ; offset 8
    200.         ; ==========[ fucking TEST!!! ]==========
    201.         xa_enModRM:
    202.                 test    ah, 60h         ; if RO!=0  RO!=1 then ...
    203.                 jnz     xa_noModRM      ; ... go away
    204.                 xchg    eax, ecx        ; ... else al=cl=opcode
    205.                 cmp     al, 0F6h        ; TEST rm,i8
    206.                 je      xa_ti8
    207.                 cmp     al, 0F7h        ; TEST rm,i16/i32
    208.                 jne     xa_noModRM
    209.                 add     esi, ebx        ; imm16/imm32 (66h prefix dependence)
    210.                 inc     esi
    211.         xa_ti8: inc     esi             ; imm8
    212.         ; ==========[ process immediate values ]==========
    213.         xa_noModRM:
    214.                 shl     edx, 1          ; edx*2
    215.                 bt      [edi+2+17], edx ; edi+2+17=immediate values info bits
    216.                 jnc     xa_Exit
    217.                 inc     edx
    218.                 bt      [edi+2+17], edx
    219.                 jnc     xa_im8
    220.                 adc     esi, ebx        ; imm16/imm32, 66h prefix dependence (ebx)
    221.         xa_im8: inc     esi
    222.         ; ==========[ return result and exit ]==========
    223.         xa_Exit:
    224.                 add     esp, 110+64     ; clear stack
    225.                 sub     esi, [esp+4]    ; esi=esi-old esi
    226.                 mov     [esp+7*4], esi  ; eax=esi
    227.                 popad
    228.                 ret
    229.         VirXasm32 EndP
    230.  
    231.         Hook_Jump proc
    232.                 call Hook_Parse
    233.                 add  esp, 4h
    234.                 ; inline of function
    235.                 call Hook_Parse
    236.                 db 0Bh dup (90h)
    237.         Hook_Jump EndP
    238.  
    239.         Hook_Parse proc
    240.                 ret
    241.         Hook_Parse EndP
    242.  
    243.         WriteHook proc Function:DWORD, HookCode:DWORD, HookCodeLen:DWORD, OldCodeBuffer:DWORD
    244.                 pushad
    245.                         mov ebx, HookCodeLen
    246.                         mov esi, Function
    247.                         loopme:
    248.                                 call VirXasm32
    249.                                 add esi, eax
    250.                                 sub ebx, eax
    251.                                 jbe found_len
    252.                         jmp loopme
    253.                         found_len:
    254.                         neg ebx
    255.                         add ebx, HookCodeLen
    256.                         ; save to old buffer
    257.                         mov edi, OldCodeBuffer
    258.                         mov esi, Function
    259.                         call Copy_It
    260.                         mov edx, Function
    261.                         sub edx, ebx
    262.                         sub edx, edi
    263.                         add edx, 1h
    264.                         mov  byte ptr [edi+ebx+00h], 0E9h
    265.                         mov dword ptr [edi+ebx+01h], edx
    266.                         ; write new code
    267.                         xchg esi, edi
    268.                         mov  esi, HookCode
    269.                         call Copy_It
    270.                         mov dword ptr [esp+1ch], ebx
    271.                 popad
    272.                 ret
    273.         WriteHook EndP
    274.         Copy_It proc
    275.                 mov ecx, ebx
    276.                 cp_loop:
    277.                         mov al, byte ptr [esi+ecx-1]
    278.                         mov byte ptr [edi+ecx-1], al
    279.                 loop cp_loop
    280.                 retn
    281.         Copy_It EndP
    282.  
    283.         Hook_Install proc function:DWORD ; Public function
    284.                 ; Нужно выделить память для структуры (8h + 4h + 4h + 10h байт)
    285.                 ;  8h code
    286.                 ; 10h oldcode + jmp back
    287.                 ;  4h real address
    288.                 ;  4h size
    289.                 mov eax, offset my_struct
    290.                 .if eax == 0
    291.                         ;DbgPrnt "insufficient resources"
    292.                         jmp exit
    293.                 .endif
    294.                 ; Save in table
    295.                 mov ebx, hook_table_c
    296.                 mov dword ptr [hook_table+ebx*4], eax
    297.                 inc hook_table_c
    298.          
    299.                 ; Prepare buffer
    300.                 mov ebx, dword ptr [Hook_Jump+00h] ; code
    301.                 mov dword ptr [eax+00h], ebx       ; code
    302.                 mov ebx, dword ptr [Hook_Jump+04h] ; code
    303.                 mov dword ptr [eax+04h], ebx       ; code
    304.                 mov ebx, offset Hook_Parse         ; <call Hook_Parse>
    305.                 sub ebx, eax                       ; <call Hook_Parse>
    306.                 sub ebx, 5h                        ; <call Hook_Parse>
    307.                 mov dword ptr [eax+01h], ebx       ; <call Hook_Parse>
    308.                 mov ebx, function                  ; function ptr
    309.                 mov dword ptr [eax+18h], ebx       ; function ptr
    310.                 neg ebx                            ; prepare <call code>
    311.                 lea ecx, dword ptr [eax+ebx-05h]   ; prepare <call code>
    312.                 mov dword ptr [Hook_Jump+09h], ecx ; prepare <call code>
    313.                 push eax
    314.                 add eax, 8h                        ; old code buffer
    315.                 invoke WriteHook, function, \      ; write hook
    316.                        addr Hook_Jump + 8h, 5, eax ; write hook
    317.                 pop ebx                            ; size
    318.                 mov dword ptr [ebx+1ch], eax       ; size
    319.                 exit:
    320.                 ret
    321.         Hook_Install EndP
    322.  
    323.         Hook_RemoveAll proc  ; Public function
    324.                 pushad
    325.                         mov ecx, hook_table_c
    326.                         rm_loop:
    327.                                 cmp ecx, 0
    328.                                 jle exit
    329.                                 dec ecx
    330.                                 push ecx
    331.                                         mov  eax, dword ptr [hook_table+ecx*4]
    332.                                         lea  esi, dword ptr [eax+08h]          ; old code
    333.                                         mov  edi, dword ptr [eax+18h]          ; function ptr
    334.                                         mov  ebx, dword ptr [eax+1ch]          ; size
    335.                                         call Copy_It
    336.                                         ; Тут надо освободить память из eax
    337.                                 pop  ecx
    338.                         jmp rm_loop
    339.                         exit:
    340.                         mov hook_table_c, 0
    341.                 popad
    342.                 ret
    343.         Hook_RemoveAll EndP
    344.  
    345.         testcode proc              ; Перехватываемая функция
    346.                 local teste:DWORD
    347.                 mov eax, 10
    348.                 ret
    349.         testcode EndP
    350.  
    351.         Testme proc
    352.                 invoke Hook_Install, addr testcode ; Устанавливаем хук
    353.                 invoke testcode                    ; Вызываем перехваченную функцию
    354.                 invoke Hook_RemoveAll              ; Снимаем все хуки
    355.                 invoke testcode                    ; Проверяем снятие хуков
    356.                 ret
    357.         Testme EndP
    358. End Testme
     
    Последнее редактирование: 11 апр 2022