Написал след. простейший драйвер (см. код). Падает на DbgPrint (это я о том что если убрать оттуда DbgPrint, или поставить его _ДО_ вызова оригинального CreateProcess то все ок. Код (Text): #include <ntddk.h> typedef unsigned long DWORD; typedef unsigned short WORD; typedef unsigned char BYTE; typedef struct _SYSTEM_SERVICE_TABLE{ DWORD *ServiceTable; DWORD *CounterTable; DWORD ServiceLimit; BYTE *ArgumentTable; }SYSTEM_SERVICE_TABLE; typedef struct _SERVICE_DESCRIPTOR_TABLE{ SYSTEM_SERVICE_TABLE ntoskrnl; SYSTEM_SERVICE_TABLE win32k; SYSTEM_SERVICE_TABLE unused1; SYSTEM_SERVICE_TABLE unused2; }SERVICE_DESCRIPTOR_TABLE; #define pSDT(fnNumber) KeServiceDescriptorTable->ntoskrnl.ServiceTable[fnNumber] #define intOff __asm cli #define intOn __asm sti typedef NTSTATUS (*pNtCreateProcess)(DWORD ProcessDWORD,DWORD DesiredAccess,DWORD ObjectAttributes,DWORD InheritFromProcessDWORD,DWORD InheritDWORDs,DWORD SectionDWORD,DWORD DebugPort,DWORD ExceptionPort); extern SERVICE_DESCRIPTOR_TABLE *KeServiceDescriptorTable; extern WORD *NtBuildNumber; DWORD idNtCreateProcess=0x7a; pNtCreateProcess origNtCreateProcess; NTSTATUS newNtCreateProcess(DWORD ProcessDWORD,DWORD DesiredAccess,DWORD ObjectAttributes,DWORD InheritFromProcessDWORD,DWORD InheritDWORDs,DWORD SectionDWORD,DWORD DebugPort,DWORD ExceptionPort){ DWORD dwStatus; dwStatus=origNtCreateProcess(ProcessDWORD,DesiredAccess,ObjectAttributes,InheritFromProcessDWORD,InheritDWORDs,SectionDWORD,DebugPort,ExceptionPort); DbgPrint("Process started"); return dwStatus; } NTSTATUS DriverUnload(IN PDRIVER_OBJECT DriverObject){ intOff; pSDT(idNtCreateProcess)=(DWORD)origNtCreateProcess; intOn; DbgPrint("Stoped"); return STATUS_SUCCESS; } NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){ origNtCreateProcess=(pNtCreateProcess)pSDT(idNtCreateProcess); intOff; pSDT(idNtCreateProcess)=(DWORD)newNtCreateProcess; intOn; DbgPrint("Started"); DriverObject->DriverUnload=DriverUnload; return STATUS_SUCCESS; }
Походу 0x7a это OpenProcess Сори, бывает... Это все потому что прошил, надо с ntdll.dll брать dword после 0xb8 и дело в шляпе...