在 IDA Pro 中为任意十六进制值命名

逆向工程 艾达 蟒蛇
2021-06-27 00:18:33

我正在使用 IDA Pro 7.0。

我正在分析一个库,它是一个更大的 ARM 可执行文件的一部分,所以经常调用不在这个库中的外部函数。因此显然调用的地址没有被正确地符号化。例如,程序可能正在调用mmap,它位于0x12345678a,但它显示为

BL              0x12345678a

代替

BL              _mmap

我有一个文本文件,列出了所有外部函数及其地址;即,该文件的其中一行是

12345678a _mmap

所以我想编写一个脚本来根据这个外部文件重命名 IDA 中的位置。

谁能告诉我什么 IDC 或 IdaPython 命令将地址0x12345678a与名称相关联,_mmap以便这些调用在反汇编中正确显示?

类似的东西MakeName(0x12345678a, '_mmap')不起作用,因为0x12345678a我正在检查的库的任何部分都不存在。此外,如果可能,我希望他们不要出现在姓名列表中。

1个回答

您不能重命名这些位置,因为您自己承认,它们不存在。在这种情况下,如果您不担心维护控制流信息而只想查看地址对应的名称,您可以做几件事。

内嵌注释

您可以编写一个 IDAPython 脚本来:

  1. 解析你的文本文件
  2. 定位所有未解析的 BL 调用,提取地址
  3. 在解析的符号信息中查找名称
  4. 使用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 的库识别和类型传播,则是可行的。不过,听起来您只需要符号名称的视觉帮助。希望这可以帮助。