这个驱动是的sality病毒的rootkit部分,代码比较简单,主要功能有两个
一是拦截内容含有以下字符串的TCP和UDP数据包,还有TCP 25端口的数据包
upload_virus
sality-remov
virusinfo.
cureit.
drweb.
onlinescan.
spywareinfo.
ewido.
virusscan.
windowsecurity.
spywareguide.
bitdefender.
pandasoftware.
agnmitum.
virustotal.
sophos.
trendmicro.
etrust.com
symantec.
mcafee.
f-secure.
eset.com
kaspersky
二是 接收应用层的命令,应用层主要传递了系统的SSDT地址表和一个进程id,驱动获取NtTerminateProcess函数的地址,强制关闭指定的进程。
主要的功能很明显,就是为了对抗杀软,涉及的操作系统有win2000到windows Vista的32位版本。
特征有:
设备对象名为\Device\amsint32,
符号链接名为\DosDevices\amsint32
MD5 bf31a8d79f704f488e3dbcb6eea3b3e3

函数的代码量比较小,使用IDA PRO进行静态分析,代码结构基本理清。
DriverEntry函数为驱动程序的入口函数,其中完成了一些初始化工作。
在DriverEntry中创建了设备对象和符号链接,设备对象名为\Device\amsint32,符号链接名为\DosDevices\amsint32,用于接收应用层的发送的命令和数据

设置了派遣函数

解密一个全局字符串数组,这是要过滤的字符串

创建了两个系统线程

在进程1中,获取系统驱动ipfltdrv.sys的设备对象,调用IoBuildDeviceIoControlRequest函数,使用IOCTL_PF_SET_EXTENSION_POINTER这个控制码,注册一个回调函数,这样系统会将数据包发送给这个回调函数来处理

回调函数的逻辑如下,若全局开关dwFilterEnable为1,若为TCP的端口为25,拦截这个包,不知道为啥?
若数据包中含有上面的解密出来的字符串,拦截,否则放行

等待应用层发送数据,驱动程序接收到应用层的数据后,会在DriverDispath中的设置Event
进程2中首先等待ServiceTableBase值,通过加上NtTerminateProcess的ssdt index得到其地址

然后等待应用层发来pid的值 获取进程的handle,调用NtTerminateProcess关闭这个进程,这里有一个全局变量dwEnableSwitch,应该是作者调试程序留下的,在代码中一直为0

派遣函数主要用于接收应用层的数据,这里只对WRITE类型的IRP进行处理,大体逻辑如下,
当UserBuffer的第一个双字为666时,其中UserBuffer中存储是的这是的SSDT的地址表(KeServiceDescriptorTable.ServiceTableBase),只是作者将第一个地址改成为666,用来当命令,将ServiceTableBase的内容拷贝到全局变量中, SetEvent,告诉ThreadFunc1 SSDT的地址表来了。
当UserBuffer的第一个双字为777时,将全局变量dwFilterEnable置为1,ThreadFunc1开启过滤TCP 25端口的数据包;
当UserBuffer的第一个双字为888时,将全局变量dwFilterEnable置为0,ThreadFunc1停止过滤TCP 25端口的数据包;
当UserBuffer的第一个双字不是666、777、888,且大小为一个ULONG, ServiceTableBase不为空时,此时userbuffer中的内容为进程id,将进程id复制出来给dwPid,SetEvent,告诉ThreadFunc1用户层的pid来了,可以关闭这个进程了。

https://www.freebuf.com/column/206442.html
https://blog.csdn.net/namelcx/article/details/9254137
https://guanjia.qq.com/news/n3/2567.html