IDA 6.9 IDC 添加结构成员

IDA 6.9 IDC AddStrucMember

在 IDA 中,如果我更改结构成员的类型(使用 D 热键)并转储到该 IDC 文件中的 idc 数据库,它会为该成员正确生成 AddStrucMember 命令。

问题是,如果我再次更改该成员(仍然使用 D),然后加载之前生成的 IDC 脚本,它无法 return 将所述成员恢复到其原始状态。

测试

使用虚拟结构进行测试:

00000000 FooTest         struc ; (sizeof=0x8, mappedto_126)
00000000 f0              dd ?
00000004 f2              dd ?
00000008 FooTest         ends

导出到 IDC (File > Produce File > Dump typeinfo to IDC file...)

更改为以下内容:

00000000 FooTest         struc ; (sizeof=0x8, mappedto_126)
00000000 f0              dw ?
00000002 f1              dw ?
00000004 f2              dd ?
00000008 FooTest         ends

重新加载 idc 文件没有任何改变...

检查

正在检查python:

Python>id = GetStrucIdByName("FooTest");
Python>id
18374686479671636282
Python>mid = AddStrucMember(id,"f0",    0,  0x20000400, -1, 4)
Python>mid
-2

根据documentation-2是错误的:

STRUC_ERROR_MEMBER_OFFSET (-2) // already has member at this offset

可能的解决方案

因此,最好的选择是删除现有结构,您可以在结构 window 或 python / idc 上使用 del 键和 DelStruc

Python>id = GetStrucIdByName("FooTest")
Python>id
18374686479671636398
Python>r = DelStruc(id)
Python>r
True

然后重新加载(备份)idc 文件。

结构返回,已保存(注意 mappedto_xxx 已更改):

00000000 FooTest         struc ; (sizeof=0x8, mappedto_127)
00000000 f0              dd ?
00000004 f2              dd ?
00000008 FooTest         ends