反汇编程序是如何工作的?
您基本上有两种选择:
线性扫描
读取前 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 编写的,非常容易学习和破解。

