阅读:2764回复:4
检测SSDT HOOK 的几个小疑问
我看了<ROOTKITS: Subverting the windows kernel> 里面有说到检测SSDT的方法:思路---->> NtQuerySystemInformation传递11号,得到系统加载的模块信息.从中找到ntoskrnl.exe的起始地址和大小.然后遍历SSDT表,如果其中的地址不在前面所查明的范围内,则表明被HOOK了.
由于我的程序里面只有特定的几个简单的SSDT HOOK,比如:NtCreateFile。我现在想实现这个功能,驱动先检查NtCreateFile这个函数有没有被HOOK,如果已经被其他程序HOOK了,我就提示用户不能再进行HOOK,如果没有被HOOK,我就进行HOOK。 所以我想能不能检查特定的几个函数有没有被HOOK?请高手指点一下 |
|
|
沙发#
发布于:2009-04-27 15:24
这个问题我已经解决了:(要查看ZwEnumerateValueKey这个函数有没有被HOOK)
//获得函数的序列 #define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1) void IdentifySSDTHooks(void) { int i; int ZwQueryDirectoryFile_index = SYSCALL_INDEX(ZwEnumerateValueKey); for (i = 0; i < KeServiceDescriptorTable.NumberOfServices; i++) { if ( (KeServiceDescriptorTable.ServiceTableBase < g_ntoskrnl.Base) || (KeServiceDescriptorTable.ServiceTableBase > g_ntoskrnl.End) ) { if(i == ZwQueryDirectoryFile_index) DbgPrint( "CHECKSSDT: System call %d ZwEnumerateValueKey is hooked at address %x!\n",i,KeServiceDescriptorTable.ServiceTableBase); } } } |
|
|
板凳#
发布于:2009-04-27 15:27
不过又出了一个新的问题
for(count = 0; count < g_pml->d_Modules; count++) { strcpy(modname,g_pml->a_Modules[count].a_bPath + g_pml->a_Modules[count].w_NameOffset); //找出ntoskrnl.exe内存映像的地址 if (strncmp("ntkrnlpa.exe", modname, 12) == 0) { g_ntoskrnl.Base = (DWORD)g_pml->a_Modules[count].p_Base; g_ntoskrnl.End = ( (DWORD)g_pml->a_Modules[count].p_Base + g_pml->a_Modules[count].d_Size ); } } 这里是寻找ntoskrnl.exe内存地址的一段代码,但是在XP里面我用IceWord才知道那些函数在ntkrnlpa.exe里面 所以我想了解下怎么判断这些函数是在哪个文件的内存映像里面??? |
|
|
地板#
发布于:2009-08-31 10:01
将每个模块记录到内存里面,然后看看这个地址是在哪个模块空间
|
|
|
地下室#
发布于:2009-09-20 16:19
|
|