分析编译器输出时可以使用目标码“转储”工具,还有一个办法是对可执行文件运行反汇编程序(或称为“反汇编器”)。反汇编程序是这样的工具,它将二进制机器码转换为人可读的汇编语言语句(“人可读”存在争议,但毕竟这是一种思路)。因此,反汇编程序是分析编译器输出的另一种工具。
目标码转储工具(或称为“转储程序”)与复杂的反汇编程序相比,有一个微妙而关键的区别—目标码转储工具都带有简单的反汇编程序,自动化程度高,但当目标码包含奇巧作法(如指令流中有隐藏数据)时就会把这一工具搞得晕头转向;自动化反汇编器用起来很方便,对用户的专业知识要求很少,然而这些程序难以准确地反汇编机器码;成熟的交互式反汇编器虽然需要经过较多练习才能使用得当,但只需稍稍点拨,它就可以反汇编有诀窍的机器码。因此,对于简易的目标码转储程序失灵的场合,适当的反汇编器就能派上用场。幸好大多数编译器不会老发出怪异的代码,以至搞乱目标码转储程序,所以很多时候我们不必学会使用面面俱到的反汇编程序也能应付自如。不过,在简单方法不管用的地方,有个顺手的反汇编程序会很方便。
我们可以得到一些“免费”的反汇编器。本节将说明IDA7反汇编器的用法。IDA是一款基于功能强大且全面的商业级反汇编系统IDA Pro的免费反汇编器。IDA Pro反汇编器可以通过网址链接12找到。
首次运行IDA时,出现如图5-1所示的窗口。
图5-1 IDA起始窗口
点击“New”按钮,输入想要反汇编的 .exe 或 .obj 文件名。输入文件名后,IDA将会给出如图5-2所示的格式设置对话框。在此对话框里选择文件的二进制类型(如PE/COFF文件、PE64可执行文件或纯二进制文件),以及反汇编该文件时的选项。IDA对这些选项会给出适当的默认设置,所以多数情况下只需接受默认值即可,除非要处理的二进制文件比较怪异。
图5-2 IDA的可执行文件格式设置对话框
一般来说,IDA会为标准反汇编过程推测出适当的文件类型信息,然后“自动”反汇编所指定的文件。要产生汇编语言输出文件,请点击“OK”按钮。对先前5.2.3节里示例 t1.c 的可执行文件反汇编后,其前几行输出如下:
IDA是一个交互式的反汇编器,它提供了许多复杂功能,可用于引导反汇编过程生成更恰当的汇编语言文件。不过,倘若只想查看编译器输出来确定其代码生成质量,“automatic”操作模式通常就足矣。要了解IDA免费软件或IDA Pro的更多细节,请翻阅其用户手册(参见网址链接13)。