雙槍2驅動分析
前言
前段時間360安全衛士發表了一篇對雙槍2感染釋放驅動行為的分析報告,報告地址:
http://www.freebuf.com/articles/web/167776.html
相比於雙槍一代,它增加了HIVE文件保護,新增了WFP網路功能攔截,還有保護了自身的
系統回調不被修改,並且針對部分查殺驅動摘除了所有的關機回調,該驅動木馬從一代後一直在更新活躍。
接下來我們將對該驅動進行再一次全面的分析,揭露它難以查殺的詳細原因。
1驅動初始化部分
1.1驅動入口函數
主要為判斷初始化一些變數,然後開啟初始化線程工作。
入口函數所有代碼:
圖1
先獲取Nt基地址,後續生成設備名,隨機化線程地址和獲取註冊表操作函數用:
圖2
然後初始化一些必要函數後續用於注入DLL模塊:
圖3
從Ntdll函數中取出SSDTIndex,在KeServiceDescriptorTable取得函數地址 :
圖4
獲取完成後判斷下載入時機,由於該驅動重啟後為Boot0驅動,判斷下Ntfs文件系統驅動是否載入,:
圖5
創建設備名和符號鏈接跟應用層交互:
圖6
設備名是通過隨機Nt基地址數字生成:
圖7
生成隨機設備名,並使用這個隨機設備註冊關機回調,然後開啟初始化線程:
圖8
1.2初始化線程
線程入口開始就調用KeEnterCriticalRegion
而該函數作用為禁止內核APC,暫停線程操作調用的就是內核APC
調用這個函數後線程就無法被暫停,然後再隱藏自身線程起地址,將其設置為ntos裡面的一個隨機地址。
圖9
然後開始掛鉤模塊載入回調初始化獲取一些註冊表函數地址並且重新創建隨機文件名將自己驅動拷貝過去:
圖10
然後創建三個工作隊列並且將模塊注入到系統進程:
圖11
然後進入死循環,一直往系統中放置工作隊列用於後續感染BootKit等一系列操作:
圖12
1.3註冊表函數初始化
在初始化線程中調用了KeyHelperStartup,該函數主要為獲取CmSetValueKey更底層的操作函數,函數內容為:
圖13
GetCellRoutineOffset 函數裡面主要為獲得一些硬編碼偏移。
然後掛鉤函數GetCellRoutine:
圖14
開啟線程觸發調用,觸發完成後恢復鉤子:
圖15
觸發調用函數為:
圖16
在掛鉤函數中使用RtlWalkFrameChain棧回溯來找到CmSetValueKey等函數調用。
並且校驗線程是否為觸發的線程,根據調用類型CallType來查找,
圖17
初始化代碼完成後,接下來我們開始從網路阻斷,文件保護,註冊表保護,模塊載入禁止,改首頁模塊注入,BootKit感染,自身回調防護幾個部分的詳細分析。
2 網路阻斷
開啟線程主要是分系統掛鉤網路組件Xp系統為掛鉤TCPIP Win7以上 註冊WFP相關常式:
圖18
入口點先隱藏自身,將自身設置為
\SystemRoot\system32\drivers\volmgr.sys 驅動。
圖19
然後根據系統不同掛鉤不同系統網路組件,對於XP系統:
圖20
Win7系統:
圖21
然後註冊WFP回調:
圖22
回調函數中判斷進程名字,一旦有匹配的進程名,則阻斷該進程網路操作:
圖23
匹配是通過Hash計算進程名字:
圖 24
3文件保護
先生成隨機文件名驅動,並且將原來文件刪除,刪除前去除保護開關。
圖25
保護開關函數為,註冊表函數類似,該函數頻繁被調用,我們看下具體內容:
圖26
將當前線程設置為信任線程,註冊表和文件掛鉤就會放行該線程。
清理信任線程代碼為:
圖27
然後將一些要保護的文件設置上。
自身文件:
圖28
Ntfs文件:
圖29
FastFat文件:
圖30
設置上保護後,掛鉤Ntfs正式開啟保護:
圖 31
該函數中首先獲取ntfs驅動對象:
圖32
備份並替換所有的Ntfs FsdDisptach:
圖33
備份所有FastIo操作常式:
圖 34
替換:
圖35
FastFat類似,這裡我們就不看了。
掛鉤函數中:
圖36
CheckTheFileIsProtectAndCompleteTheRequest函數裡面調用:
圖37
該函數主要是否為之前初始化的保護文件列表,依然是通過文件名Hash比對的,並且查看當前線程是否為可以信任線程。
圖38
如果不是則拒絕打開。
對於已經打開的文件對象,通過判斷文件對象的FsContext來判斷。
圖39
之前會先獲取Hive文件對象。
圖40
判斷是否一致:
圖41
如果為保護的文件則返回 STATUS_INVALID_PARAMETER。
Hive文件特殊處理。
圖42
圖43
4註冊表保護
先設置自身開機順序:
圖44
獲取優先啟動組:
圖45
然後將服務寫入:
圖46
寫入函數為:
圖47
優先使用更底層的CmSetValueKey函數,然後才使用系統調用:
圖48
初始化保護列表:
圖49
註冊保護回調:
圖50
回調保護中:
圖51
Hash比對註冊表鍵,檢測是否為保護項目:
圖52
如果是且不是可信進程則拒絕打開。
5模塊載入禁止
先設置回調:
圖53
分驅動和應用進程兩種情況。
驅動文件判斷是否需要Patch的模塊。:
圖54
Hash跟 正則匹配aw***.sys等一些驅動。
圖55
如果是則Patch入口點:
圖56
對於應用層進程判斷是否為瀏覽器,如果是則禁止網盾模塊載入:
圖57
6改首頁模塊注入
先解密DLL,動態獲取ntdll地址偏移.
圖58
圖59
解密文件並校驗:
圖60
然後分別向Services.exe Explorer.exe注入。
圖61
分配內存:
圖62
拷貝代碼:
圖63
然後注入執行:
圖64
7 BootKit感染
7.1查找活動分區
目前有不少機器安裝了多塊硬碟,需要先找活動磁碟的活動分區。
圖 65
然後寫入BooKit組件,分三步寫入,先寫入引導驅動BootImage,然後寫VBR,最後寫入MBR,只有當前面一步操作成功後才繼續下一步寫入。
圖66
7.2 BootImage寫入
寫入BootImage前 先找磁碟末尾空餘區域,如果沒有空間則寫入失敗。
圖67
獲取磁碟參數:
圖68
然後找到磁碟末尾寫入位置:
圖69
再將BootImage加密後寫入:
圖70
寫入前先判斷是否已經寫入過了:
圖71
寫入成功後,再寫入VBR部分。
7.3 VBR寫入
判斷分區參數和是否為NTFS磁碟,僅支持Ntfs磁碟。
圖72
然後找下VBR跳轉指令:
圖73
查找函數為:
圖74
判斷下是否為ESLDRLoader,如果是則刪除所有項目。
圖75
刪除所有:
圖76
然後將病毒VBR壓縮,合併寫入:
圖77
並且將位置大小的參數全部異或加密保存在磁碟末尾。
圖78
7.4 MBR寫入
獲取磁碟信息:
圖79
先將VBR寫入磁碟最開始的第3個扇區後0xF個扇區,後續即使VBR被修復,MBR部分依舊可以感染VBR
圖80
讀取原始MBR:
圖81
將分區表拷貝進來,然後比對是否已經寫入,如果沒有則寫入0號扇區:
圖82
7.4 保護BootKit
保護函數:
圖83
先初始化正常的VBR MBR,用系統默認的。後續如果有應用程序讀取則讀到這份假的內容。
MBR部分:
圖84
VBR部分:
圖85
然後再安裝磁碟底層鉤子:
圖86
掛鉤中判斷,寫則返回拒絕.
圖87
讀取則返回假的數據:
圖88
8 自身回調防護
LoadImage 函數保護,拷貝頭部0x20個位元組:
圖89
比對是否一致,不一致則直接恢復:
圖90
註冊表回調,判斷特定鍵值打開返回值:
圖91
然後重新註冊上:
圖92
摘除關機回調則通過硬編碼獲取鏈表頭部:
圖93
獲取:
圖94
然後遍歷整個鏈表,只要不是自身註冊的隨機設備就摘除該關機回調:
圖 95
摘除:
圖96
總結
針對MBR和VBR系列木馬泛濫的情況,360首創了針對此類頑固木馬的強力查殺技術,並且能夠同時自動檢測和修復MBR及VBR ,發現電腦瀏覽器主頁被反覆篡改無法恢復、或出現卡慢等情況時,可使用360安全衛士進行掃描查殺,徹底清除該木馬,360安全衛士已經第一時間支持該驅動木馬查殺.。
圖97
TAG:威客安全 |