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

时间:2014-01-09 15:46:42

标签: windows assembly nasm portable-executable disassembly

测试平台是windows 32bit。

我使用IDA pro来反汇编PE文件,做一些非常繁琐的转换工作,并将其重新组装成一个新的PE文件。

但是如果我使用OllyDbg,重新组装的PE文件与原始文件有一些区别 调试新的PE文件(尽管我转换的程序集文件中没有这个部分的区别)

以下是原始版本的一部分: enter image description here

参见

PUSH 8 
PUSH 0

是对的。

以下是我的新PE文件的一部分:

enter image description here

现在看

PUSH 8
PUSH 0

更改为

66:6A 08
66:6A 00

导致新PE执行失败。

基本上,从我看到的情况来看,它会导致堆栈的取消对齐

所以有人知道这部分有什么问题吗?我没有看到我转换的汇编代码有什么不同....

有人能给我一些帮助吗?谢谢!

2 个答案:

答案 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位值推送。 (我写了很多汇编代码,从来没有必要这样做。)