пишу драйверок, в котром хукаю пару функций. так вот хукаю так: cli; mov eax, cr0; and eax, 0xFFFEFFFF; mov cr0, eax; Дизассемблирую код и заменяю первые иснрукции на JMP на мой враппер. mov eax, cr0; or eax, 0x00010000; mov cr0, eax; sti; Сама проблема: под 2к все пашет, ф-ции хукаются и никаких траблов. А вот под XP синий BSOD, естествено валится в том месте где я меняю код (JMP вставляю). ДЕТАЛИ: Система не многопроцессорная, проц без гиперсрединга. Прежде чем вставить JMP я дезассемблирую код. Дизассемблер тоже проверенный, правда под ЮзерМодом, да и в ядре под 2к ведь все работает. В чем ньюансы? Спецы откликнетесь...
Врядли это как-то прояснит ситацию... Вот что пишет: DRIVER_IRQL_NOT_LESS_OR_EQUAL далее "если это в первый раз, то... БЛА-БЛА-БЛА..." и Technical information: *** STOP: 0x000000D1 (0x804DCFA8,0x000000FF,0x00000001,0xF88C43DA) далее тычет на мой драйверок и т.д.
>> если находится в подкачиваемой памяти, то что делать? как ее обратно вернуть? может я неправильно представляю как это работает, но вроде как будет достаточно убрать cli/sti (т.е. не отрубать прерывания) тогда если страница будет находится в фацле подкачки, система сама её оттуда вернёт) хотя, хз, это вроде тоже не есть гуд, т.к. операция по установке хука должна быть неразрывной
Не помогло... По КрэшДампу шапка стека такая: KeBugCheckEx MmAccessFault KiTrap0E тут вызывается попытка записи...
Ставь бряк на место изменения кода. Дальше В WinDbg: !pte <адрес_перехватываемой_функции> В SoftIce тоже типа того что-то. И результаты в студию на обсуждение
вот что выдало в WinDbg с открытым КрэшДампом: !pte ZwCreateFile VA 7c90d682 PDE at C03007C8 PTE at C01F2434 contains 00449067 contains 02DAE025 pfn 449 ---DA--UWEV pfn 2dae ----A--UREV с СофтАйсом сча попытаюсь в реалтайме...
я в непонятках... после установки СофтАйса ПЕРЕСТАЛО ПАДАТЬ... сам код я не менял. поди пойми что было...
Да не руткит это и не троян, а наоборот могет служить средством выявления таких зверей... Но тем не менее вопросс остается открытым! Я это все тещу на виртуалке VMware 5.5, OS Windows XP Prof. Version 2002 SP2. Вот восстановил снапшот без айса -- падает! Поставил айс -- не падает! На 2к -- не падает... Я в ауте... Мот кто-нидь с таким встречался????
0x804DCFA8 - адрес функции, которую хукаешь? Запости краш-дамп от !analyze -v Кстати только что заметил: !pte ZwCreateFile VA 7c90d682 <----- это адрес из ntdll.dll, а не из ядра
вот: kd> !analyze -v ******************************************************************************* * * * Bugcheck Analysis * * * ******************************************************************************* ATTEMPTED_WRITE_TO_READONLY_MEMORY (be) An attempt was made to write to readonly memory. The guilty driver is on the stack trace (and is typically the current instruction pointer). When possible, the guilty driver's name (Unicode string) is printed on the bugcheck screen and saved in KiBugCheckDriver. Arguments: Arg1: 804dcfa8, Virtual address for the attempted write. Arg2: 004dc121, PTE contents. Arg3: f9085b60, (reserved) Arg4: 0000000b, (reserved) Debugging Details: ------------------ DEFAULT_BUCKET_ID: DRIVER_FAULT BUGCHECK_STR: 0xBE LAST_CONTROL_TRANSFER: from f8938aa9 to f8938346 TRAP_FRAME: f9085b60 -- (.trap fffffffff9085b60) ErrCode = 00000003 eax=804dcfa8 ebx=81224178 ecx=000000b8 edx=80010031 esi=ffb15348 edi=811bb230 eip=f8938346 esp=f9085bd4 ebp=f9085bec iopl=0 nv up ei pl nz na pe nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010202 hooknt!hook_all+0x2c: f8938346 8808 mov [eax],cl ds:0023:804dcfa8=b8 Resetting default scope STACK_TEXT: f9085bec f8938aa9 00222409 0000000e 00000000 hooknt!hook_all+0x2c [D:\Work\KrnlHook\hooknt\hookfunc.c @ 146] f9085c34 804e3d77 8121f030 81224178 806ee2d0 hooknt!DriverDispatch+0x130 [D:\Work\KrnlHook\hooknt\hooknt.c @ 147] f9085c44 8056a9ab 812241e8 8121cd50 81224178 nt!IopfCallDriver+0x31 f9085c58 8057d9f7 8121f030 81224178 8121cd50 nt!IopSynchronousServiceTail+0x60 f9085d00 8057fbfa 000007bc 00000000 00000000 nt!IopXxxControlFile+0x611 f9085d34 804df06b 000007bc 00000000 00000000 nt!NtDeviceIoControlFile+0x2a f9085d34 7c90eb94 000007bc 00000000 00000000 nt!KiFastCallEntry+0xf8 0012fcb8 7c90d8ef 7c801671 000007bc 00000000 ntdll!KiFastSystemCallRet 0012fcbc 7c801671 000007bc 00000000 00000000 ntdll!ZwDeviceIoControlFile+0xc 0012fd1c 00402b5d 000007bc 00222409 00000000 kernel32!DeviceIoControl+0xdd WARNING: Stack unwind information not available. Following frames may be wrong. 00000000 00000000 00000000 00000000 00000000 HookRun+0x2b5d FOLLOWUP_IP: hooknt!hook_all+2c [D:\Work\KrnlHook\hooknt\hookfunc.c @ 146] f8938346 8808 mov [eax],cl SYMBOL_STACK_INDEX: 0 FOLLOWUP_NAME: MachineOwner SYMBOL_NAME: hooknt!hook_all+2c MODULE_NAME: hooknt IMAGE_NAME: hooknt.sys DEBUG_FLR_IMAGE_TIMESTAMP: 4575333a STACK_COMMAND: .trap fffffffff9085b60 ; kb FAILURE_BUCKET_ID: 0xBE_hooknt!hook_all+2c BUCKET_ID: 0xBE_hooknt!hook_all+2c Followup: MachineOwner --------- ну тут все что и раньше... Сча я сделал тестовый драйверок, вот код на котором падает: ULONG CR0Reg; __asm cli; //добавление или удаление этой комманды на BSOD не влияет __asm mov eax, cr0; __asm mov CR0Reg, eax; __asm and eax, 0xFFFEFFFF; __asm mov cr0, eax; { char c; PCHAR buf0 = (PCHAR)ZwCreateFile; c = buf0[0]; buf0[0] = c; // ПАДАЕТ НА ЭТОЙ КОММАНДЕ } __asm mov eax, CR0Reg; __asm mov cr0, eax; __asm sti; //добавление или удаление этой комманды на BSOD не влияет КАК ВЕРНУТЬ СТРАНИЦУ ИЗ ПОДКАЧКИ?????