Перехват API

Тема в разделе "WASM.BEGINNERS", создана пользователем Cigan, 4 фев 2006.

  1. Cigan

    Cigan New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2003
    Сообщения:
    54
    Адрес:
    Моск.обл
    Есть одна игра в которой надо перехватить функцию WriteProcessMemory.

    Вообщем вопрос такого плана.Как это организовать на асме. А именно как получить правилный пид или хэндл kernel32.dll. Так как все мои попытки провалились решил спросить. Ногами просьа не пинать хотя этот вопрос подимался не раз во всех темах я для себя ответа не нашел
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Это, наверно, можно и прорще сделать, но всё-же:

    Напиши код, внедри его в Game.exe так, что-бы он при запуске Game.exe первым получал управление.

    При старте Game.exe твой код должен изменить в IAT адрес соответствующий WriteProcessMemory на адрес твоего обработчика.
     
  3. Ms Rem

    Ms Rem New Member

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

    Cigan New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2003
    Сообщения:
    54
    Адрес:
    Моск.обл


    Читал я статьи и далеко не тяжело дело втом что непонимаю я делфи если брать твои стать к примеру.
     
  5. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    не понимаешь - выучи
     
  6. asmasm

    asmasm New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    69
    Адрес:
    Uzbekistan
    Для начала внедри dll таким способом:



    start proc

    invoke GetPidProcess,<АДРЕСС СТРОКИ С DLL>

    .if eax!=0

    invoke CautchDll,eax,<имя dll из system32>,<размер>



    ret

    start endp



    CautchDll proc pPID:lol: WORD,pDllName:lol: WORD,szDllName:lol: WORD

    ;;;;;;;;;; возвращает (eax=0-удача), (еах=-1)-ошибка



    LOCAL hproc:lol: WORD

    LOCAL pmemory:lol: WORD

    LOCAL hthread:lol: WORD

    invoke OpenProcess,PROCESS_ALL_ACCESS,0,pPID ;открываем процесс

    mov hproc,eax

    .if eax==0

    or eax,-1

    jmp CautchDllError ;;; ecли ошибка, то выходим

    .endif

    invoke VirtualAllocEx,eax,0,szDllName,MEM_COMMIT,PAGE_EXECUTE

    mov pmemory,eax

    invoke WriteProcessMemory,hproc,eax,pDllName,szDllName,0 ;;;переписываем имя DLL

    invoke GetModuleHandle,SADD("kernel32.dll")

    invoke GetProcAddress,eax,SADD("LoadLibraryA")

    invoke CreateRemoteThread,hproc,0,0,eax,pmemory,NULL,NULL

    mov hthread,eax

    .if eax==0

    or eax,-1 ; если не получается создать поток,

    jmp CautchDllError ; то выходим

    invoke CloseHandle,hproc

    .endif

    invoke WaitForSingleObject,eax,-1



    invoke CloseHandle,hthread

    invoke CloseHandle,hproc

    xor eax,eax

    CautchDllError:



    ret

    CautchDll endp



    .data

    ansi db 16 dup(0)

    .code





    .data

    ansi db 16 dup(0)

    .code

    GetPidProcess proc nproc:lol: WORD

    LOCAL PID[12]:lol: WORD

    LOCAL lengthbuf:lol: WORD

    LOCAL buf:lol: WORD

    LOCAL leninfo:lol: WORD

    LOCAL num:lol: WORD

    mov num,0

    mov ecx,12

    mov eax,0

    lea edi,PID

    rep stosd



    invoke NtQuerySystemInformation,5,0,0,addr lengthbuf

    ;получаем размер буфера

    invoke GlobalAlloc,GMEM_ZEROINIT,lengthbuf

    invoke GlobalLock,eax

    mov buf,eax ;buf -адресс буфера



    invoke NtQuerySystemInformation,5,buf,lengthbuf,addr leninfo

    mov esi,buf ;esi- адресс буфера с записанно информацией



    l1:

    mov ebx,[esi+NextEntryDelta] ; смещение на следующую элемент

    .if ebx==0

    xor eax,eax

    jmp mend

    .endif



    mov eax,[esi+ProcessName] ;адресс unicode строки с именем

    invoke ConvertUnicode,eax,addr ansi;invoke lstrcmpW,eax, nproc

    invoke CharLower,addr ansi

    invoke lstrcmp,nproc,addr ansi

    .if eax!=0

    nextid:

    add esi,ebx ;если строки не равны, то прибавим

    add esi,4 ;NextEntryDelta

    invoke IsBadHugeReadPtr,esi,4

    .if eax==0

    sub esi,4

    jmp l1

    .endif

    xor eax,eax

    jmp mend

    .endif

    ;если еах=0, то Id найден



    mov eax,[esi+ProcessId]

    mend:

    ret



    GetPidProcess endp





    ConvertUnicode proc uses esi edi ubuf:lol: WORD,mansi:lol: WORD



    .if ubuf==0

    jmp short ex

    .endif

    mov esi,ubuf

    mov edi,mansi

    cu1:

    .if word ptr [esi]!=0

    mov ax,word ptr [esi]

    mov byte ptr [edi],al

    add esi,2

    inc edi

    jmp short cu1

    .endif

    mov byte ptr [edi],0

    ex:

    ret

    ConvertUnicode endp
     
  7. asmasm

    asmasm New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    69
    Адрес:
    Uzbekistan
    А в dllmain делаешь вот так:



    .data

    funcbytes db 7 dup(0)

    procaddr dd 0

    .code



    NewFunctionBytes proc

    mov eax,offset hook_WriteProcessMemory

    call eax

    ret

    NewFunctionBytes endp





    iexploreProc proc param1:lol: WORD ;процедура, выполняющаяся, если мы в iexplore.exe



    invoke GetModuleHandle,SADD("kernel32.dll")

    invoke GetProcAddress,eax,SADD("WriteProcessMemory")

    mov procaddr,eax



    invoke VirtualProtect,procaddr,7,PAGE_EXECUTE_READWRITE,addr trID



    @copystr procaddr,offset funcbytes,7 ;и заменяем 7 байт

    @copystr offset NewFunctionBytes,procaddr,7 ;API фнкции

    ret

    iexploreProc endp

    .data

    resi dd 0

    redi dd 0

    recx dd 0

    rebx dd 0



    .code

    hook_WriteProcessMemory proc



    mov resi,esi

    mov redi,edi ;сохраняем регистры

    mov recx,ecx

    mov rebx,ebx



    @copystr offset funcbytes,procaddr,7 ;восстанавливаем байты



    push ebp

    mov ebp,esp



    param1 equ dword ptr [ebp+0Ch]

    param2 equ dword ptr [ebp+10h]

    param3 equ dword ptr [ebp+14h]

    param4 equ dword ptr [ebp+18h]

    param5 equ dword ptr [ebp+1ch]





    <Здесь делаешь то,что ты хочешь>



    leave



    pop ebx

    pop ebx ;восстанавливаем стек и вызываем



    call procaddr ;перехватываему фукнцию

    push ebx ;помещаем в стек обратный адресс



    @copystr offset NewFunctionBytes,procaddr,7 ;снова изменяем байты

    mov esi,resi

    mov edi,redi

    mov ecx,recx ;восстанавливаем регистры

    mov ebx,rebx



    ret

    hook_WriteProcessMemory endp
     
  8. asmasm

    asmasm New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    69
    Адрес:
    Uzbekistan
    А в dllmain делаешь вот так:



    .data

    funcbytes db 7 dup(0)

    procaddr dd 0

    .code



    NewFunctionBytes proc

    mov eax,offset hook_WriteProcessMemory

    call eax

    ret

    NewFunctionBytes endp





    iexploreProc proc param1:lol: WORD ;процедура, выполняющаяся, если мы в iexplore.exe



    invoke GetModuleHandle,SADD("kernel32.dll")

    invoke GetProcAddress,eax,SADD("WriteProcessMemory")

    mov procaddr,eax



    invoke VirtualProtect,procaddr,7,PAGE_EXECUTE_READWRITE,addr trID



    @copystr procaddr,offset funcbytes,7 ;и заменяем 7 байт

    @copystr offset NewFunctionBytes,procaddr,7 ;API фнкции

    ret

    iexploreProc endp

    .data

    resi dd 0

    redi dd 0

    recx dd 0

    rebx dd 0



    .code

    hook_WriteProcessMemory proc



    mov resi,esi

    mov redi,edi ;сохраняем регистры

    mov recx,ecx

    mov rebx,ebx



    @copystr offset funcbytes,procaddr,7 ;восстанавливаем байты



    push ebp

    mov ebp,esp



    param1 equ dword ptr [ebp+0Ch]

    param2 equ dword ptr [ebp+10h]

    param3 equ dword ptr [ebp+14h]

    param4 equ dword ptr [ebp+18h]

    param5 equ dword ptr [ebp+1ch]





    <Здесь делаешь то,что ты хочешь>



    leave



    pop ebx

    pop ebx ;восстанавливаем стек и вызываем



    call procaddr ;перехватываему фукнцию

    push ebx ;помещаем в стек обратный адресс



    @copystr offset NewFunctionBytes,procaddr,7 ;снова изменяем байты

    mov esi,resi

    mov edi,redi

    mov ecx,recx ;восстанавливаем регистры

    mov ebx,rebx



    ret

    hook_WriteProcessMemory endp
     
  9. asmasm

    asmasm New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    69
    Адрес:
    Uzbekistan
    Извинюсь за повтор, коннект страшно тормозит.



    Ну подправь там маленько код и все будет работать,

    Если хочешь снизу dll, можешь скачать, которая импортирует

    CautchDll и GetPidProcess (имя процесса в UNICODE передавай)



    CautchDll PROTO :lol: WORD,:lol: WORD,:lol: WORD

    ;внедряет dll в процесс

    ;1-PID процесса

    ;2-указатель на имя dll

    ;3-размер имени dll



    GetPidProcess PROTO:lol: WORD

    ;получение PID процесса по имени

    ;1-указатель на имя процесса (UNICODE)





    [​IMG] _1358421148__Cautch&Pid.dll
     
  10. asmasm

    asmasm New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    69
    Адрес:
    Uzbekistan
    И не забудь подправить в функции GetPidProcess:

    MAX_PROCESS_NAME_LENGTH equ <сколько надо>

    ansi db MAX_PROCESS_NAME_LENGTH dup(0)

    LOCAL PID[MAX_PROCESS_NAME_LENGTH]:WORD
     
  11. Cigan

    Cigan New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2003
    Сообщения:
    54
    Адрес:
    Моск.обл
    Большое спасибо буду разбираться
     
  12. Cigan

    Cigan New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2003
    Сообщения:
    54
    Адрес:
    Моск.обл
    Провозившись долго я так и не смог понять как объявит структуры SYSTEM_PROCESSES если не сложно то объясните как ее объявитьт чтобы можно использовать ProcessId,ProcessName,NextEntryDelta
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1. CLIENT_ID STRUCT
    2.     UniqueProcess               dd    ?
    3.     UniqueThread                dd    ?
    4. CLIENT_ID ENDS
    5.  
    6. SYSTEM_THREADS struct
    7.     KernelTime                  LARGE_INTEGER   <>
    8.     UserTime                    LARGE_INTEGER   <>
    9.     CreateTime                  LARGE_INTEGER   <>
    10.     WaitTime                    dd  ?          
    11.     StartAddress                dd  ?
    12.     ClientId                    CLIENT_ID       <>
    13.     Priority                    SDWORD   ?
    14.     BasePriority                SDWORD   ?
    15.     ContextSwitchCount          dd  ?
    16.     State                       dd  ?
    17.     WaitReason                  dd  ?
    18. SYSTEM_THREADS  ends
    19.  
    20. VM_COUNTERS STRUCT
    21.     PeakVirtualSize             DWORD    ?
    22.     VirtualSize                 DWORD    ?
    23.     PageFaultCount              DWORD    ?
    24.     PeakWorkingSetSize          DWORD    ?
    25.     WorkingSetSize              DWORD    ?
    26.     QuotaPeakPagedPoolUsage     DWORD    ?
    27.     QuotaPagedPoolUsage         DWORD    ?
    28.     QuotaPeakNonPagedPoolUsage  DWORD    ?
    29.     QuotaNonPagedPoolUsage      DWORD    ?
    30.     PagefileUsage               DWORD    ?
    31.     PeakPagefileUsage           DWORD    ?
    32. VM_COUNTERS ENDS
    33.  
    34. SYSTEM_PROCESSES struct
    35.     NextEntryDelta              dd  ?
    36.     ThreadCount                 dd  ?
    37.     Reserved1                   dd  6 dup (?)
    38.     CreateTime                  LARGE_INTEGER  <>
    39.     UserTime                    LARGE_INTEGER  <>
    40.     KernelTime                  LARGE_INTEGER  <>
    41.     ProcessName                 UNICODE_STRING  <>
    42.     BasePriority                SDWORD   ?  
    43.     ProcessId                   dd  ?
    44.     InheritedFromProcessId      dd  ?
    45.     HandleCount                 dd  ?
    46.     Reserved2                   dd  2 dup (?)
    47.     VmCounters                  VM_COUNTERS <>
    48. ;IO_COUNTERS IoCounters; // Windows 2000 only
    49.     Threads                     SYSTEM_THREADS  <>
    50. SYSTEM_PROCESSES ends
     
  14. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Серавно одни каракулы.
    Код (Text):
    1.      local cb:dword
    2.        invoke NtQuerySystemInformation,5,0,0,addr cb
    3.        invoke GlobalAlloc,0h or 40h,cb
    4.        mov esi,eax
    5.        assume esi:ptr SYSTEM_PROCESSES
    6.        invoke NtQuerySystemInformation,5,esi,cb,0
    7.         test eax,eax
    8.         jnz _exit
    9.     @@:
    10.        invoke MessageBoxW,0,addr [esi].ProcessName,addr [esi].ProcessName,0
    11.  
    12.        mov ebx,[esi].NextEntryDelta
    13.        add esi,ebx
    14.        cmp ebx,0
    15.        jnz @B
    16.        assume esi:nothing
    17. _exit:ret
    18.  
     
  15. YuraseK

    YuraseK New Member

    Публикаций:
    0
    Регистрация:
    25 сен 2004
    Сообщения:
    13
    Адрес:
    Republic of Belarus
    {удалено}
     
  16. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Вообще-то UNICODE_STRING - это структура, а не указатель на юникод-строку.
     
  17. Flasher

    Flasher Member

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

    И раньще пробовал юзать RtlUnicodeStringToAnsiString, серавно каракулы показывало.

    А щас поставил, и на те, работает :)

    cresta, опять колдавством балуешся ? :))
     
  18. Cigan

    Cigan New Member

    Публикаций:
    0
    Регистрация:
    13 окт 2003
    Сообщения:
    54
    Адрес:
    Моск.обл