近绝对呼叫(0xFF 0x15)寻址为Windows x64

我已经find与linux x86_64绝对寻址相关的主题:x86_64中用于运行时代码replace的绝对寻址 。 有人告诉我,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 

在这个模式(还没有)绝对没有一个命令(营销或任何愚蠢的理由)。 所提到的组合(必要时替换为其他临时登记)可以让你得到你想要的。 预测者应该至少通过将其放置在记忆中来识别这种呼叫而不会受到惩罚(呼叫命令本身)。 虽然我没有测试第一次通话的惩罚,但它应该是相同或更低(当正确对齐)比间接地址的呼叫。