与这里相同的问题: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 );
}发布于 2014-06-28 12:49:16
最终的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 e0https://stackoverflow.com/questions/24466513
复制相似问题