计算机与网络信息安全

遏制免杀:反 Rootkit

2019-01-18  本文已影响15人  發姨
图片发自简书作者發姨

Anti Rootkit简称ARK,是Rootkit的对立面,我们都知道Rootkit多被用于免杀,因此研究ARK技术也是研究遏制免杀技术的一个方向。检查Rootkit其实就是在做两件事情,一件是通过数据对比寻找钩子,另一件就是枚举系统中的各个重要数据结构。

从技术原理上来讲,懂得Rootkit就必然会懂ARK,这里不再着重讲解ARK的技术实现细节,而是主要讲思路。

一、适当的监控

Rootkit这个课题本身就是一个悖论。这源于一个最基本的事实,也就是Rootkit既想运行在一台计算机中,而又不想让这台计算机发现自己在运行它,这理论上是不可能。这有点类似于如下情景:甲站在屋外问“请问屋里有人吗?”乙在屋内回答“屋里没人!”这时甲会怎么想呢?

因此,适当且正确的监控是可以发现Rootkit的。反病毒软件截杀Rootkit的最有效方法并非是基于内核层的对抗,而是基于用户层的拦截。任何驱动程序想要加载到内核中都必然要经过用户层,而基于用户层的拦截恰好又是最稳定,且相对较容易实现的,因此在用户层进行适当的监控是非常必要的。

基于用户层的监控一定要适当,否则可能会导致影响系统效率等负面干扰。

二、基本检测逻辑

Rootkit的检测是采用一种被称为交叉视图(Cross-view)的方法进行的。这种方法的最初应用方式是比较系统在不同时间内的快照,并由此发现这些快照产生差异的地方。使用交叉视图方式检查Rootkit时,普通用户所能看到的所有信息都被认为是污染视图(Un-clean view),而硬件层所能“看”到的信息都被认为是干净视图(Clean view)。

在检查Rootkit时这种方法的概念变得更为复杂,它包括了对未执行的文件与内存映像信息的比对,以及各种系统关键表、关键结构的检查对比等,因此干净视图与污染视图的概念也在发生着变化。

但是实际上这种检查方法也是有缺陷的,使用交叉视图的方式检测Rootkit时,其理论基础就是它获得的干净视图必须确实是干净的。换句话说,如果Rootkit在检测程序获取干净视图时对其做了一定的干扰与欺骗,那么这种方法将不再有效。因为理论上它获取的两张视图有全部被污染的可能,这样会导致使用此方法的检查程序失去有效的参照系,进而得出错误的结论。

三、Rootkit检测方法初探

检测Rootkit的两个主要方向就是指针验证与热补丁检查。就一般情况而言,凡是内核中的Rootkit,如果其想要完成一定的功能,通常只有两种方案:一个是修改某个关键结构的指针;另一个就是给某个关键函数打一个热补丁。下面分别简单介绍一下内核层各种Rootkit的检查方法。

1、检查SSDT钩子与IDT钩子

SSDT钩子是原理最简单且最容易实现的内核层钩子,因此,可想而知这也是一种相对较容易检查的钩子。

检查SSDT钩子的方法有很多,例如可以通过分析未被执行的内核文件从而得出真实的SSDT数据,并用其与内存中的SSDT相对比。

或者直接检查SSDT中的函数指针地址,因为在一般情况下SSDT所指向的内核例程地址都在0x80000000~0x8FFFFFFF之间,而骇客们后加载的驱动程序所在的内存地址往往较高。因此修改后的SSDT所指向的内核例程地址很难落在0x80000000~0x8FFFFFFF之间。另外,此种方法也适用于检查IDT钩子。

2、检查IAT钩子

检查IAT钩子的重点就在于如何找到有效的参照系。一般情况下,被安装IAT钩子的程序基本都是系统程序或较为出名的程序。这些程序的一个特点就是有很多种方法能够获取到此程序的可信副本,例如直接读取文件,或者此程序的运行例程不止一个,那么就可以全部都拿来交叉对比一下。因此,只要我们能得到此程序的可信副本,就能知道某个程序的某个IAT是否被恶意修改了。

3、检查IRP钩子

检查IRP钩子的基本思想与检查SSDT钩子的思想有些类似。每个驱动程序都在DRIVER_OBJECT中保存了一些I/O请求包的函数指针,如果需要勾住某个类型的IRP,就要替换掉其中的某个指针,使其指向自己这个驱动中准备好的一个函数。

因此,我们可以检查这些函数指针是否都是指向其驱动程序本身的地址范围之内的,如果这是一个被修改的函数指针,其指向的地址应该是在骇客们的驱动程序中。

4、检查内联钩子

内联钩子是一种较为灵活的钩子类型,因此其检查方式也不尽相同。内联钩子是通过热补丁的方式替换某段二进制可执行代码中的一部分,这种替换有时候需要很高的技巧。

就目前来讲,检查内联钩子的方法就是通过分析未被执行的内核文件,从而得出真实的函数代码,并用其与内存中的可执行映像相对比,进而找出不同点。

四、结语

虽然从理论上讲,如果屋子里没人的话,是不可能有人告诉你“屋里子没人”的,但是在由0和1构建的虚拟世界中,不得不承认检查Rootkit还是一种比较有难度的工作的。

任何现有的Anti-Rootkit工具都是不完美且存有漏洞的,骇客们会以这些工具为目标不停地完善他们的Rootkit。因此这场数字世界中的终极战争还将继续延续下去,如果不想失败的话只有一种办法,那就是不要被技术淘汰。

上一篇下一篇

猜你喜欢

热点阅读