【原創(chuàng)】手脫花指令及IDA腳本編寫
作者論壇賬號:flatcc
綜合許多篇帖子而成,大多參考以末尾參考文章形式給出,適用于初學者,感謝大家提出意見。可結合末尾源碼參考學習。感覺有用的話感謝大佬們點個贊。
簡介
作用
欺騙反匯編器,讓反匯編器無法正確反匯編出匯編代碼,具體來說是破壞了反編譯的分析,使得棧指針在反編譯引擎中出現(xiàn)異常
從而加大靜態(tài)分析的難度,使得逆向分析人員難以識別代碼的真正意圖
原理
由于反編譯器的工作原理一般是線性掃描算法或遞歸下降反匯編算法。
線性掃描反匯編算法從程序的入口點開始反匯編,然后對整個代碼進行掃描,反匯編掃描其過程中所遇到的每條指令。那么線性掃描算法的缺點也就顯而易見了,由于其不定常的指令格式,在反匯編掃描過程中無法區(qū)分數據與代碼,從而導致將代碼段中嵌入的數據誤解釋為指令的操作碼,以致最后得到錯誤的反匯編結果。
遞歸下降算法,遞歸下降算法通過程序的控制流來確定反匯編的下一條指令,遇到非控制轉移指令時順序進行反匯編,而遇到控制轉移指令時則從轉移地址處開始進行反匯編。該算法的缺點在于難于準確確定間接轉移的目的地址。
PATCH方法
先在IDA中開啟字節(jié)碼的顯示,我這里設置顯示的字節(jié)碼是8。

以下圖中的花指令為例,我們鼠標光標點到0x004560FF,然后按快捷鍵D
,在下方為指令的地址0x00456100地址處,按快捷鍵C
將其轉換為指令。然后將0x004560FF處的0xE8
Patch為0x90
,也就是打補丁為nop指令。

然后保持副本即可。
實現(xiàn)案例
簡單花指令-多層JMP嵌套
如下是單層的JMP形式:

甚至如下的多層嵌套:

如下圖,因為IDA使用的是遞歸下降算法進行反匯編,所以這種花指令可以被IDA輕松識別。

互補條件代替JMP跳轉
類似如下形式,無論如何都會跳轉到LABEL1處:

在如下代碼中,先對eax進行xor之后,再進行test比較,zf標志位肯定為1,就肯定執(zhí)行jz LABEL2;
,也就是說中間0xC7永遠不會執(zhí)行。要記得:先壓棧保存eax的值,最后再把eax的值pop出來。

如下圖,我們可以看到,IDA雖然識別棧幀錯誤,但是正確的程序流還是比較清晰的。

再如下,我們將中間填充代碼改為0x21
,混淆效果明顯了一些,結果如下。

那么我們再來一個加強版,代碼如下:


call&ret構造花指令
如下案例,代碼中的esp存儲的就是函數返回地址,對[esp]+8,就是函數的返回地址+8,正好蓋過代碼中的函數指令和垃圾數據。

如下圖所示,是上述花指令代碼的效果,這里最好自己動態(tài)跟以下。

call 指令的直觀理解:push 函數返回地址; jmp 立即數
ret 指令的直觀理解:pop eip; add esp,4
利用函數返回確定值
有些函數返回值是確定的,比如我們自己寫的函數,返回值可以是任意非零整數,就可以自己構造永恒跳轉。
還有些API函數也是如此,比如在Win下HMODULE LoadLibraryA(LPCSTR lpLibFileName);
函數,如果
我們故意傳入一個不存在的模塊名稱,那么他就會返回一個確定的值NULL
,此時就可以通過這個函數來構造永恒跳轉。如下例子:

混淆效果如下:

call和ret的組合
如下代碼:



也就是說思路有很多種,按照自己喜歡的方式組合,只要不影響其他正常代碼的運行就可以,如下也是比較好的兩種思路
call嵌套的其他思路1

call嵌套的其他思路2

花指令原理另類利用
當我們理解了花指令的原理后,我們可以在將花指令中的垃圾數據替換為一些特定的特征碼,可以對應的$“定位功能”$,尤其在SMC自解碼這個反調試技術中可以運用。例如:

將這串特征碼hElLowoRlD嵌入到代碼中,那我們只需要在當前進程中搜索hElLowoRlD字符串,就可以定位到當前代碼位置,然后對下面的代碼進行SMC自解密。
小結
構造永恒跳轉,添加垃圾數據
綜合題目案例
IDC腳本去花
我們以題目[MSLRH].exe
為例子,分析一段花指令,使用IDA中的快捷鍵D
和C
來手動過花指令。手動分析清楚其流程后,我們可以寫一個腳本,來批量匹配花指令的模式NOP
掉影響靜態(tài)分析的代碼。

寫好的IDC腳本如下:

使用IDAPython去花

附帶源碼見論壇原文。
參考
反匯編基礎:https://tinytracer.com/archives/反匯編基礎/
自動獲取驅動程序IO控制碼初級版:https://bbs.pediy.com/thread-153965.htm
花指令總結:https://www.anquanke.com/post/id/236490
反編譯系列教程(上):http://drops.xmd5.com/static/drops/papers-13686.html
_emit偽指令:https://docs.microsoft.com/zh-cn/cpp/assembler/inline/emit-pseudoinstruction?view=msvc-160
IDAPython官方文檔:https://hex-rays.com/products/ida/support/idapython_docs/
IDAPython腳本示例:https://www.cnblogs.com/shenshuoyaoyouguang/p/13841078.html
IDAPython動態(tài)調試開發(fā)技巧:https://www.bbsmax.com/A/x9J27Lgg56/
論壇原帖地址:https://www.52pojie.cn/thread-1512089-1-1.html