2014-01-09 87 views
1

测试平台是windows 32bit。“66:PUSH 08”中的66代表什么?

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

但在重新组装的PE文件中的一些差异,如果我用OllyDbg的
调试新的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执行。

基本上,从我所看到的,它导致堆栈的未对齐

那么有人知道这部分有什么问题吗?我没有看到我转换的汇编代码有任何区别......

任何人都可以给我一些帮助吗?谢谢!

+1

听起来像OpCode的32位版本。看看:http://stackoverflow.com/questions/11291151/how-push-imm-encodes。 – sircodesalot

回答

4

66h是操作数大小覆盖前缀。在32位代码中,它将操作数大小从默认的32位切换为16位。所以在这里发生的是PUSH指令在栈上而不是在32位上的16位值,ESP减少2而不是4。这就是为什么你会在调用后得到不平衡的栈。

您应该检查汇编器的文档,看看如何强制执行PUSH imm指令的32位操作数大小。不同的汇编程序使用不同的约定。例如,在NASM中,你可能会使用类似push dword 8的东西。

+0

是否真的把ESP减2,而不是4?我不认为x86-32架构会允许人们这样做;如果机器在那个时候发生中断会发生什么? –

+0

@Igor,谢谢!我发现我的转换代码存在问题并修复它! – computereasy

4

这是一个 “前缀” 操作码字节:见http://wiki.osdev.org/X86-64_Instruction_Encoding#Legacy_Prefixes

0x66意味着 “操作数大小覆盖”。您的代码显然是在32位模式下运行;没有前缀的PUSH将推送一个32位的值。我认为这样做会导致PUSH获取一个位值,并将其作为32位值推入堆栈。 (我写了很多汇编代码,并且从未需要这样做)。

+0

谢谢你的回答@Ira! – computereasy

相关问题