對某bootkit的驅動分析

cnbragon發表於2012-12-04
一.基本資訊
驅動檔名: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

相關文章