您不能重命名这些位置,因为您自己承认,它们不存在。在这种情况下,如果您不担心维护控制流信息而只想查看地址对应的名称,您可以做几件事。
内嵌注释
您可以编写一个 IDAPython 脚本来:
- 解析你的文本文件
- 定位所有未解析的 BL 调用,提取地址
- 在解析的符号信息中查找名称
- 使用idc.MakeComm(ea, symbol_name)函数 在数据库中使用符号名称创建注释
这将为您提供带有符号名称的内联注释,如下所示:
BL 0x12345678a # _memmap
从符号信息创建一个枚举
如果您想将原始地址的表示更改为字符串,您可以从文本文件中的数据中创建一个枚举,然后将该枚举应用于所有具有未解析目标的 BL 指令的操作数。这应该有效地为您提供该调用目标的名称,即使该地址不存在于数据库中,如下所示:
BL _memmap
您可以通过以下几种方式完成此操作:通过使用 IDAPython 枚举函数 (AddEnum/AddConstEx),假设您已将文本文件处理为 (symbol, addr) 的元组列表:
id = idc.AddEnum(index, "MyEnum", flags)
for symbol, addr in text_info:
idc.AddConstEx(id, symbol, value, bmask)
然后,您可以在 BL 指令中有原始地址的任何地方使用idc.OpEnumEx()函数将该操作数设置为您的枚举类型。
您还可以将您的文本信息文件转换为 C 头文件,并使用单个枚举表示您的映射,但这有点乏味。
请注意,这只是装饰性的。尝试使用任何外部参照功能都会失败,因为它实际上不是数据库中的地址,只是立即值的符号表示。
结论
前面描述的两种方法都可以为您提供所需的信息,而无需向名称列表添加项目。
如果您想维护控制流信息并让它们“在反汇编中正确显示”,则必须创建 plt/got 段来模拟地址空间的其余部分。它有点复杂,但如果您需要进行更复杂的分析或想要利用 IDA 的库识别和类型传播,则是可行的。不过,听起来您只需要符号名称的视觉帮助。希望这可以帮助。