Hide Your SSDT HOOK

原始出处: http://www.rootkit.com/newsread.php?newsid=922
信息来源:0GiNr,零下安全 信心无限
文章作者:xrayn
译文作者:wangweinoo1
译者声明:本译版首发于0GiNr,后由wangweinoo1极小规模修改后发于EST,转载请保持信息完整

文章目录:
0.前言(Preface)by wangweinoo1
1.目标(Purpose)
2.通过修改驱动导入表来隐藏SSDT HOOK(Hide SSDT hooks by modifying the EAT of loaded drivers)
3.通过修改KTHREAD结构来隐藏SSDT HOOK(Hide SSDT hooks by manipulating the KTHREAD structure)
4.试验结果(Results)
5.结论(Conclusion)
6.作者(Developers)
7.参考资料(References)

0.前言(preface)
哈哈,此乃wangweinoo1自己写的(译员也来干这非本份滴事。。)这是发表一点自己的感受
不得不说,现在KeServiceDescriptorTable都用的快泛滥鸟,俗话曰,物极必反,各种反Rookit一批一批出现,检测SSDT HOOK也成了小菜一碟,就算按这种小白也懂得拿Icesword来来检查SSDT HOOK鸟^_^。那么,隐藏我们的HOOK也成了一个问题,xrayn在此提出了两种方法——modifying the EAT of loaded driver和manipulating the KTHREAD structure,估计大家还有其他方法吧,拿来贡献吧!(对地下表示BS。。。。),OK,大家自己看吧!


1.目标(Purpose)

许多商业产品和rookits通过改变内核SSDT里函数指针来完全控制系统。但遗憾的是,目前没有技术来隐藏这些HOOK(与本文主旨相矛盾  ,另据FlowerCode介绍AVZ已使用本文所说第二种方法)这篇短文描述了隐藏SSDT HOOK且不被当前的的反rookit工具检查出的两种方法。

2.通过修改驱动导入表来隐藏SSDT HOOK(Hide SSDT hooks by modifying the EAT of loaded drivers)

wangweinoo1注:这个标题其实有点不准确,实为给SSDT做备份,然后改指针
我们要做的第一步是给还未被修改的SSDT表做备份(唔,用处在后面会讲)。然后用PsSetLoadImageNotifyRoutine()做一个回调,这个回调是用来分析新加载驱动的IAT(导入表),如果发现了KeServiceDescriptorTable,那么修改指针使其指向我们前面做的SSDT备份(这就是前面做备份的用处)。这时,NtReadFile()、NtCreateFile()和NtMapViewOfSection()就可以由修改真实的SSDT而被HOOK了。HOOK这三个函数的目的是确保驱动(虾米驱动捏,呵呵)难以获得真实SSDT指针(原文为pointer,其实我觉得译为地址也许会更好?)
wangweinoo1简评:很好,很暴力。就是方法有点猥琐,不过尚为常规思路

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被修改。换句话说,我们的实验成功的获得了令人满意的效果。(原文下面的这个链接已失效)
http://rapidshare.com/files/161590863/hidessdthooks.avi.html

5.结论(Conclusion)

我们的实验已经表明隐藏SSDT HOOK的存在,尽管这是为很多安全专家和反Rookit工具作者所了解的。我们建议更新反rootkit工具KTHREAD检查机制。

6.作者(Developers)

xrayn 和 joe

7.参考资料(References)

http://www.forum.joebox.org/viewtopic.php?id=38
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值