Самое интересное, что DriverEntry выполняется как бы без ошибок, да еще и адреса верные пишет/читает (проверил на wmvare+windbg). До моей загрушки my_nt_open_process не доходит, до OnUnload тоже. Код. Код (Text): format PE DLL native 4.0 at 10000h include 'WIN32A.INC' include 'TYPES.INC' include 'WINDEFS.INC' include 'DDK/IMPORT32.INC' include 'DDK/NTDEF_RZ.INC' include 'DDK/NTSTATUS_RZ.INC' include 'DDK/NTDDK_RZ.INC' include 'DDK/NTDDKK.INC' include 'PROCS32.INC' entry DriverEntry section '.text' code readable writeable executable notpageable xx db "%.8X",0 yy db "Unloaded",0 zz db "Called",0 old_nt_open_process dd ? cr0reg dd ? addrb dd ? proc OnUnload lpDriverObject cli mov eax, cr0 mov dword [cr0reg],eax and eax,0xFFFEFFFF mov cr0, eax mov eax, dword [old_nt_open_process] mov edx,dword [addrb] mov dword [edx],eax mov eax, dword [cr0reg] mov cr0, eax sti mov eax,STATUS_SUCCESS ret endp proc DriverEntry lpDriverObject, usRegistryPath mov eax, [lpDriverObject] lea edx, [OnUnload] mov [eax + V_DRIVER_OBJECT.DriverUnload], edx ;put callback mov eax,[ZwOpenProcess] mov ebx,dword[eax+1] ;ebx=number of NtOpenProcess in sdt mov eax,[KeServiceDescriptorTable] mov eax,[eax] lea edx,[eax+ebx*4] ;edx=addr of addr of NtOpenProcess in sdt mov eax,[edx] ;eax=addr of NtOpenProcess mov dword [old_nt_open_process],eax ;backup addr of NtOpenProcess cli mov eax, cr0 mov dword [cr0reg],eax and eax,0xFFFEFFFF mov cr0, eax mov dword [edx],my_nt_open_process mov eax, dword [cr0reg] mov cr0, eax sti mov dword [addrb],edx mov eax,STATUS_SUCCESS ret endp my_nt_open_process: ;int3 jmp [old_nt_open_process] section '.import' import data readable writeable notpageable library ntoskrnl,'ntoskrnl.exe' import ntoskrnl,DbgPrint,'DbgPrint',\ ZwOpenProcess,'ZwOpenProcess',\ NtOpenProcess,'NtOpenProcess',\ KeServiceDescriptorTable,'KeServiceDescriptorTable' section '.reloc' fixups data discardable notpageable
Cr4sh Сорри. Конкретно затупил. Как неделю назад когда сидя на висте думал что раньше Program files писалось слитно... Еще раз сорри (ибо для такого случая одног раза мало)
Great Пасиб. Я уже Cr4sh'а достал Но всеравно проверил на всякий пожарный. Надо же... ни разу без DeviceObject не пробовал (за исключением инжекта через overflow) ибо был уверен что выгрузится. float Фффу. Пока скачал WDK... установил VMWare... Вобщем на WinXP работает Код (Text): #include "stdafx.h" extern "C" { #include "D:\Development\Study\DriverDevelopment\Baal\Модули\KrnlUndcmt\KrnlUndcmt.h" } DWORD32 old_nt_open_process; DWORD32 cr0reg; DWORD32 addrb; void OnUnload(IN PDRIVER_OBJECT DriverObject) { _asm { cli; mov eax, cr0; mov dword ptr [cr0reg], eax; and eax,0xFFFEFFFF; mov cr0, eax; mov eax, dword ptr [old_nt_open_process]; mov edx,dword ptr[addrb]; mov dword ptr[edx],eax; mov eax, dword ptr[cr0reg]; mov cr0, eax; sti; } } _declspec(naked) void my_nt_open_process(void) { _asm { jmp dword ptr [old_nt_open_process]; } } NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { /* mov eax, [DriverObject]; lea edx, [OnUnload]; mov [eax->DriverUnload], edx; */ DriverObject->DriverUnload = OnUnload; _asm { mov eax, [ZwOpenProcess]; 804dd724 ZwOpenProcess{mov eax,7Ah} mov ebx,dword ptr[eax+1] ; 7Ah mov eax,[KeServiceDescriptorTable]; mov eax,[eax]; [eax+ebx*4] = f81f57b0 {sub esp,0Ch; push esi; push edi} lea edx,[eax+ebx*4]; 81a7a9d8 mov eax,[edx]; f81f57b0 mov dword ptr [old_nt_open_process],eax; cli mov eax, cr0 mov dword ptr [cr0reg],eax and eax,0xFFFEFFFF mov cr0, eax mov eax, my_nt_open_process; f9d14030 mov dword ptr[edx], eax; mov eax, dword ptr[cr0reg] mov cr0, eax sti } return STATUS_SUCCESS; } OnUnload выбрасывает ошибку. Не разбирался.
Спасибо за ответ, на WinXP у меня тоже норм, БСОД когда вызывается NtOpenProcess из любого процесса (например открываю диспетчер задач). Я вообще думаю, что природа этого бсода в win7 схожа с бсодом в XP, возможно кто-то сразу же после загрузки драйвера пытается вызвать эту функцию. Но странность в том, что int3 в моей заглушке не срабатывает почему-то.
Если делаете асм вставки, советую сохранять регистры которые изменяете, и потом восстанавливать. На будущее это. (в вашем случае - регистр edx). И вообще, будьте предельно аккуратны.
я это понял 5 минут назад, потрудившись простепать 2 команды после выхода из DriverEntry, и как раз собирался написать про это)) в общем всё понятно, всем спасибо за ответы, вопрос решен.