首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算JMP指令地址(x86-64)

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

Stack Overflow用户
提问于 2014-06-28 11:51:01
回答 1查看 882关注 0票数 1

与这里相同的问题:Calculating JMP instruction's address

如何在64位机器上使用这段代码?应该改变什么?

代码语言:javascript
复制
// 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 );
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-28 12:49:16

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

代码语言:javascript
复制
mov rax, CallbackFunction ; 48 b8 xx xx xx xx xx xx xx xx
jmp rax                   ; ff e0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24466513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档