mhxueshan
驱动牛犊
驱动牛犊
  • 注册日期2008-06-12
  • 最后登录2011-02-20
  • 粉丝2
  • 关注0
  • 积分8分
  • 威望52点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2764回复:4

检测SSDT HOOK 的几个小疑问

楼主#
更多 发布于:2009-04-27 10:55
    我看了<ROOTKITS: Subverting the windows kernel> 里面有说到检测SSDT的方法:思路---->> NtQuerySystemInformation传递11号,得到系统加载的模块信息.从中找到ntoskrnl.exe的起始地址和大小.然后遍历SSDT表,如果其中的地址不在前面所查明的范围内,则表明被HOOK了.

    由于我的程序里面只有特定的几个简单的SSDT HOOK,比如:NtCreateFile。我现在想实现这个功能,驱动先检查NtCreateFile这个函数有没有被HOOK,如果已经被其他程序HOOK了,我就提示用户不能再进行HOOK,如果没有被HOOK,我就进行HOOK。

    所以我想能不能检查特定的几个函数有没有被HOOK?请高手指点一下
Artist
mhxueshan
驱动牛犊
驱动牛犊
  • 注册日期2008-06-12
  • 最后登录2011-02-20
  • 粉丝2
  • 关注0
  • 积分8分
  • 威望52点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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);
        }
    }
}
Artist
mhxueshan
驱动牛犊
驱动牛犊
  • 注册日期2008-06-12
  • 最后登录2011-02-20
  • 粉丝2
  • 关注0
  • 积分8分
  • 威望52点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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里面
所以我想了解下怎么判断这些函数是在哪个文件的内存映像里面???
Artist
webxeyes
驱动牛犊
驱动牛犊
  • 注册日期2008-04-02
  • 最后登录2010-07-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望92点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-08-31 10:01
将每个模块记录到内存里面,然后看看这个地址是在哪个模块空间
webxeyes
skymelai
驱动牛犊
驱动牛犊
  • 注册日期2007-08-10
  • 最后登录2010-01-29
  • 粉丝1
  • 关注0
  • 积分81分
  • 威望711点
  • 贡献值3点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-09-20 16:19
楼主有:Subverting the windows kernel这本书吗?
是中文还是英文版的呢?
能否给我一份:18175842@qq.com
谢谢
游客

返回顶部