Снятие перхвата

Тема в разделе "WASM.WIN32", создана пользователем FakeMan, 2 июн 2008.

  1. FakeMan

    FakeMan New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    17
    Доброго времени суток
    Вот столкнулся с такой проблемой.
    Допустим есть софтина, которая сплайсит вызовы некоторых ф-й ntdll.
    Как снять эти перехваты в своем процессе?
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    считать оригинальный код из файла на диске
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    nobodyzzz
    Это не всегда поможет, надо точно знать способ перехвата.
     
  4. FakeMan

    FakeMan New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    17
    Короче я копирую оригинальную либу в темп, открываю на чтение
    С чем сравнивать то? (с образом на который указывает GetModuleHandle)
    Какие моменты нужно учитывать?
     
  5. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    это ещё зачем?

    просто перебирай каждую ф-ию в экспорте и сравнивай первые, скажем, 10 байт начала с той, что в уже подгруженой ntdll
    и ещё желательно сравнить сами таблицы экспорта модулей, т.к. некоторые проактивные защиты таким образам без спайса хуки ставят.
     
  6. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    В разделе статей есть несколько тем по тематике.
    Вот код выдранный из одного этих статей:
    Код (Text):
    1. RemoveZwWriteVirtualMemoryHook proc
    2.     LOCAL lpBase:DWORD
    3.     LOCAL lpFunc:DWORD
    4.     LOCAL dwRVA:DWORD
    5.     LOCAL hFile:DWORD
    6.     LOCAL dwSize:DWORD
    7.     LOCAL hMapFile:DWORD
    8.     LOCAL lpBaseMap:DWORD
    9.     LOCAL lpRealFunc:DWORD
    10.     LOCAL dwOldProtect:DWORD
    11.    
    12. .data
    13.         szDllPath db "C:\WINDOWS\System32\ntdll.dll",0
    14.           szFuncName db "ZwWriteVirtualMemory",0
    15. .code
    16.  
    17.     invoke LoadLibrary, addr szDllPath
    18.     test eax, eax
    19.     jz @ret
    20.     mov lpBase, eax
    21.    
    22.     invoke GetProcAddress, lpBase, addr szFuncName
    23.     test eax,eax
    24.     jz @ret
    25.    
    26.     mov lpFunc, eax
    27.    
    28.     sub eax, lpBase
    29.     mov dwRVA, eax
    30.  
    31.     invoke CreateFile, addr szDllPath,GENERIC_READ, FILE_SHARE_READ,
    32.                             NULL,3,FILE_ATTRIBUTE_NORMAL, NULL
    33.     inc eax
    34.     jz @ret
    35.     dec eax
    36.    
    37.     mov hFile, eax
    38.  
    39.     invoke GetFileSize,hFile, NULL
    40.     mov dwSize, eax
    41.    
    42.     invoke CreateFileMapping, hFile, NULL, PAGE_READONLY or 1000000h, 0, dwSize, NULL
    43.     mov hMapFile, eax
    44.    
    45.     invoke MapViewOfFile, hMapFile, 4h, 0, 0, dwSize
    46.     mov lpBaseMap, eax
    47.    
    48.     add eax, dwRVA
    49.     mov lpRealFunc, eax
    50.  
    51.     invoke VirtualProtect, lpFunc, 10, PAGE_EXECUTE_READWRITE, addr dwOldProtect
    52.    
    53.     cld
    54.     mov esi, lpRealFunc
    55.     mov edi, lpFunc
    56.     mov ecx, 10
    57.     rep movsb
    58.    
    59.     invoke UnmapViewOfFile, lpBaseMap
    60.  
    61.     invoke CloseHandle, hMapFile
    62.     invoke CloseHandle, hFile
    63.    
    64. @ret:
    65.     ret
    66. RemoveZwWriteVirtualMemoryHook endp
     
  7. FakeMan

    FakeMan New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    17
    Огромное спасибо. Осталось только перевести на Delphi :)
     
  8. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    и нифига не спасибо, ибо бесполезно.
    это раз.

    тут надо брать адрес функции, отнимать от него базу, получая RVA,
    открывать, верно, либу для чтения, чухать по полученному адресу,
    и тупо сравнивать дворды лежащие в файле и в либе.

    предварительно, естественно(если код свой,
    и есть опасения в сторону iat-hook'a), сравнив
    адрес загруженной либы с получаемым от GetProcAddr.

    > Огромное спасибо. Осталось только перевести на Delphi :)
    а если такой код перевести на делфи составляет трабл,
    то это надо было в бегиннерс писать.