fbpx
维基百科

反汇编器

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

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

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

反汇编的问题 编辑

编写一个反汇编器,使其产生的代码在汇编时与原始二进制文件完全一样是可能的;但是,往往这两者之间会有差异。这就对汇编器的表达能力提出了要求。例如,一个x86汇编器对哪怕像MOV AX,BX这样简单的事情,都要在两个二进制代码中任意选择一个。如果原始代码使用的是另一种选择,那么原始代码在任何的时间点上都不能被反汇编器生成。然而,即使产生了一份完全正确的反汇编代码,如果需要修改程序,那么问题仍然存在。例如,同样的机器语言跳转指令可以由跳转到一个指定的位置(例如,执行特定的代码),或者跳转指定的字节数(例如,跳过一个不需要的分支)的汇编代码生成。反汇编器不知道目的是什么,它可以使用任何一种语法来生成一个重现原始二进制的反汇编。然而,如果程序员想在跳转指令和它的目标之间增加指令,就必须了解原程序的操作,以确定跳转应该是绝对的还是相对的:也就是说,它的目的地应该被保持在一个固定的位置,还是被移动以便跳过原来的和增加的指令。

反汇编的例子 编辑

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

任何交互式调试工具都包含一些查看被调试程序的反汇编结果的方法。通常,相同的反汇编工具会被打包成单独的反汇编器,与调试器分开发布。例如,objdumpGNU Binutils的一部分,而它与交互式调试器gdb相关。[1]

反汇编器和仿真器 编辑

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

参见 编辑

参考资料 编辑

  1. ^ Archived copy. [2022-01-25]. (原始内容于2022-01-08). 
  2. ^ Archived copy. [2022-01-25]. (原始内容于2022-01-24). 

拓展阅读 编辑

  • 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.

外部链接 编辑

  • List of x86 disassemblers in Wikibooks
  • Transformation Wiki on disassembly(页面存档备份,存于互联网档案馆
  • Boomerang(页面存档备份,存于互联网档案馆) A general, open source, retargetable decompiler of machine code programs
  • 开放式目录计划中和Disassemblers相关的内容
  • Online Disassembler(页面存档备份,存于互联网档案馆), a free online disassembler of arms, mips, ppc, and x86 code

反汇编器, 此條目介紹的是反汇编, 关于关于另一种类似编程, 请见, 反编译, 此條目翻譯自其他語言維基百科, 需要相關領域的編者協助校對翻譯, 如果您精通本領域, 又能清楚地將來源語言翻譯為中文, 歡迎您協助校訂翻譯, 原文参见维基数据, disassembler, 是一种将机器语言转换为汇编语言的计算机程序, 这与汇编器的目的相反, 与反编译器不同, 反编译器的目标是高级语言而非汇编语言, 的反汇编输出通常格式化为适合人类阅读, 而非用作汇编器的输入源, 因此它主要是一个逆向工程工具, 汇编语言源代码通常允许使. 此條目介紹的是反汇编 关于关于另一种类似编程 请见 反编译 此條目翻譯自其他語言維基百科 需要相關領域的編者協助校對翻譯 如果您精通本領域 又能清楚地將來源語言翻譯為中文 歡迎您協助校訂翻譯 原文参见维基数据 反汇编器 disassembler 是一种将机器语言转换为汇编语言的计算机程序 这与汇编器的目的相反 反汇编器与反编译器不同 反编译器的目标是高级语言而非汇编语言 反汇编器的反汇编输出通常格式化为适合人类阅读 而非用作汇编器的输入源 因此它主要是一个逆向工程工具 汇编语言源代码通常允许使用常量和程序员注释 而这些通常会在汇编器汇编的机器语言中被移除 因此 以机器代码为基础完成的反汇编结果将没有这些常量和注释 阅读输出结果将比阅读源代码更有难度 一些反汇编器提供了内置的代码注释功能 其生成的输出增补了有关被调用API函数或被调用函数参数的注释 一些反汇编器会利用对象文件 例如ELF 中存在的符号调试 英语 Symbolic debugging 信息 例如 IDA允许人类用户在交互式会话中为代码的值或区域标记助记符号 反汇编不是一门精准科学 在有可变宽度指令的复杂指令集 CISC 平台上 使用操作码 英语 Opcode 级编程或存在程序自修改代码时 单个程序可能有两个或多个合理的反汇编结果 程序在运行期间决定实际执行哪个指令被歸約到停机问题 这是已知无法解决的问题 目录 1 反汇编的问题 2 反汇编的例子 3 反汇编器和仿真器 4 参见 5 参考资料 6 拓展阅读 7 外部链接反汇编的问题 编辑编写一个反汇编器 使其产生的代码在汇编时与原始二进制文件完全一样是可能的 但是 往往这两者之间会有差异 这就对汇编器的表达能力提出了要求 例如 一个x86汇编器对哪怕像 span class nf MOV span span class w span span class no AX span span class p span span class no BX span 这样简单的事情 都要在两个二进制代码中任意选择一个 如果原始代码使用的是另一种选择 那么原始代码在任何的时间点上都不能被反汇编器生成 然而 即使产生了一份完全正确的反汇编代码 如果需要修改程序 那么问题仍然存在 例如 同样的机器语言跳转指令可以由跳转到一个指定的位置 例如 执行特定的代码 或者跳转指定的字节数 例如 跳过一个不需要的分支 的汇编代码生成 反汇编器不知道目的是什么 它可以使用任何一种语法来生成一个重现原始二进制的反汇编 然而 如果程序员想在跳转指令和它的目标之间增加指令 就必须了解原程序的操作 以确定跳转应该是绝对的还是相对的 也就是说 它的目的地应该被保持在一个固定的位置 还是被移动以便跳过原来的和增加的指令 反汇编的例子 编辑反汇编器可能独立运行 也可能交互操作 独立的反汇编器被执行时将生成可以查阅的汇编语言文件 交互式反汇编器则立即显示用户所做更改的结果 例如 反汇编器起初可能不知道程序的某一部分是代码 而将其视为数据 如果用户将其指定为代码 则可立即显示据其所生成的反汇编代码 从而使用户尽快查阅和采取进一步行动 任何交互式调试工具都包含一些查看被调试程序的反汇编结果的方法 通常 相同的反汇编工具会被打包成单独的反汇编器 与调试器分开发布 例如 objdump是GNU Binutils的一部分 而它与交互式调试器gdb相关 1 Binary Ninja 英语 Binary Ninja 2 Interactive Disassembler IDA OllyDbg 一个32位汇编级分析调试器 Rizin 页面存档备份 存于互联网档案馆 Cutter 页面存档备份 存于互联网档案馆 Rizin 的 GUI Radare2 英语 Radare2 Hiew 英语 Hiew x64dbg 英语 x64dbg 反汇编器和仿真器 编辑动态反汇编器可以并入到一个仿真器或管理程序的输出中 从而步进 逐行执行要实时执行的机器指令 在此情况下 其包含反汇编后的机器代码行 以及可显示每条指令所引发的寄存器和 或数据改变 或者其他任何状态 英语 State computer science 的改变 例如有条件代码 各个指令的变化都可以在反编译后的指令旁边或下方显示 这从而提供了极为强大的调试信息 有助于最终解决问题 尽管这些信息有时可能非常大 尤其是如果程序很活跃 参见 编辑控制流圖 数据流分析 反編譯器参考资料 编辑 Archived copy 2022 01 25 原始内容存档于2022 01 08 Archived copy 2022 01 25 原始内容存档于2022 01 24 拓展阅读 编辑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 外部链接 编辑List of x86 disassemblers in Wikibooks Transformation Wiki on disassembly 页面存档备份 存于互联网档案馆 Boomerang 页面存档备份 存于互联网档案馆 A general open source retargetable decompiler of machine code programs 开放式目录计划中和Disassemblers相关的内容 Online Disassembler 页面存档备份 存于互联网档案馆 a free online disassembler of arms mips ppc and x86 code 取自 https zh wikipedia org w index php title 反汇编器 amp oldid 80112390, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。