2012-05-07 7 views
3

linux x86_64絶対アドレス指定に関するトピックが見つかりました: Absolute addressing for runtime code replacement in x86_64。絶対アドレス指定はlinuxではサポートされていないと言われました。Windows x64用の絶対呼び出し(0xFF 0x15)アドレッシング

Windows x64では、絶対呼び出しに近いものはありますか? Windows用の

は、関数のアドレスは、このように絶対的なコール(0xFFで0x15の)近くから取得することができますX86:

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

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つのコマンド(マーケティングまたは任意の愚かな理由)で(まだ)そのモードには絶対的な呼び出しはありません。上記の組み合わせ(必要に応じて他の一時的な登録簿に置き換える)は、あなたが望むものを得ることを可能にします。プレディクタは、少なくともペナルティなしでメモリ内に配置することで、そのようなコールを特定する必要があります(コールコマンド自体)。私は最初のコールペナルティはテストしませんでしたが、間接アドレスのコールよりも同じか低い(適切に整列されている)必要があります。