【问题标题】:Assembly decode for x64 JMP instructionx64 JMP 指令的汇编解码
【发布时间】:2016-08-08 17:26:44
【问题描述】:

我是一个非常偶然的汇编用户。所以我需要更专家的帮助来解码我必须处理的一小段代码。

0000:  48 ff 25 61 57 07 00    rex.W jmp QWORD PTR [rip+0x75761]        # 0x75768
0007:  cc                      int3

这是内存间接跳转到rip+0x75761 保存的 8 字节/64 位地址,因此加载跳转目标的绝对地址是 0007 + 0x75761 = 0x75768,对吧?

【问题讨论】:

  • 是的,顺便说一下,R​​EX.W 是多余的。
  • 谢谢!不幸的是,该代码位于客户的 x64 Windows 10 安装中,用于 user32.dll 函数之一。不知道该代码是如何到达那里的,因为它不是标准的 MS 代码。所以我必须为此做出调整。
  • 您确定这是 64 位机器码吗?如果将其反汇编为 32 位代码,则 0x48 字节将是 decinc。 (dec eax 我认为)。
  • 是的,绝对是 64 位。该代码是从 64 位进程内部提取的。不能从 64 位进程调用 32 位 dll 函数。用户可能有一些非常旧的代码覆盖了 API。这是蹦床的东西之一。
  • @user118708 可以从 64 位进程调用 32 位代码,反之亦然,您必须进行远跳转才能更改模式,然后才能调用该进程。它不受官方支持,但你可以做到。

标签: assembly x86 x86-64 disassembly machine-code


【解决方案1】:

这是 x86-64 上的标准尾调用序列,由 Microsoft 编译器生成。

是的,正如你所说,它是间接跳转到 64 位内存地址 0x75768。在执行此代码时,rip 等于 7,因此 rip + 0x75761 == 0x7 + 0x75761 == 0x75768。该代码将无条件地将控制权转移到地址0x75768处的指令。

随后的int 3 只是填充物,但它也用作砖墙。由于前一条指令中的无条件分支,执行永远不会到达这一点。如果是这样,CPU 将陷入陷阱,因为这是“中断”中断。

至于 REX.W 前缀,harold 在技术上是正确的,它是不必要的,但不是出于您可能认为的原因。有点令人惊讶的是,当在 x86-64 上使用通过寄存器的间接跳转时,Windows 需要 REX.W 前缀以确保堆栈展开成功。堆栈展开代码在内部使用它作为信号。 Ross Ridge 写了an excellent answer 关于在 Windows x64 中使用 REX 前缀 JMP 指令的目的。

在这种情况下并不是绝对必要的,因为这是一个与 IP 相关的操作数的间接跳转,但编译器显然无论如何都会发出它。它处理这个问题的逻辑可能并不复杂,而且它可能总是生成此代码以保持一致性。或者,官方文档可能对堆栈展开代码的实现方式并不全面。安全总比抱歉好,因为额外的 REX.W 前缀并没有真正的缺点。

【讨论】:

  • REX.W 由 Microsoft 在其 Windows 10 周年更新中添加到 WIn32 API。即使是可选的,它也是未来操作系统的一部分。
  • 我不明白你在说什么,@user。如何将汇编操作码添加到 API?如果您说 Windows 10 附带的代码使用这种编码,那么是的,它确实如此。所有版本的 64 位 Windows 都具有并且始终具有。没有 32 位 Windows 版本,包括 32 位版本的 Windows 10 周年纪念版。之所以在这里是“可选”的,是因为它实际上对于 IP 相关编码不是必需的。您只需要它进行间接编码。这在 Windows 10 中没有改变。堆栈展开仍然以相同的方式工作。
  • 等等,这不是相对跳跃。它使用 RIP 相对寻址模式来加载 64 位绝对指针。这与 REX.W=1 jmp rel32 有很大不同,因为它是没有间接的尾调用。
  • 如果您说“因为这是与 IP 相关的操作数的间接跳转”,可能会更清楚。否则,您似乎在暗示这是一个相对直接的跳跃。
  • @Theodore x86 架构的基本规则。指令指针总是指向下一条将要执行的指令。所以,当CPU在执行JMP的过程中,指令指针(RIP)指向next指令,在本例中为INT 3,所以它包含值 7。
猜你喜欢
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 2019-03-17
  • 2014-05-28
  • 2014-05-27
相关资源
最近更新 更多