testing平台是Windows 32位的。
我使用IDA pro反汇编一个PE文件,做一些非常繁琐的转换工作,并将其重新组装成一个新的PE文件。
但是如果我使用OllyDbg,重新组合的PE文件和原来的文件有一些区别
debugging新的PE文件(虽然在我转换的程序集文件中这部分没有区别)
这是原来的一部分:
看到了
PUSH 8 PUSH 0
是正确的。
这是我的新PE文件的一部分:
现在看
PUSH 8 PUSH 0
更改为
66:6A 08 66:6A 00
导致新的PE执行失败。
基本上,从我所看到的,它导致了堆栈的不一致。
那么有人知道这部分有什么问题吗? 我看不到在我转换的汇编代码中的任何差异….
任何人都可以给我一些帮助吗? 谢谢!
66h是操作数大小覆盖前缀 。 在32位代码中,它将操作数大小从默认的32位切换到16位。 所以在这里发生的是, PUSH
指令在栈上而不是在32位上推动一个16位的值,而ESP
则减少2而不是4。这就是为什么你在调用之后得到不平衡的栈。
您应该检查汇编器的文档,看看如何强制32位操作数大小的PUSH imm
指令。 不同的汇编程序使用不同的约定。 例如,在NASM中,你可能会使用像push dword 8
这样的东西。
它是一个“前缀”操作码字节:请参阅http://wiki.osdev.org/X86-64_Instruction_Encoding#Legacy_Prefixes
0x66表示“操作数大小覆盖”。 你的代码显然是在32位模式下运行的; 没有前缀的PUSH将推送一个32位的值。 我认为这样做会导致PUSH获取16位值,并将其作为32位值推送到堆栈上。 (我写了很多汇编代码,从来没有这样做的需要)。