自制反匯編逆向分析工具


本篇介紹我自己在逆向分析過程,針對AT&T反匯編的函數逆向分析的自制輔助工具。

當分析工作要消耗巨大的時間和體力精力腦力時,花時間去制訂滿足適合自己工作流程的工具是十分必要的。

我逆向分析的目的不是為了破解,或是看別人的界面程序的布局,而是想深入apple提供的庫或編程框架,逆向分析的庫的設計,當然必須要有一定量的函數逆向偽代碼來分析。

在一個函數的組成當中,跳轉邏輯占據了相當的份量,包括分支和循環,還有尾調用。當一個函數的代碼段超過500B以上,有些函數2K~7K時,有一個圖可以反映出函數整體的分支循環情況作為輔助參考,就很有必要。另外在手工逆向分析一個函數前,能生成一個包含循環跳轉和函數調用的偽代碼框架也十分有幫助。

 

雖然主業是C/C++/OC,但是不是凡事都應用C++。我選用bash來作反匯編代碼的歸類划分,html5的canvas作為顯示。canvas庫的api和iOS SDK/coregraphics的api的幾乎一樣。bash和html5都可以與平台不相關。

 

思路大概分為:

1.用lldb或gdb對函數反匯編出匯編代碼。

2.通過bash的grep,gawk,sed等文本處理工具,將匯編代碼分類成幾個文件(文本數據庫,有一定的制表格式,相當於一條有fields的recored),例如跳轉相關的代碼划分到一個文件。

3a.通過瀏覽器javascript加載上面划分好的文本數據庫,借用canvas繪制出分布圖。

3b.通過bash從文本數據庫中合並代碼,生成偽代碼框架。

 

工具的效果圖如下:

最左邊是坐標,指示了代碼段中相對於函數入口的偏移量。

右側的長方形柱條,表示代碼段。

長方柱左側邊上的直角連線表示有條件的向前跳轉。也就是通常的if分支。

長方柱右側邊上的直角連線表示有條件的向后跳轉,也就是跳轉回前面,也意味着循環 loop, for, do while。

長方柱內的垂直線代表着函數體內無條件跳轉。向前的話很大可能是else分支,向后的話則可能是continue,或者for或while的結尾。

長方柱內的水平線代表着發生函數調用的位置。

 

接着就是利用bash生成基本的循環和調用的逆向代碼框架,圖如下:

 

最后謝謝路過的你觀看。

后面還會介紹自己在逆向分析過程制作的工具,以及逆向分析出的結果。

 

第二版,反匯編代碼對應圖。

第三版,將反匯編代碼條件分支跳轉分支逆向生成C++文件。

第四版,添加逆向分析策略,如果一個函數的反匯編代碼包含許多無條件跳轉指令,用內聯策略來逆向出c++代碼分支結構。

第五版(一),顯示選定的條件指令與其它條件分支的關系。

第五版(二),寄存器訪問調配圖,包括棧空間的調配情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM