请耐心等待,因为我是IDA的新手,还没有设法在Google或其他相关商店中找到我的问题的答案。头文件定义了各种内存位置,如下所示:

#define IO_LCD_OUT 0x4000000


是否有一种方法可以将该头文件加载到IDA中以重新定义立即值?

例如,代替:

MOV     R12, #0x4000000


可以代替IDA打印:

MOV     R12, IO_LCD_OUT


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

评论

尝试解析C标头文件时收到什么错误消息?

我没有收到任何错误消息,它可以很好地加载文件。我只是不知道如何更改立即值的显示方式。例如,当我右键单击0x4000000时,没有选项允许我将其定义为头文件中的变量

#1 楼

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


转到枚举列表(Shift + F10)。
为您添加一个新的枚举常量列表(Ins)
添加列表(N)的常量,例如名称IO_LCD_OUT和值0x4000000

现在您应该可以使用M或上下文菜单在反汇编中替换这些常量。 />

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


评论


您是否可以交叉引用已定义常量中提到的地址(例如#define IO_LCD_OUT 0x4000000)?如果是,那怎么可能?

– w s
2014年11月18日13:39

不会,尽管我们正在考虑添加此功能,但目前仍未维护对枚举的交叉引用。

–伊戈尔·斯科钦斯基♦
2014年11月18日14:43

#2 楼

导入头文件将无法完成这项工作,因为没有通用的方法可以找出任何已定义常量的含义。

您需要为此进行一些手动工作。

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


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

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

评论


当这些值是指内存而不只是标志或其他内容时,这可能是更好的方法。

–伊戈尔·斯科钦斯基♦
2014年11月18日14:46