IDA中RIP相对跳转地址手动计算结果越界问题排查
问题:x64相对跳转地址手动计算结果超出地址空间
报错信息
Relative jump not pointing to in-range address(相对跳转未指向有效范围内地址)
说明:当前分析的二进制文件经过混淆处理,已知可提取qword类型地址配合偏移0x1b0完成跳转目标计算,但手动计算流程始终得到错误结果。
计算过程复现
针对反汇编中的一条相对跳转指令,按照Intel官方手册规则计算目标地址的步骤如下:
- 确认指令为5字节长度的相对
jmp,指令起始地址为0x1409C9B91 - 取指令起始地址加5字节指令长度,得到RIP基准值(即该跳转指令执行完成后的下一条指令地址)
- 提取指令末尾4字节,按小端序解析得到值
0xFF8216B2作为跳转偏移 - 将RIP基准值与偏移相加,得到结果
0x2401EB243,该地址不在程序合法地址空间范围内
相关参考截图:

错误原因与修正方法
你的计算核心错误是没有对32位有符号偏移做符号扩展,直接将其作为无符号64位整数参与加法运算。
x86_64架构下操作码为E9的近相对跳转规则明确:
- 指令携带的4字节偏移是32位有符号补码整数,取值范围为-2GB~+2GB,不是无符号整数
- 64位模式下计算目标地址时,必须先将这个32位值符号扩展为64位,再和RIP基准值相加
你提取到的4字节值0xFF8216B2作为32位有符号数的实际值为-0x7DE94E(十进制-8251214),而非无符号解释下的0xFF8216B2(十进制4286716082)。你直接将无符号解释的大正数和RIP相加,相当于多算了4GB以上的正偏移,结果自然会超出正常程序的地址空间范围。
正确计算流程:
- 计算RIP基准值:
0x1409C9B91 + 5 = 0x1409C9B96 - 符号扩展偏移:32位有符号值
0xFF8216B2扩展到64位后为0xFFFFFFFFFF8216B2 - 计算最终目标地址:
0x1409C9B96 + 0xFFFFFFFFFF8216B2 = 0x1401EB248
该地址落在Windows x64程序典型的用户态镜像加载区间(基址0x140000000附近),属于合法可映射地址。
内容的提问来源于stack exchange,提问作者Ayyware
相关产品推荐
相关产品推荐

