C++计算跳转表指向函数的地址

例如调用函数funtest();
在这里插入图片描述

下图是反汇编窗口单步以后代码跳转到0x00411181。
(这是debug模式下的一个跳转表地址)
在这里插入图片描述

当前地址:00411181
当前代码硬编码:E9 FA 05 00 00
汇编代码:jmp
跳转的函数地址:funtest (0411780h)

在硬编码E9 FA 05 00 00中,
E9是jmp指令, 00 00 05 FA是跳转地址和当前代码地址的偏移

// 代码实现:取函数地址
unsigned char *pCode = NULL;
pCode = (unsigned char*)funtest;// 当前代码地址
printf("%当前代码地址:%08X\r\n", pCode);
int offset = *(int*)(pCode + 1);// 取数据 00 00 6B 6D(取偏移),因为当前位置的数据是E9也就是jmp指令所以+1
printf("%偏移:%08X\r\n", offset);
pCode = pCode + offset + 5;// 加5是跳转表硬编码的长度。(当前代码长度)
printf("%目标地址:%08X\r\n", pCode);

代码运行截图:
在这里插入图片描述

总结:目标地址 = 当前代码地址 + 偏移 + 当前代码长度

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值