32 位和 64 位反汇编程序的区别

逆向工程 拆卸 调试器 反汇编者 x64dbg
2021-06-11 11:21:15

就我的理解水平而言,32 位和 64 位反汇编器之间的唯一区别是 32 位反汇编器生成的汇编代码仅使用 32 位汇编指令,而 64 位反汇编器也使用 64位指令和寄存器。

我的问题是,使用 64 位反汇编器比使用 32 位反汇编器有什么优势?

此外,如果我想反汇编为 64 位机器编译的程序,我可以使用像 OllyDBG 这样的 32 位反汇编器吗?输出与像 x64dbg 这样的 64 位反汇编器有何不同?

2个回答

“32 位反汇编器”和“64 位反汇编器”没有固定定义。这些术语实际上是模棱两可的。

32 位和 64 位仅指 CPU 架构。特别是诸如寄存器大小和总线大小之类的东西。这些可以适用于很多事情。

具体来说,在反汇编程序的情况下,它们可以应用于两件事:

  1. 编译反汇编程序二进制文件的 CPU 架构
  2. 反汇编器能够反汇编的CPU架构。

此外,还有多个 CPU 系列有 32 位和 64 位两种版本。今天最相关的是英特尔和 AMD,以及 ARM。

这些都是独立的。您可以编译一个反汇编程序以在 32 位 Intel 机器上运行,该程序能够反汇编应该在 64 位 ARM 处理器上运行的二进制文件。

现在在同一个 CPU 中,64 位架构可能是也可能不是之前 32 位架构的扩展。英特尔就是这种情况。

因此,32 位二进制文​​件通常可以在 32 位机器或 64 位机器上运行,但 64 位二进制文​​件只能在 64 位机器上运行,因为它会使用指令、寄存器、寻址方式等比32位机不支持。

同样,如果您尝试使用专为反汇编同一 CPU 系列的 32 位二进制文​​件而设计的反汇编程序来反汇编 64 位二进制文​​件,它将只能识别 32 位指令、寄存器、寻址模式等。所有的64 位特定的东西只会混淆反汇编器。

我对 OllyDBG 或 x64dbg 都不熟悉,所以我不知道它们的功能。

您似乎认为“32 位反汇编器”会以某种方式将 64 位代码转换或翻译成 32 位代码。这是不可能的。那将属于交叉编译和仿真领域。

32 和 64 的不同之处比你想象的要多。您有几乎相同的二进制代码,但在 64 位上,您对 64 位寄存器和 64 位数据进行操作。32 和 64 是关于数据而不是代码。在 64 位代码上使用 OllyDBG 没问题,但是:

  • 您必须注意您对 64 位数据进行操作。
    IE。当 Olly 显示 MOV DWORD[PTR] 时,EAX 就真正移动了 8 个字节。
  • 像 INC EAX 这样的一字节指令在 64 位上不存在。
    当 OllyDBG 显示一字节即 INC EAX 时,这是一个 64 位前缀。
    所以:XOR EAX,EAX
    INC EAX
    JZ 将在 32 和 64 上运行不同
  • 可能还有更多问题