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
在 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