Rootkit - SSDT Hook

问题

用Dependency Walker查看这个可执行文件的导入表,可以看到CloseServiceHandle、CreateServiceA、OpenSCManager和StartServiceA,这说明程序会创建并启动一个服务。这个程序还调用了CreateFile和WriteFile,这说明这个程序会对文件进行读写操作。另外,我们还可以看到LoadResource和SizeOfResource调用,说明这个程序对资源节进行了操作。
用Resource Hacker打开这个文件,我们可以看到在资源节中包含了另一个PE文件。
BVRRw6.png
接下来我们打开IDA对这个程序进行静态分析。
首先我们可以看到,这个程序将资源节中的数据提取出来。
BVRxfg.png
然后在C:\Windows\System32下创建了一个名为Mlwx486.sys的文件。将资源节中的数据写入文件中。
BVWimq.png
接下来创建一个服务并启动。
BVWGtO.png
在运行之前,我们先启动双机调试,看看虚拟机系统的情况,输入

1
Kd>dd KeServiceDescriptorTable

KeServiceDescriptorTable是一个指针,用于指向SSDT表。
BVh3WD.png
第一行就是SSDT表,其中0x80502b8c是一个函数指针数组,该指针数组保存了所有原生API的函数地址,0x0000011c是数组的大小。最后的0x80503000里面保存的是一个参数个数的数组,与原生API相对应。输入

1
Kd>dd 80502b8c

查看SSDT表。
BV5caq.png
接下来运行程序,使用Promom对其进行监控。
BVIjkq.png
可以看到程序在系统目录中创建了名为Mlwx486.sys的文件,并且下面还有对于这个文件的写和关闭的操作。
对C:盘进行搜索,没有发现这个文件。
BVTp5t.png
我们打开命令提示符,使用sc命令查看一下系统中内核驱动程序的状态。
BVT8r4.png
可以看到,程序创建的服务还在运行。
BVT6Zd.png
接下来我们再查看一下SSDT表,看看恶意程序运行后,这个表是否被修改了。为了能够更好地识别被修改的地址,我们再看一下刚才使用lm命令所显示出来的内容。可以看到,正常内核(NT)的地址范围是0x804d8000到0x806d0480。
BVTOJ0.png
经过对比可以知道,这个位置之前的值是0x80570074,我们使用u命令看看它是什么函数:
BV7PoR.png
可以看到,被修改的函数是NtQueryDirectoryFile,它是一个提取文件和目录信息的通用函数,FindFirstFile以及FindNextFile都是调用它来遍历目录结构的。Windows的资源管理器也会利用它来显示文件和目录。如果恶意程序采用Rootkit技术钩取了这个函数,就可以实现文件隐藏的效果。
我们可以首先在恶意程序替换的地址,也就是0xf7c9b486的位置下一个断点。然后利用g指令执行到该位置,再单步运行几次。
BV7spV.png
接下来我们使用Resource Hacker提取出资源文件,并且命名为Lab10-02.sys,然后用IDA载入这个文件。我们直接来看一下NtQueryDirectoryFile函数调用的位置。
BVbVqe.png
可以看到,程序会对函数的两个参数信息进行比较,首先是FileInformationClass,程序会将其与3进行比较。3表示的是“FileBothDirectoryInformation”,用于目录的遍历,并会返回关于目录内容的详细信息,返回的信息是FILE_BOTH_DIR_INFORMATION结构的。如果不是3,那么程序什么都不会做。如果是3,则会接着判断ReturnSingleEntry是否为0值。只有在是0值的时候,才会执行恶意程序真实的操作,反之什么都不执行。
BVbGqg.png
如果这两处的判断都能够通过,程序就会调用RtlCompareMemory函数来比较两个内存块的内容。其中的Source2是字符“Mlwx”,而Source1是“[esi+5Eh]”,查询FILE_BOTH_DIR_INFORMATION结构可以知道,它表示的是文件的名称(FileName)。那么就可以知道,程序其实是在对文件名称进行匹配,如果文件名称的前四个字符是“Mlwx”,那么也就匹配成功了,就会进行文件隐藏的操作。
BVL4bD.png

1、这个程序创建文件了吗?它创建了什么文件?

创建了名为Mlwx486.sys的文件。

2、这个程序有内核组件吗?

有。

3、这个程序做了些什么?

这个程序采用了Rootkit技术来隐藏指定的文件。它使用了SSDT钩子来钩取NtQueryDirectoryFile函数,并隐藏文件目录列表中所有以“Mlwx”为开头的文件。