接近Windows x64的绝对调用(0xFF 0x15)寻址

时间:2012-05-07 10:48:11

标签: 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支持,如何正确获取程序地址?

1 个答案:

答案 0 :(得分:0)

使用

MOV rax, address(your routine)'
CALL rax

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