2

我找到了与 linux x86_64 绝对寻址相关的主题: Absoluteaddressing 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 支持,如何正确获取程序地址?

4

1 回答 1

0

利用

MOV rax, address(your routine)'
CALL rax

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

于 2014-10-19T14:58:02.270 回答