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