我正在使用 idapython 编写一个 IDA 插件,以便向结构类型的变量添加注释(位于数据库中)。为了做到这一点,首先,我需要获取对给定结构类型(例如 struct BITMAPINFO)的交叉引用列表,该列表可以在 IDA 的“结构”子视图中找到。
我知道 IDA 从 6.2 版开始通过鼠标右键单击结构名称并选择“列出交叉引用”来提供此功能。将弹出如下窗口:
上图中的列表中的每一项要么是声明了 %structure name% 类型的全局变量(这里是 BITMAPINFO)的地址,要么是定义了“结构名”类型的局部变量的位置。前者就像
我想知道是否有办法通过IDAPython获取这些数据。
注意:这不同于对结构类型的(ll)个成员的交叉引用,可以通过鼠标右键单击结构成员名称来获得,如下所示
在问这里之前,我这样做:
#CODE 1
ea = idc.LocByName(%structure name%)
frm = [x.frm for x in idautils.XrefsTo(ea)]
我想我已经使用上面的代码获得了 %structure name% 的完整交叉引用列表。但是,我发现列表中的许多 EA 似乎无效,例如“0xff0052c9”(MaxEA 为 0x108f800)。但是,我想我的代码已经得到了想要的结果,因为返回列表的长度等于列表中的项目数,如第一张图片所示。但我无法解释结果,尤其是(看似)无效的结果。此外,当我使用以下代码向列表中的地址添加注释时
#CODE 2
for ea in xrefs_list:
# each cross-reference to the given struc type
if repeatable:
# add repeatable comment 'cmt' at address 'ea'
idc.MakeRptCmt(ea, cmt)
else:
# add comment 'cmt' at address 'ea'
idc.MakeComm(ea, cmt)
我发现我只在idc.MinEA()和idc.MaxEA()之间的有效地址中添加了注释,这些地址是声明查询结构类型的全局实例的地方,如第二张图所示。
我的问题是:
- 我上面的代码(CODE 1)是否正确获取结构类型的所有交叉引用?如果是,如何解释那些看似无效的地址(0xFF000000以上)
- 除了对 struct 类型的全局实例的引用之外,如何向其他交叉引用地址添加注释?