本篇介紹我自己在逆向分析過程,針對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生成基本的循環和調用的逆向代碼框架,圖如下:

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