与此处相同的问题: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 );
}
答案 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