测试平台是windows 32bit。
我使用IDA pro来反汇编PE文件,做一些非常繁琐的转换工作,并将其重新组装成一个新的PE文件。
但是如果我使用OllyDbg,重新组装的PE文件与原始文件有一些区别 调试新的PE文件(尽管我转换的程序集文件中没有这个部分的区别)
以下是原始版本的一部分:
参见
PUSH 8
PUSH 0
是对的。
以下是我的新PE文件的一部分:
现在看
PUSH 8
PUSH 0
更改为
66:6A 08
66:6A 00
导致新PE执行失败。
基本上,从我看到的情况来看,它会导致堆栈的取消对齐。
所以有人知道这部分有什么问题吗?我没有看到我转换的汇编代码有什么不同....
有人能给我一些帮助吗?谢谢!
答案 0 :(得分:4)
66h是操作数大小覆盖前缀。在32位代码中,它将操作数大小从默认的32位切换为16位。所以这里发生的是PUSH
指令在堆栈上推送一个16位值而不是32位值,ESP
递减2而不是4.这就是你失去平衡的原因电话结束后堆叠。
您应该检查汇编程序的文档,看看如何强制PUSH imm
指令的32位操作数大小。不同的汇编程序使用不同的约定。例如,在NASM中,您可能会使用类似push dword 8
的内容。
答案 1 :(得分:4)
这是一个“前缀”操作码字节:见http://wiki.osdev.org/X86-64_Instruction_Encoding#Legacy_Prefixes
0x66表示“操作数大小覆盖”。您的代码可以在32位模式下运行;没有前缀的PUSH将推送32位值。我认为这样做会导致PUSH获取 16 位值,并将其作为堆栈上的32位值推送。 (我写了很多汇编代码,从来没有必要这样做。)