c++ - Windows x64 的近绝对调用 (0xFF 0x15) 寻址

标签 c++ windows assembly reverse-engineering 64-bit

我找到了与 linux x86_64 绝对寻址相关的主题: Absolute addressing for runtime code replacement in x86_64 .被告知 linux 不支持绝对寻址。

windows x64 是否支持近绝对调用?

对于 windows x86,可以通过这种方式从近绝对调用 (0xFF 0x15) 中获取函数的地址:

unsigned char call_nearAbsolute[2] = {0xFF, 0x15};

if(memcmp(bytes, call_nearAbsolute, sizeof(call_nearAbsolute)) == 0) {
{        
    unsigned char offset[] = {
                *(bytes + 0x5),
                *(bytes + 0x4),
                *(bytes + 0x3),
                *(bytes + 0x2)
            };
        PDWORD_PTR absolute_addr = 
        (PDWORD_PTR)(((offset[0] & 0xFF) << 24) | 
        ((offset[1] & 0xFF) << 16) | 
            ((offset[2] & 0xFF) << 8) | 
        offset[3] & 0xFF);
}

如果支持x64,如何正确获取程序地址?

最佳答案

使用

MOV rax, address(your routine)'
CALL rax

在 1 个命令(营销或任何愚蠢的原因)中(还)没有绝对调用该模式。提到的组合(必要时用其他临时寄存器替换它)可以让你得到你想要的。预测器应该至少通过它在内存中的位置来识别这种调用而不会受到惩罚(调用命令本身)。虽然我没有测试第一个调用惩罚,但它应该与使用间接地址的调用相同或更低(当正确对齐时)。

关于c++ - Windows x64 的近绝对调用 (0xFF 0x15) 寻址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10480709/

相关文章:

c++ - 如何将类中的函数作为参数传递给 C++11 中同一类中的另一个函数?

c++ - "greater"仿函数给出编译器错误

windows - 如何通过命令行设置windows服务用户名和密码

java - 如何使用java将文件从windows文件夹写入unix文件夹

windows - 输入文件中的 set/p 仅适用于批处理文件中的第一行

assembly - 每条机器语言指令执行需要多长时间?

c++ - 我应该使用多少个随机数生成器?

C++11:是什么阻止存储提升超过锁的临界区的开始?

c - 用Visual C++编译器解释空C `main`函数奇怪的汇编

assembly - 带段寄存器的 x86-64 MOV 指令上的 REX.W 前缀