2

Linux x86_64 絶対アドレス指定に関連するトピックを見つけました: 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 に答える