Image-relative Offsets 表示当前模块(镜像)在内存中从image base开始的偏移量。
这意味着它们可以用于引用同一模块中的其他位置,而不管其实际的最终加载地址,因此可以用于使代码位置无关(PIC),类似于self-relative offsets。
RVA 的另一个名称是“Relative virtual address”,通常在 PE 文件格式的上下文中使用。
然而,RVA 的优势不仅仅在于 PIC。例如,在 x64-bit platforms 上,RVA 值通常使用 32 bits 而不是像完整指针那样的 64 bits。虽然这使得它们的范围更有限(从 imagebase 开始的 4GiB),但在整个二进制文件中,指针类型值的节省可以是相当可观的。
对于已知的 RVA 值,例如在 PE headers 或 EH structures 中的那些,IDA 通常可以自动将它们转换为 assembler-specific expression:
然而,有时可能需要手动进行转换,例如在处理 IDA 尚未处理的文件格式更新,或使用 RVA 进行寻址的自定义格式/结构时。在这种情况下,您可以使用User-defined offset的另一种变体。
需要开启的选项是Use image base as offset base。启用后,IDA 将忽略输入的偏移基数,并始终使用 imagebase。
然而,即使在 64 位程序中使用这种方法,您可能无法达到预期效果:值将以红色显示以指示错误,并且不会显示带有最终地址的漂亮表达式。
这是因为命令默认使用 OFF32 处理 32 位值,但最终地址不适合 32 位。解决方法很简单:选择 OFF64 而不是 OFF32。
注意:对于 ARM binaries,使用 imagerel
关键字而不是 rva
。
学习资源
立即关注【二进制磨剑】公众号
原文始发于微信公众号(二进制磨剑):IDA技巧(113)image-relative-offsets-rva
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论