Приветствую всех! Я меня прблема, написал драйвер перехватчик из статьи, но на асме. Работает нормально, но не передаётся управление на мою перехватчик-функцию. Ниже привожу кусок кода из моего драйвера, где я думаю возможно ошибка. Код (Text): .data true_addr dd 0 dbg_mes_sethk db "set hook",0 dbg_mes_fromhook db "from hookproc",0 dbg_mes_delhk db "del hook",0 DriverEntry proc local CR0Reg:dword ... ... ... ; Set Hook mov eax,CR0 mov CR0Reg,eax and eax,0FFFEFFFFh mov CR0,eax mov edx,KeServiceDescriptorTable mov eax,dword ptr [edx] ; ntoskrnl.ServiceTable mov ecx,dword ptr [eax+(7ah*4h)] ; true_addr = mov true_addr,ecx ; = KeServiceDescriptorTable-> ; ->ntoskrnl.ServiceTable[7Ah] mov ecx,offset hookprocapi ; KeServiceDescriptorTable-> mov dword ptr [eax+(7ah*4h)],ecx ; ->ntoskrnl.ServiceTable[7Ah] = ; = hookprocapi mov eax,CR0Reg mov CR0,eax invoke DbgPrint, addr dbg_mes_sethk ... ... DriverEntry endp ;****** Функция-перехватчик****** hookprocapi proc invoke DbgPrint, addr dbg_mes_fromhook jmp dword ptr [true_addr] ret hookprocapi endp ;********************** DriverUnload proc local CR0Reg:dword ; del Hook mov eax,CR0 mov CR0Reg,eax and eax,0FFFEFFFFh mov CR0,eax mov edx,KeServiceDescriptorTable mov edx,dword ptr [edx] mov ecx,true_addr mov dword ptr [edx+(7ah*4h)],ecx mov eax,CR0Reg mov CR0,eax invoke DbgPrint, addr dbg_mes_delhk ... ... ... ret DriverUnload endp Так вот, проблема в том, что на hookprocapi вызов не приходит. Если кто-нибудь знает причину (или хотя бы догадывается) прошу написать. Заранее спасибо.
Хочу сделать небольшое пояснение. Если перехват писать на C, то получаться следующие структуры: typedef struct _SYSTEM_SERVICE_TABLE { PNTPROC ServiceTable; PDWORD CounterTable; ULONG ServiceLimit; PBYTE ArgumentTable; } typedef struct _SERVICE_DESCRIPTOR_TABLE { SYSTEM_SERVICE_TABLE ntoskrnl; //SST для ntoskrnl.exe SYSTEM_SERVICE_TABLE win32k; //SST для win32k.sys SYSTEM_SERVICE_TABLE unused1; //не используется SYSTEM_SERVICE_TABLE unused2; //не используется } На SERVICE_DESCRIPTOR_TABLE указывает экспортируемая переменная KeServiceDescriptorTable. Но по строению этих структур можно увидеть, что KeServiceDescriptorTable вроде как указывает прямо на SERVICE_DESCRIPTOR_TABLE.ntoskrnl.ServiceTable в котором находится указатель на массив указателей ф-ций ядра. Т.е. если писать на асме : получаем в eax указатель на массив указатель ф-ций mov edx,KeServiceDescriptorTable mov eax,dword ptr [edx] Затем ,к примеру, берём адрес NtOpenProcess из этого массива (NtOpenProcess в WinXp - 7Ah) mov ecx,dword ptr [eax+(7ah*4h)] mov true_addr,ecx ; сохраняем его Затем заменяем адрес NtOpenProcess на адрес своей ф-ции mov ecx,offset hookprocapi mov dword ptr [eax+(7ah*4h)],ecx Вроде как всё сделано правильно, а на свою ф-цию hookprocapi вызов не приходит, и NtOpenProcess нормально исполняется. Но самое интересное, что даже BSOD не вылетает. Поэтому, если кто знает в чем ошибочка большая просьба написать. Заранее спасибо.