2012-05-07 30 views
3

我已經找到與linux x86_64絕對尋址相關的主題: Absolute addressing for runtime code replacement in x86_64。有人告訴我,linux不支持絕對地址。近絕對呼叫(0xFF 0x15)尋址窗口x64

那麼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); 
} 

如果支持64位,如何正確獲取過程地址?

+1

不確定這是什麼,ff 15 xx xx xx xx是一個間接調用,'call qword ptr [offset]'其中* offset *是一個32位帶符號的偏移量,與指令指針無關。尋址位置的8個字節包含要調用的函數的實際地址。 –

+0

也是用於x64的8個字節? – ChatCloud

+0

Erm,地址是64位模式下的8個字節。 –

回答

0

使用

MOV rax, address(your routine)' 
CALL rax 

有在1個命令(市場營銷或任何愚蠢的原因),該模式(還)沒有絕對的呼叫。所提到的組合(必要時用其他臨時註冊表代替)可以讓你得到你想要的。預測者應至少通過將其放置在內存中而不會受到懲罰(呼叫命令本身)來識別此類呼叫。儘管我沒有測試第一次通話處罰,但它應該與具有間接地址的通話相同或更低(當正確對齊時)。