计算JMP指令的地址(x86-64)

时间:2014-06-28 11:51:01

标签: assembly c++-cli x86-64 memory-address

与此处相同的问题:Calculating JMP instruction's address

如何在64位计算机上使用此代码?应该改变什么?

// TODO: 64-bit.
void Manager::InjectCode( PBYTE & p, int k, int n ) {

    * p++ = 0xB8; // mov eax, imm32
    p[0] = k;
    p += sizeof( int );

    * p++ = 0xA3; // mov [assemblyId], eax
    ( int * & ) p[0] = & assemblyId; 
    p += sizeof( int * ); 

    * p++ = 0xB8; // mov eax, imm32
    p[0] = n;
    p += sizeof( int );

    * p++ = 0xA3; // mov [functionId], eax
    ( int * & ) p[0] = & functionId; 
    p += sizeof( int * );         

    // jmp to CallbackFunction. 
    * p++ = 0xE9;
    ( UINT & ) p[0] = ( PBYTE ) ::CallbackFunction - 4 - p;
    p += sizeof( PBYTE );
}

1 个答案:

答案 0 :(得分:1)

最终p += sizeof(PBYTE)需要更改为p += 4,因为偏移量仍然是32位,即使指针是64位也是如此。您可能还需要转换为int。这仍然可以在32位模式下工作,因此您不必为此创建单独的版本。您必须确保跳转目标在32位范围内。否则,您可以使用间接跳转:

mov rax, CallbackFunction ; 48 b8 xx xx xx xx xx xx xx xx
jmp rax                   ; ff e0