PinDemonium通用動態(tài)脫殼工具
一、簡介
本文是對16年的blackhat大會上PinDemonium通用動態(tài)脫殼工具介紹。
1. 通用脫殼工具簡介
通用脫殼工具可以通過以下方法實現(xiàn):
- -debuggers
- -kernel modules
- -hypervisor modules
- -Dynamic Binary Instrumentation (DBI) frameworks
其中PinDemonium采用的就是DB的方法。
采用DBI主要原因是:
- DBI 提供了對待分析二進制文件非常細粒度的控制,可以全面控制程序執(zhí)行的代碼,深入分析程序做了什么
- 對反調(diào)試和反匯編技術免疫
- 有豐富且文檔完備的API集合用于從運行的程序中提取出信息,能改變程序運行時的行為
2. PinDemonium原理
通常,程序的一個內(nèi)存地址要么可寫,要么可執(zhí)行,滿足Write xor Execution (WxorX)規(guī)則。但是加了殼的軟件會違反這條規(guī)則。
通用脫殼工具原理:加殼的可執(zhí)行文件必需在運行時脫殼。脫殼過程中會向內(nèi)存中寫入新的代碼,然后執(zhí)行寫入的代碼。利用上述特性來構建通用脫殼工具。
通用脫殼工具必須解決的兩個問題:
- 找到Original Entry Point(OEP);
- 修復Import Directory來重構可執(zhí)行的版本。
***個問題只能通過啟發(fā)式的方法解決,因為脫殼過程什么時候結束是不可判定的。PinDemonium 綜合多個文獻中提出的啟發(fā)式方法來增加找到OEP的可能性,并且重新構建一個可執(zhí)行的版本。
第二個問題要找到Import Address Table(IAT),從而找到相關的API。
PinDemonium 也是利用通用脫殼工具的原理。記錄被寫過的地址來發(fā)現(xiàn)寫后執(zhí)行的內(nèi)存區(qū)域,當被寫過的內(nèi)存區(qū)域要被執(zhí)行時觸發(fā)轉儲和分析功能,然后嘗試找到程序所有的導入函數(shù)來重構一個可執(zhí)行的程序。
3. PinDemonium特點
PinDemonium 先進性:
- 考慮了堆上的代碼;
- 解決一些IAT混淆技術;
- 綜合多種OEP檢測啟發(fā)式方法來找到***的可執(zhí)行的去混淆后的程序。
PinDemonium 主要特點:
(1) PinDemonium 的核心模塊記錄寫過的地址(包括對遠程進程的寫),當發(fā)現(xiàn)寫后執(zhí)行的情況,就用 Scylla 對程序進行dump。
(2) 對 Scylla 進行了改進:
- PE重構模塊:增加了對動態(tài)內(nèi)存區(qū)域(例如堆)的考慮
- IAT搜索和重構模塊:允許分析人員編寫自己的去混淆代碼并集成到 PinDemonium 中
(3) 為了保持性能和簡化識別寫后執(zhí)行代碼的過程,忽略和脫殼無關的指令,如寫棧和寫Process Environment Block(PEB)
(4) 通過設置 PinDemonium 的一些標志可以開啟 PinDemonium 相應的功能來對付某些殼所使用的技巧
二、構成
PinDemonium 使用了兩個第三方工具:插樁工具Intel PIN和Scylla。
1. Intel PIN
PinDemonium 選擇插樁來實現(xiàn)通用脫殼工具, 因為:
- 插樁提供了對待分析二進制文件非常細粒度的控制,可以全面控制程序執(zhí)行的代碼,深入分析程序做了什么;
- 插樁對反調(diào)試和反匯編技術免疫;
- 插樁有豐富且文檔完備的API集合用于從運行的程序中提取出信息,能改變程序運行時的行為。
選擇Intel PIN,因為PIN功能全面,文檔豐富。
PIN 插樁的粒度可以是:
- Instruction:一條匯編指令;
- Basic blocks:以條件跳轉結尾的指令序列;
- Trace:以無條件跳轉結尾的基本塊序列。
PIN插樁粒度如圖1所示
圖1
利用插樁可以實現(xiàn)多種功能,如圖2所示,一個利用插樁計算程序指令數(shù)的例子。
圖2
pintool是用戶開發(fā)的dll來實現(xiàn)想要的功能。pintool 必須包含兩個部分:
- Instrumentation routines:代碼收集完畢后執(zhí)行的回調(diào)函數(shù),可以用于分析代碼屬性和在適當位置插入Analysis routines。
- Analysis routines:可以在當前指令執(zhí)行前或執(zhí)行后執(zhí)行的函數(shù)。
如圖3所示,顯示了PIN的流程。
圖3
2. Scylla
Scylla的兩個主要功能是IAT搜索和Import Directory重構。其中,IAT搜索部分,Scylla使用兩種技術搜索IAT:基本IAT搜索和高級IAT搜索。
(1)基本IAT搜索
- Scylla 接受一個開始地址作為輸入,從開始地址開始搜索IAT;
- 掃描包含開始地址的可執(zhí)行頁面中的call和jump指令,這些指令的每個目標地址作為可能的IAT入口指針;
- 目標地址中的值和所有導入函數(shù)地址進行比較,如果沒有一致的,目標地址就被淘汰;
- 從上述步驟找到的IAT入口地址開始掃描內(nèi)存,直到遇到4個0字節(jié),這樣就找到 IAT 的結束地址。同樣,反向掃描就可以找到開始地址。
(2)高級IAT搜索
對所有可執(zhí)行頁面而不是僅僅對包含開始地址的可執(zhí)行頁面來搜索IAT。
三、系統(tǒng)結構
PinDemonium系統(tǒng)結構如圖4所示:
圖4
從圖中可以看出,PinDemonium主要包括5個模塊:
- WxorX handler module
- Hooking Module
- Dumping module
- IAT search and reconstruction Module
- IAT Fixing and Import Directory Reconstruction
1. WxorX handler module
WxorX handler module是PinDemonium的核心模塊。WxorX handler module記錄寫過的地址(包括對遠程進程的寫),當發(fā)現(xiàn)寫后執(zhí)行的情況,就用Scylla對程序進行轉儲。
為了檢測寫后執(zhí)行,實現(xiàn)的兩個重要功能:
(1) Written addresses tracking:記錄被寫過的每個內(nèi)存地址來創(chuàng)建 Write Interval(WI)。WI 是一個結構體,記錄一片被寫過的連續(xù)內(nèi)存,包含以下信息:開始地址,結束地址,是否已分析的布爾標志,對 WI 所有啟發(fā)式方法的結果。圖5顯示了對2個WI進行合并的三種情況。為了保持性能和簡化識別寫后執(zhí)行代碼的過程,忽略和脫殼無關的指令,如寫棧和寫Process Environment Block(PEB)。
圖5
(2) Write xor Execution (WxorX) addresses notifier:檢查現(xiàn)在執(zhí)行的指令是否在WI中,如果是,執(zhí)行以下分析:
- Dump 違反 WxorX 規(guī)則的內(nèi)存區(qū)域。內(nèi)存區(qū)域的位置包含3種情況:PE 文件主模塊,堆上的內(nèi)存,其他程序的內(nèi)存中;
- 重構 IAT 并生成正確的 Import Directory;
- 運用一系列啟發(fā)式方法(熵,長跳轉等)來評估目前的指令是否是 OEP。
WxorX addresses notifier 用于觸發(fā)轉儲功能,當某個WI***次被違反WxorX規(guī)則進行轉儲。為了解決圖6的情況,當同一個WI中的跳轉大于閾值時也會進行轉儲。
圖6
PinDemonium hook系統(tǒng)調(diào)用來發(fā)現(xiàn)對遠程進程的寫,用hashmap將pid映射為WI,監(jiān)控用于執(zhí)行注入載荷的相關函數(shù),當發(fā)現(xiàn)對遠程線程的寫后執(zhí)行時,PinDemonium轉儲遠程進程被寫過的內(nèi)存并調(diào)用啟發(fā)式方法對轉儲結果進行評價。
2. Hooking Module
Hooking Module 利用 Intel PIN 的功能對API和系統(tǒng)調(diào)用進行hook以達到跟蹤程序行為的目的。圖7顯示的是對API的hook。
圖7
圖8顯示的是對系統(tǒng)調(diào)用的hook。
圖8
3. Dumping module
許多內(nèi)存轉儲工具,只會轉儲目標程序的主模塊,遺漏了動態(tài)內(nèi)存區(qū)域(例如堆)上的代碼,如圖9所示。
圖9
Dumping Module依賴于 Scylla。PinDemonium對 Scylla 進行了改進:將Scylla的PE重構模塊增加了對動態(tài)內(nèi)存區(qū)域(例如堆)的考慮。PinDemonium將堆上的WI標記為heap write interval,當heap write interval違反WxorX規(guī)則,不僅轉儲程序主模塊,還向轉儲中添加新的節(jié)來包含heap write interval的內(nèi)容并將Entry Point設在這個節(jié)內(nèi),如圖10所示。
圖10
圖11顯示的是利用Scylla來轉儲。
圖11
4. IAT search and reconstruction Module
為了獲得更好的結果,PinDemonium綜合運用Scylla的基本IAT搜索和高級IAT搜索功能,如圖12所示。
圖12
5. IAT Fixing and Import Directory Reconstruction
沒有能解決IAT混淆的通用技術,所以PinDemonium對Scylla進行改進,讓分析人員能自己編寫去混淆代碼并集成到 PinDemonium 中。PinDemonium 實現(xiàn)了一種能夠解決圖13所使用的IAT混淆技術的算法。
圖13
6. Heuristics implementation
PinDemonium 使用啟發(fā)式方法對獲得的轉儲進行評估,每個啟發(fā)式方法可以在最終生成的報告中設置一個標志位,所有的的標志位幫助識別***的轉儲。有4種啟發(fā)式方法:
(1) 熵:圖14顯示了加殼前后MessageBox程序的熵的情況。加殼后熵明顯增加。所以可以對比脫殼前后熵的變化大小是否超過閾值來對脫殼結果進行判定。
圖14
(2) 跳到節(jié)外:程序脫殼完畢后,調(diào)到OEP執(zhí)行時通常會從一個節(jié)跳到另一個節(jié),利用這一特點來對脫殼結果進行判定。
(3) 長跳轉:如圖15,程序脫殼完畢后,跳到原始代碼去執(zhí)行的情況通常不是(a)和(b)那種短跳轉而是(c)那種長跳轉,利用這一特點來對脫殼結果進行判定。
圖15
(4) pushad popad:脫殼的過程中是否出現(xiàn)了pushad和popad這兩條指令,如果都出現(xiàn)了就在報告中設置對應的標志位。
四、實驗效果
實驗一,已知加殼類型的實驗,實驗結果如圖16:
圖16
實驗二,未知加殼類型,樣本來源于virustotal,實驗結果如圖17:
圖17
五、使用
本人由于實驗需求,利用vmware搭建了PinDemonium環(huán)境,實現(xiàn)批量脫殼。
- pin -t PINdemonium.dll -- path-of-smaples\name-malwr.exe
通過這個指令可以實現(xiàn)樣本的脫殼,脫殼結果截圖如圖18:
圖18
設置 PinDemonium 的一些命令行參數(shù)可以開啟PinDemonium相應的功能來對付某些殼所使用的技巧。