【问题标题】:Call absolute address in x64在 x64 中调用绝对地址
【发布时间】:2018-07-12 18:18:06
【问题描述】:

我想不通,我可以做一个这样的指令,它没有问题

call ffffdd80d60e4000

但是我将如何将其转换为字节?我查看了内存中的指令并显示了一些奇怪的东西,例如

0xe8 0x00 0x40 0x0e 0xd6

我唯一能识别的是 e8 ,它是调用操作码。有人能解释一下其他 4 个字节是什么吗?如果我需要调用的地址是 DWORD64 值,我将如何将这样的指令转换为字节数组?我试过了,我不能简单地复制地址的字节并在开头添加一个 0xe8 。 对不起,如果这可能是一个愚蠢的问题,但我搜索了书籍和网站,但找不到任何相关信息。

【问题讨论】:

  • 这是一个相对地址。您需要知道当前(实际上是以下)指令的地址并计算与目标的差异。另请参阅基本架构手册中的7.3.8.1 无条件传输指令部分。
  • 嗯,好的,谢谢。这很奇怪,因为我正在查看 x64 asm 文档,它说 e8 是对绝对地址的调用。我想我可以计算一下。
  • 你看错了。手册上说:E8 cd CALL rel32 调用近、相对、相对于下一条指令的位移。
  • 相关:使用 NASM 中的 target - ($ + 5) 手动编码 call 指令:How does $ work in NASM, exactly?

标签: assembly x86-64 function-pointers


【解决方案1】:

正如 Jester 所说,通常调用使用相对地址。如果你想使用绝对地址,你可以像这样将目的地放在一个寄存器中:

    48 b8 00 40 0e d6  mov rax, 0xffffdd80d60e4000
    80 dd ff ff
    ff d0              call rax

您也可以调用内存中的地址。例如,如果目标地址在内存中的 [rsp+8] 处,则

    ff 54 24 08        call [rsp+8]

【讨论】:

  • 是的,我之前曾考虑将其放入寄存器中,但它并不能真正满足我的目的,因为该指令每秒或更少会被调用一次,并且寄存器值将被覆盖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多