本页使用了标题或全文手工转换

反汇编器

维基百科,自由的百科全书
跳到导航 跳到搜索

反汇编器(disassembler)是一种将机器语言转换为汇编语言计算机程序——这与汇编器的目的相反。反汇编器与反编译器不同,反编译器的目标是高级语言而非汇编语言。反汇编器的反汇编输出通常格式化为适合人类阅读,而非用作汇编器的输入源,因此它主要是一个逆向工程工具。

汇编语言源代码通常允许使用常量英语Constant (programming)和程序员注释,而这些通常会在汇编器汇编的机器语言中被移除。因此,以机器代码为基础完成的反汇编结果将没有这些常量和注释,阅读输出结果将比阅读源代码更有难度。一些反汇编器提供了内置的代码注释功能,其生成的输出增补了有关被调用API函数或被调用函数参数的注释。一些反汇编器会利用对象文件(例如ELF)中存在的符号调试英语Symbolic debugging信息。例如,IDA允许人类用户在交互式会话中为代码的值或区域标记助记符号。

反汇编不是一门精准科学:在有可变宽度指令的复杂指令集(CISC)平台上,使用操作码英语Opcode级编程或存在程序自修改代码时,单个程序可能有两个或多个合理的反汇编结果。程序在运行期间决定实际执行哪个指令被歸約停机问题,这是已知无法解决的问题。

反汇编的问题[编辑]

反汇编的例子[编辑]

反汇编器可能独立运行,也可能交互操作。独立的反汇编器被执行时将生成可以查阅的汇编语言文件;交互式反汇编器则立即显示用户所做更改的结果。例如,反汇编器起初可能不知道程序的某一部分是代码,而将其视为数据;如果用户将其指定为代码,则可立即显示据其所生成的反汇编代码,从而使用户尽快查阅和采取进一步行动。

任何交互式调试工具都包含一些查看被调试程序的反汇编结果的方法。

例如,objdump英语objdumpGNU Binutils的一部分,而它与交互式调试器gdb相关。

反汇编器和仿真器[编辑]

动态反汇编器可以并入到一个仿真器管理程序的输出中,从而步进、逐行执行要实时执行的机器指令。在此情况下,其包含反汇编后的机器代码行,以及可显示每条指令所引发的寄存器和/或数据改变(或者其他任何状态英语State (computer science)的改变,例如有条件代码),各个指令的变化都可以在反编译后的指令旁边或下方显示。这从而提供了极为强大的调试信息,有助于最终解决问题,尽管这些信息有时可能非常大,尤其是如果程序很活跃。

参见[编辑]

参考资料[编辑]

拓展阅读[编辑]

  • L. Vinciguerra, L. Wills, N. Kejriwal, P. Martino, and R. Vinciguerra, "An Experimentation Framework for Evaluating Disassembly and Decompilation Tools for C++ and Java", Proc. of 10th Working Conference on Reverse Engineering (WCRE) 2003.
  • B. Schwarz, S. Debray, and G. Andrews, "Disassembly of Executable Code Revisited", Proc. of 9th Working Conference on Reverse Engineering (WCRE), pp. 45–54, 2002.

外部链接[编辑]