Hook функций в драйвере не из SDT Всем привет Помогите пожалуйста с хуками в дровах. В принципе нужно только RtlClearBits обработать и скорее всего в системном потоке. Заранее спасибо
Очень примерно, но это будет так(один из вариантов). У меня так куча хуков, но чуть по-сложнее. За какие-то ошибки не ругать-писал принцип. .. myaddr offset hookfunction myaddr_j dw 025FFh myaddr_r dd offset myaddr mydump_1 dw ? mydump_2 dd ? ... .code ... lea esi,RtlClearBits@12 mov eax,dword ptr [esi] cmp eax,signature_4b jnz exit_bad movzx ax,word ptr [esi+4] cmp ax,signature_2b jnz exit_bad ;it's Ok mov ebx,esi mov edi,offset mydump_1 mov ecx,6 cld rep movsb mov edi,ebx mov esi,offset myaddr_j mov ecx,6 rep movsb .. .. .. hookfunction proc pushfd pusha ..... popa popfd jmp [mydump_2] hookfunction endp
VOOrDOOluck, дизасмни DebugView от sysinternals.com, да посмотри. Там хучится DbgPrint и, небось, всё грамотно сделано.
Four-F Всего то и делов.Рановато для меня такое.Я себе больше проблем создам.Насчет грамотности не сомневаюся (filemon & regmon это просто офигенее). Тут нашел пример хука (from rootkit)на asm/с.Принцип как и везде (jmp)но даже для меня далекого от asm вполне понятно и очень удобно. Всем спасибо за внимание _850265505__hook_example.c
Нужно ещё добавить рамапинг, ибо точка входа хукаемой функции запросто может находится на read-only памяти. Код (Text): VOID RemapDbgPrint( VOID ) { PMDL pMdl; pMdl = MmCreateMdl( NULL, g_pfnDbgPrint, PAGE_SIZE ); MmBuildMdlForNonPagedPool( pMdl ); g_pfnDbgPrint = MmMapLockedPages( pMdl, KernelMode ); } call RemapDbgPrint mov ecx, pfnDbgPrint mov word ptr [ecx], 25FFh mov dword ptr [ecx+2], offset DbgPrintHook
Four-F g_pfnDbgPrint- это указатель на функцию? Пару вопросов Как правильно хучить DbgPrint.Я на скорую руку попробовал но там фигня выходила из за параметров (LPCSTR ddd,...) Как это троеточие правильно обработать И еще.В примерах хуков (через длл) для хука функции из длл нужно делать подмену для получения результата в конкретном просеце или во всех.Почему из драйверов один хук контролирует все процесы.Ведь сам хук ставится в system контексте то какое отношение к нему имеют другие просецы, функции которых вызываются не из контекста system.
[ VOOrDOOluck: <font color="indigo]Как правильно хучить DbgPrint.Я на скорую руку попробовал но там фигня выходила из за параметров (LPCSTR ddd,...)</font><!--color--> ] Наверное, также как это делает DbgPrint, wsprintf и т.п. - парсить форматную строку и считать '%'. Сколько этих плюшек, столько и параметров после LPCSTR. А можно заглянуть за вызов DbgPrint и посмотреть сколько DWORD'ов со стека убирается. [ VOOrDOOluck: <font color="indigo]И еще.В примерах хуков (через длл) для хука функции из длл нужно делать подмену для получения результата в конкретном просеце или во всех.</font><!--color--> ] Это я не очень понял. [ VOOrDOOluck: <font color="indigo]Почему из драйверов один хук контролирует все процесы.Ведь сам хук ставится в system контексте то какое отношение к нему имеют другие просецы, функции которых вызываются не из контекста system.</font><!--color--> ] Если хукаются функции ядра, то в каком контексте ставится хук не имеет никакого значения. Ядерное пространство оно одно, т.е. глобально.
[ VOOrDOOluck: <font color="indigo]g_pfnDbgPrint- это указатель на функцию?</font><!--color--> ] Забыл ответить. Да, конечно. На сайте лежат исходники RegMon. Там должен быть файлик regsrc\lib\reglib.c - позыркай.
Four-F насчет первого(параметров)спасибо, понял. насчет второго.Третий вопрос все решил. насчеит третьего.Возьмем на заметку. СПАСИБО