找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 2855|回复: 0

如何隐藏你的SSDT HOOK

[复制链接]

280

主题

203

回帖

0

精华

版主

积分
1808
发表于 2011-1-16 00:23:45 | 显示全部楼层 |阅读模式
不得不说,现在KeServiceDescriptorTable都用的快泛滥鸟,俗话曰,物极必反,各种反Rookit一批一批出现,检测SSDT HOOK也成了小菜一碟,就算按这种小白也懂得拿Icesword来来检查SSDT HOOK鸟^_^。那么,隐藏我们的HOOK也成了一个问题,xrayn在此提出了两种方法——modifying the EAT of loaded driver和manipulating the KTHREAD structure,估计大家还有其他方法吧,拿来贡献吧!OK,大家自己看吧!

1.目标(Purpose)
许多商业产品和rookits通过改变内核SSDT里函数指针来完全控制系统。但遗憾的是,目前没有技术来隐藏这些HOOK。这篇短文描述了隐藏SSDT HOOK且不被当前的的反rookit工具检查出的两种方法。
2.通过修改驱动导入表来隐藏SSDT HOOK(Hide SSDT hooks by modifying the EAT of loaded drivers)
我们要做的第一步是给还未被修改的SSDT表做备份(唔,用处在后面会讲)。然后用PsSetLoadImageNotifyRoutine()做一个回调,这个回调是用来分析新加载驱动的IAT(导入表),如果发现了KeServiceDescriptorTable,那么修改指针使其指向我们前面做的SSDT备份(这就是前面做备份的用处)。这时,NtReadFile()、NtCreateFile()和NtMapViewOfSection()就可以由修改真实的SSDT而被HOOK了。HOOK这三个函数的目的是确保驱动(虾米驱动捏,呵呵)难以获得真实SSDT指针(原文为pointer,其实我觉得译为地址也许会更好?)
3.通过修改KTHREAD结构来隐藏SSDT HOOK(Hide SSDT hooks by manipulating the KTHREAD structure)
第二个技术与上面第一个技术大致上相同,同样是内核结构的备份,不过这次是要改变每个线程的SSDT指针了。如果你反编译KiSystemService的话,你将会看到它其实是通过每个线程的控制块里ServiceTable指针来获得函数指针的(总感觉这句话译起来有点困难。。。)。ServiceTable pointer是由KeInitThread()初始化,PsConvertToGuiThread()负责构建。通过判断线程的类型来了解这个指针是指向SSDT还是SSDT-Shadow。Shadow里包含了GUIs所要需用的函数的指针,所以PsConvertToGuiThread()自然会改变ServiceTable的指针使其指向SSDT-Shadow。下面,你可以看到KTHREAD的结构:
kd> dt !_kthread
nt!_KTHREAD
[...]
+0x0e0 ServiceTable : Ptr32 Void
[...]
修改KTHREAD结构以隐藏SSDT HOOk,那么SSDT和Shadow SSDT的备份也该随之而建立。下一步就是修改SSDT或者Shadow SSDT来完全控制系统。现在,我们还需要修改内核代码使PsConvertToGuiThread()和KeInitThread()所对应的ServiceTable指针能够正确的指向我们的备份,这样以后所有枚举的线程里面的ServiceTable结构指针都就改了。
我已用RootkitUnhooker, GMER, SVV等反Rookit来测试我们隐藏HOOK的效果,以上工具均没有检测出内核代码和KTHREAD结构的修改。
4.试验结果(Results)
这个demo展示了通过改变线程ServiceTable指针来HOOK NtOpenProcess()以加载一个驱动的例子。在HOOK后,我们使用反Rootkit软件来检测,我们看到,这些工具并没有发觉SSDT或SSDT-Shadow被修改。换句话说,我们的实验成功的获得了令人满意的效果。
5.结论(Conclusion)
我们的实验已经表明隐藏SSDT HOOK的存在,尽管这是为很多安全专家和反Rookit工具作者所了解的。我们建议更新反rootkit工具KTHREAD检查机制。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表