反汇编程序是如何工作的?

逆向工程 部件 可执行 反汇编者
2021-06-26 02:32:47

一个简单的可移植可执行文件如下所示:

在此处输入图片说明

我想知道反汇编程序如何解析 .text...以生成汇编代码?

因为他的原始格式的PE文件似乎无法使用,并且不包含可读格式的机器指令。

我在考虑要么使用分层程序,要么将程序加载到内存中并由反汇编程序执行转储。

谢谢 !

3个回答

您基本上有两种选择:

线性扫描

读取前 N 个字节,直到获得正确的操作码(例如,05 14 00 00 00 反编译以添加 eax,0x14)。反汇编下一个操作码。您将读取一些数据部分并获得无效的操作码。您可以跳过该过程或将这些“指令”标记为错误并继续进行,直到您获得下一个有效的操作码并按照所述继续。

递归遍历

读取前 N 个字节,直到获得正确的操作码。继续,直到您拆卸任何类型的跳跃,存储您的当前位置,跟随跳跃并按照描述进行。当你得到一个无效的操作码时停止反汇编并在之前存储的位置恢复。

这两种方法都需要一些基本信息,例如

  • 你的程序代码从哪里开始?
  • 代码用于什么架构?

其中一些信息是标题的一部分(例如,在 PE-oder ELF 文件中)。

Linux Interactive DisAssembler (LIDA) 简要介绍了程序如何反汇编代码以及 objdump 如何工作。这是熟悉该主题的良好起点。

有多种反汇编文件的方法。并注意 .text 只是段的名称,您可以将其称为 .flups 所有操作系统关心。

有趣的是:

  • OEP 在该部分内
  • 该部分具有读取和执行权限。

反汇编程序可以直接跳转到 EOP 并开始读取字节(操作码)(http://ref.x86asm.net/)。它可以从上到下开始阅读,也可以枚举结果,例如按照调用/jmps 来查找奇怪的代码。

此外,在 DosHeader 中,还有对此处 PE 开始位置的引用。这个有 OEP 给你。

阅读radare源代码可以帮助你真正理解反汇编器。

在拥有原始 PE、ELF 等文件之间确实发生了大量处理,以便能够反汇编它并在漂亮的 UI 中显示:加载和解析文件、处理可执行部分、将偏移量转换为虚拟地址、助记反汇编本身,反汇编指令的部分注释,以允许例如交叉引用代码/数据的不同部分并在它们之间轻松导航等。

您可以研究许多开源反汇编程序的代码,以更深入地了解内部工作原理(或根据您的需要进行改进!)。例如,ScratchABit是用 Python 编写的,非常容易学习和破解。

在此处输入图片说明