导入带有内存位置定义的 C 头文件

逆向工程 艾达
2021-07-07 08:27:10

请耐心等待,因为我是 IDA 的新手,还没有设法在谷歌或其他相关网点上找到我的问题的答案。

我正在从一个 ARM 设备反转固件 blob,我有一个 ac 头文件,定义了不同的内存位置,如下所示:

#define IO_LCD_OUT 0x4000000

有没有办法可以将此头文件加载到 IDA 中以重新定义立即值?

例如,而不是:

MOV     R12, #0x4000000

IDA 可以代替打印:

MOV     R12, IO_LCD_OUT

除了我试图解决这个问题之外,还有其他方法可以实现这个结果吗?我有定义了内存位置的头文件,并希望将该信息加载到 ida 中!

我尝试使用 File -> Load File -> Parse C Header File 解析它,但没有运气!

2个回答

您可以在此处使用自定义枚举。

  1. 转到枚举列表 ( Shift+ F10)。
  2. 为您的常量列表添加一个新的枚举 ( Ins)
  3. 将常量添加到列表 ( N),例如名称IO_LCD_OUT和值0x4000000
  4. 现在您应该能够在反汇编、使用M或上下文菜单中替换这些常量

您可以通过以下方式加快速度:

  1. 从头生成 IDC 文件以编程方式构建枚举(使用函数AddEnumAddConstEx)。h2enum.idc脚本也可能起作用。
  2. 将这些定义转换为 C 样式enum,解析标题,然后使用从反汇编中导入的枚举(您需要首先Synchronize to idb在本地类型中执行步骤)。

导入头文件不会做这项工作,因为没有通用的方法来找出任何定义的常量的含义。

你需要为它做一些手工工作。

我按如下方式处理这个问题(它需要一些 IDA 脚本,但应该很容易):

  1. 对于所有需要的内存区域(例如 LCD),应使用idc.AddSegIDAPython api 或通过 IDA UI创建数据段这些区域的地址可以从数据表或通过分析头文件收集。
  2. 所有这些地址含义定义都应该从头文件中提取出来,并通过idc.MakeNameIDAPython api转换为全局变量名
  3. 二进制应该重新分析(选项-->常规-->分析-->重新分析程序)。如果地址仍然无法识别,您将需要编写 IDAPython 脚本,通过idc.OpOffIDAPython api将这些地址转换为偏移量

据我所知,目前 IDA 中没有针对此问题的通用解决方案。