测试平台为windows 32bit。
我使用 IDA pro 反汇编一个 PE 文件,做一些非常繁琐的转换工作,然后将它重新组装成一个新的 PE 文件。
但是如果我使用OllyDbg,重新组装的PE文件和原来的PE文件有一些区别
调试新的PE文件(虽然这部分在我改造的汇编文件中没有区别)
这是原文的一部分:
查看
PUSH 8
PUSH 0
是正确的。
这是我的新 PE 文件的一部分:
现在看
PUSH 8
PUSH 0
改为
66:6A 08
66:6A 00
并导致新PE执行失败。
基本上,据我所见,它会导致堆栈未对齐。
所以有人知道这部分有什么问题吗?我没有看到我转换的汇编代码有任何区别....
谁能帮帮我?谢谢!
最佳答案
66h 是操作数大小覆盖前缀。在 32 位代码中,它将操作数大小 从默认的 32 位切换为 16 位。所以这里发生的是 PUSH
指令将一个 16 位值而不是 32 位值压入堆栈,并且 ESP
递减 2 而不是 4 . 这就是你在调用后得到不平衡堆栈的原因。
您应该查看汇编程序的文档,了解如何为 PUSH imm
指令强制使用 32 位操作数大小。不同的汇编器为此使用不同的约定。例如,在 NASM 中,您可能会使用类似 push dword 8
的东西。
关于windows - "66:PUSH 08"中的66代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21024746/