在 IDA Pro 中识别 RVA 数据

逆向工程 艾达 蟒蛇
2021-07-08 00:04:05

我想读取 IDA Pro 中给定地址的数据值。我发现它可以通过 DWord(address) 函数来实现。但是,如果该值为函数的 RVA(如下所示),则 Dword() 会按预期给出 RVA 7E094D(其中 image_base 为 300000)。

.rdata:00CC0024                 dd rva sub_AE094D

有什么简单的方法 IDA Pro/Python 脚本可以告诉我数据值是 RVA,以便我可以将 image_base 添加到它以获取绝对地址?

2个回答

下面的代码容易出现“误报”,但总比没有好:

def is_rva(ea):
    original_ea = ScreenEA()
    Jump(ea)
    found = " rva " in GetCurrentLine()
    Jump(original_ea)
    return found

希望有人可以提供比这更好的答案(实际检查 IDA 的内部表示而不是进行字符串比较的代码),但如果没有,也许这将满足您的需求。

如果您知道基数,则可以使用“偏移量(用户定义) ”命令(默认为 Ctrl+R)“强制”显示偏移量然后,您可以指定必须计算偏移量的基数,IDA 基本上会添加和减去基数,因此它会给出:

RVA 0x1234 与基地址 0x400000 => (loc_401234 - 0x400000)

不幸的是,没有简单的方法可以区分小常量和 RVA,除了查看目的地是否已经有名称之外,这很容易出错,因为对该位置的唯一引用可能与您正在操作的 RVA 完全相同。我最好的猜测是手动检查每个值或定制启发式方法。