在 x64 中调用绝对地址

noo*_*dev 2 assembly function-pointers x86-64

我无法弄清楚这一点,我可以做出这样的指令,它工作没问题

call ffffdd80d60e4000
Run Code Online (Sandbox Code Playgroud)

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

0xe8 0x00 0x40 0x0e 0xd6
Run Code Online (Sandbox Code Playgroud)

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

prl*_*prl 5

正如 Jester 所说,通常调用使用相对地址。如果你想使用绝对地址,你可以将目的地放入寄存器中,如下所示:

    48 b8 00 40 0e d6  mov rax, 0xffffdd80d60e4000
    80 dd ff ff
    ff d0              call rax
Run Code Online (Sandbox Code Playgroud)

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

    ff 54 24 08        call [rsp+8]
Run Code Online (Sandbox Code Playgroud)