windows - "66:PUSH 08"中的66代表什么?

标签 windows assembly nasm portable-executable disassembly

测试平台为windows 32bit。

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

但是如果我使用OllyDbg,重新组装的PE文件和原来的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执行失败。

基本上,据我所见,它会导致堆栈未对齐

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

谁能帮帮我?谢谢!

最佳答案

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/

相关文章:

c++ - FreeConsole 然后 AttachConsole 不工作

windows - 创建脚本语言

c++ - 如何在 64 位 Qt 应用程序中使用 32 位汇编函数?

assembly - 有好的 NASM/FASM 教程吗?

c++ - 组织跨平台的C/C++项目

asp.net - 开源CMS(Windows、.NET)推荐

assembly - 为什么我们需要回邮地址?

c++ - 从 ida pro Hook 用户调用函数

assembly - 调用函数后内核出现三重错误

c - 切换到更高分辨率