Перехват АПИ в себе. MASM32.

Тема в разделе "WASM.ASSEMBLER", создана пользователем xenomorph, 26 дек 2005.

  1. xenomorph

    xenomorph New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    16
    Адрес:
    Это не важно, на сегодня у мен
    Привет всем!



    (просьба ногами не пинать - я начинающий :))



    Пытаюсь написать программу перехватывающую в себе

    вызов WinExec.



    Читаю статью:

    http://www.wasm.ru/article.php?article=apihook_2



    (огромное спасибо автору!)



    Код:

    ;=================================

    .586

    .model flat,stdcall

    option casemap:none

    include GenIncs.inc

    include Macro.inc

    .data

    sz_PL db "cmd",0

    dd_MainMH dd 0

    dd_AWinExecute dd 0

    dd_OriginalWinExecute dd 0

    dd_BytesWritten dd 0

    .code

    start:

    invoke WinExec, ADDR sz_PL, 1

    invoke GetCurrentProcess

    mov dd_MainMH, eax

    ;Получили хєндл основного приложения:

    ;PrintDec dd_MainMH

    invoke GetModuleHandle, SADD("kernel32.dll")

    invoke GetProcAddress, eax, SADD("WinExec")

    ;Получили Адресс процедуры WinExec:

    ;PrintDec eax

    ;Сохраняем старое начало функции

    invoke ReadProcessMemory, dd_MainMH, dd_AWinExecute, dd_OriginalWinExecute, ???, dd_BytesWritten

    (тут ещё писать и писать ... :-()

    invoke ExitProcess, 0

    ret

    end start

    ;=================================



    Оригинал:

    //=================================

    Procedure SetHook;

    var

    HKernel32, HUser32: dword;

    begin

    CurrProc := GetCurrentProcess;

    //получение адреса CreateProcessA

    AdrCreateProcessA := GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateProcessA');

    //инициализация структуры перехвата CreateProcessA

    JmpCrProcA.PuhsOp := $68;

    JmpCrProcA.PushArg := @NewCreateProcessA;

    JmpCrProcA.RetOp := $C3;

    //сохраняем старое начало функции

    ReadProcessMemory(CurrProc, AdrCreateProcessA, @OldCrp, SizeOf(OldCode), bw);

    //записываем новое начало CreateProcessA

    WriteProcessMemory(CurrProc, AdrCreateProcessA, @JmpCrProcA, SizeOf(far_jmp), Writen);

    end;

    //=================================

    Как сделать аналог OldCode?

    Это структура задана как:



    type

    fr_jmp = packed record

    PuhsOp: byte;

    PushArg: pointer;

    RetOp: byte;

    end;



    OldCode = packed record

    One: dword;

    two: word;

    end;



    Как такое на МАЗМ32 сделать?

    Помогите пожалуйста!

    --

    Огромное спасибо заранее!
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Вот пример установки хуков путем сплайснга с дизассемблером длин. Правда там синтаксис фасма, но авось чем-нибудь поможет.


    Код (Text):
    1. HookCode:  ; fnAddr, NewAddr
    2.   push    ebp
    3.   mov     ebp, esp
    4.   sub     esp, 10h
    5.   push    esi
    6.   push    ebx
    7.   lea     eax, [ebp-4]
    8.   mov     dword [eax], 0
    9.   lea     ebx, [ebp-8]
    10.   mov     dword [ebx], 20
    11.   invokex ZwAllocateVirtualMemory, -1, eax, 0, ebx, MEM_COMMIT + MEM_RESERVE, PAGE_EXECUTE_READWRITE
    12.   test    eax, eax
    13.   jnz     @F
    14.   push    edi
    15.   mov     edi, [ebp-4]
    16.   mov     esi, [ebp+8]
    17.   lea     ebx, [edi+5]
    18.   mov     edx, esi
    19.   sub     edx, edi
    20.   sub     edx, 5
    21. hCopy:
    22.   push    esi
    23.   call    SizeOfOpcode
    24.   mov     ecx, eax
    25.   rep movsb
    26.   cmp     edi, ebx
    27.   jna     hCopy
    28.   mov     byte  [edi], 0E9h
    29.   mov     dword [edi+1], edx
    30.   pop     edi
    31.   lea     eax, [ebp-10h]
    32.   mov     ebx, [ebp+8]
    33.   mov     [eax], ebx
    34.   lea     ebx, [ebp-8]
    35.   lea     ecx, [ebp-0Ch]
    36.   invokex ZwProtectVirtualMemory, -1, eax, ebx, PAGE_EXECUTE_READWRITE, ecx
    37.   test    eax, eax
    38.   jnz     @F
    39.   mov     ecx, [ebp+8]
    40.   mov     edx, [ebp+0Ch]
    41.   sub     edx, ecx
    42.   sub     edx, 5
    43.   mov     byte [ecx], 0E9h
    44.   mov     dword [ecx+1], edx
    45.   mov     eax, [ebp-4]
    46. @@:
    47.   pop     ebx
    48.   pop     esi
    49.   leave
    50.   retn    8
    51.  
    52.  
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
  4. xenomorph

    xenomorph New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    16
    Адрес:
    Это не важно, на сегодня у мен
    2 MS Rem - Ваши статьи рулят!

    2 Flasher - Огромное спасибо!

    Буду копать и разбираться!
     
  5. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    http://www.wasm.ru/src/6/oapihook.zip



    Own API Hooker by comrade

    MASM | 6.42 kb

    Программа перехватывает сама в себе API-функцию MessageBoxIndirectA

    Комментариев: 0



    (http://www.wasm.ru/srclist.php?list=6)
     
  6. DeHunter

    DeHunter New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    80
    Адрес:
    Ukraine/Kiev
    Насколько я знаю масм32 вставляет переходники на функции.

    Ну типа когда вы делаете invoke MessageBoxA, 0, addr buff, addr buff, 0

    Реально управление передаётся на код следушего содержания

    jmp RealMessageBoxA. Тоесть если подредактировать данные переходники то можно будет хукать функции в себе. Посмотрите под олли дебагером по какому адресу лежат даные переходники и пишите туда.