You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IDA中RIP相对跳转地址手动计算结果越界问题排查

问题:x64相对跳转地址手动计算结果超出地址空间

报错信息

Relative jump not pointing to in-range address(相对跳转未指向有效范围内地址)

说明:当前分析的二进制文件经过混淆处理,已知可提取qword类型地址配合偏移0x1b0完成跳转目标计算,但手动计算流程始终得到错误结果。

计算过程复现

针对反汇编中的一条相对跳转指令,按照Intel官方手册规则计算目标地址的步骤如下:

  • 确认指令为5字节长度的相对jmp,指令起始地址为0x1409C9B91
  • 取指令起始地址加5字节指令长度,得到RIP基准值(即该跳转指令执行完成后的下一条指令地址)
  • 提取指令末尾4字节,按小端序解析得到值0xFF8216B2作为跳转偏移
  • 将RIP基准值与偏移相加,得到结果0x2401EB243,该地址不在程序合法地址空间范围内

相关参考截图:
问题相关截图1
反汇编代码截图


错误原因与修正方法

你的计算核心错误是没有对32位有符号偏移做符号扩展,直接将其作为无符号64位整数参与加法运算。
x86_64架构下操作码为E9的近相对跳转规则明确:

  • 指令携带的4字节偏移是32位有符号补码整数,取值范围为-2GB~+2GB,不是无符号整数
  • 64位模式下计算目标地址时,必须先将这个32位值符号扩展为64位,再和RIP基准值相加

你提取到的4字节值0xFF8216B2作为32位有符号数的实际值为-0x7DE94E(十进制-8251214),而非无符号解释下的0xFF8216B2(十进制4286716082)。你直接将无符号解释的大正数和RIP相加,相当于多算了4GB以上的正偏移,结果自然会超出正常程序的地址空间范围。

正确计算流程:

  1. 计算RIP基准值:0x1409C9B91 + 5 = 0x1409C9B96
  2. 符号扩展偏移:32位有符号值0xFF8216B2扩展到64位后为0xFFFFFFFFFF8216B2
  3. 计算最终目标地址:0x1409C9B96 + 0xFFFFFFFFFF8216B2 = 0x1401EB248
    该地址落在Windows x64程序典型的用户态镜像加载区间(基址0x140000000附近),属于合法可映射地址。

内容的提问来源于stack exchange,提问作者Ayyware

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:12:24