对某bootkit的驱动分析

一.基本信息
驱动文件名:1F273549.sys(驱动名称随机)
病毒类型:感染MBR
MD5:xxx
文件大小:9,104 字节
 
二.危害简介
1. hook了4个SSDT函数,用于对抗杀软的驱动加载,以及保护自身样本不被复制
2. 替换了Disk.sys的StartIo处理例程,隐藏MBR的修改
3. 根据上层传入的进程pid来杀进程,主要用于结束杀软的进程
4. 使用磁盘IO来直接操作MBR
三.详细分析
1.  DriverEntry
a)  创建设备名为\\Device\\Guntior的设备对象
b)  获取如下4个函数的地址
ZwLoadDriver
ZwSetSystemInformation
ZwSetValueKey
ZwReadFile
c)  SSDT hook以上的4个函数
d)  获取Disk.sys的DEVICE_OBJECT
e)  直接发IRP读取MBR
f)   对读取出的MBR内容进行判断,判断是否是感染过的MBR
g)  Hook Apapi StartIo
2.  SSDT hook函数的处理
a) ZwLoadDriver & ZwSetSystemInformation
这两个驱动都是判断要加载的驱动是否在如下的列表中,如果在,则拒绝。
在ZwLoadDriver的处理中还会删除相关的服务注册表项。
这个是用来对抗杀软的驱动加载的。
b)  ZwSetValueKey
这个函数的处理中主要是判断注册表路径是否包含如下的两个列表,如果有,则拒绝
c) ZwReadFile
样本hook了这个函数,主要是判断要读取的文件是否是sfc_os.dll,如果是,则拒绝。
这里sfc_os.dll已经被样本替换了。
3.  Device Io的处理
该驱动一共有4个Control Code,
Control Code 222440用于接收sfc_os.dll打下来的如下4个函数的地址以及函数内部的偏移和指令
MmGetSystemRoutineAddress
PspTerminaterProcessByPointer
KeInsertQueueApc
KiInterQueueApc
ControlCode 222444:
用于根据sfc_os.dll打下的进程pid来调用PspTerminaterProcessByPointer来结束进程,同时还会根据222440传入的指令来检查上面的4个函数是否被hook,如果有被hook,则恢复钩子。
Control Code 22243D用来通过磁盘IO来读取MBR,并且返回给上层的sfc_os.dll。
Control Code 222439主要是为磁盘IO的相关操作做前期的准备,比如硬盘状态的判断等。
4. StartIo处理
在Guntior的StartIo函数中,会根据IRP判断来隐藏MBR

猜你喜欢

转载自blog.csdn.net/cnbragon/article/details/8255238