在IDA中,如果我更改结构成员的类型(使用D热键)并转储到该IDC文件中的idc数据库,它会正确地为该成员生成AddStrucMember命令。
问题是,如果我再次更改该成员(仍然使用D)然后加载以前生成的IDC脚本,则无法将所述成员返回到其原始状态。
答案 0 :(得分:1)
<强>测试强>
使用虚拟结构进行测试:
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)//已在此偏移处拥有成员
可能的解决方案
所以,最好的选择是删除现有的struct,你可以在struct窗口使用del
键,或者使用DelStruc
使用python / idc:
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