本篇介绍我自己在逆向分析过程,针对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生成基本的循环和调用的逆向代码框架,图如下:
最后谢谢路过的你观看。
后面还会介绍自己在逆向分析过程制作的工具,以及逆向分析出的结果。