我正在尝试为 PE、PE+ 和 ELF 可执行文件编写自己的反汇编程序,但我在 PE 和 PE+ 可执行文件上遇到了一个大问题。
我正在通过将我的输出与 objdump 进行比较来检查我的工作,我发现反汇编程序中出现了一些(坏的)操作码。我立即查看了使用说明书来控制这些值;它们在使用说明书中显示为无效。一些例子:
来自 PE 文件的示例:
40dad1: d6 (bad)
其他:
402f1c: ff (bad)
402f1d: ff (bad)
402f1e: ff (bad)
402f1f: ff 01 incl (%ecx) #at last a valid instruction
当我查看手册时这些是有效的,但我无法理解这一点(它是一个 PE+ 文件,架构是 AMD64):
f0 db a5 4e 9c 95 68 lock (bad) [rbp+0x68959c4e]
f0 is lock prefix
db means its a x87 instruction
a5 is ModRM byte(10 100 101) and by looking mod and reg fields we can say it's an invalid instruction
4e 9c 95 68 is used as 4byte disp but why ?
我们是否假设它是一个无效的间接 x87 操作码并且我们继续阅读它作为一个有效的操作码?我想 objdump 选择了这条路。
这些(坏)指令是做什么用的?很明显,它们不是为了对齐;还是我做错了什么?
顺便说一句,我正在尝试反汇编我的旧项目和 FireFox 以检查我的程序是否有效。我是objdump -z -d -M intel XXYYZZ.exe
用来拆机的。