“66:PUSH 08”中的66代表什么?

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位值推送到堆栈上。 (我写了很多汇编代码,从来没有这样做的需要)。