IDAPython:更改结构成员内容名称

逆向工程 蟒蛇 idapro插件
2021-06-21 00:29:06

tl;dr 我有一个结构数组,我想在简单的条件下迭代它并更改字段内容(名称、值)。我可以获得成员的偏移量,但由于上述错误,我无法修改它们。


我在 IDA 中有以下结构:

LOAD:86B70B00 22 F6 DC 86 24 F6 DC+stru_86B70B00   Commands_Array <asc_86DCF622, aQueryOrSetAnSR,          2, \
LOAD:86B70B00 86 02 00 00 00 89 F6+                                        ; DATA XREF: sub_85C73BBC+42o
LOAD:86B70B00 D2 85 DF F6 D2 85 00+                                        ; LOAD:off_85C73D78o
LOAD:86B70B00 00 00 00 00 00 00 00+                                           sub_85D2F688+1, sub_85D2F6DE+1>; 0 ; "S" ...
LOAD:86B70B00 3F F6 DC 86 45 F6 DC+                Commands_Array <0, 0, 0x86DCF63F, Byte_Nothing, sub_0+2>; 1
LOAD:86B70B00 86 02 00 00 00 00 00+                Commands_Array <0, 0,          0, sub_0, asc_86DCF646>; 2
LOAD:86B70B00 00 00 00 00 00 00 00+                Commands_Array <aDial, sub_0+3, 0x85CAECA9, sub_85CAECAC+1,\
LOAD:86B70B00 00 00 00 00 00 00 00+                                           a_end__2>; 3

我想遍历它并通过检查每个成员来更改其每个成员的名称。

获得结构成员的偏移量有点容易,

id = GetStrucIdbyName(struct_name)
print "0x%08x" % (((base + (struct_size * indx)) + GetMemberOffset(id, "Func")))

然而,每当我尝试

MakeName(偏移量,新名称)

我收到以下错误:

不能将字节重命名为“Func”,因为该字节不能有名称(它是尾字节)。

我想我在这里做错了,但我似乎无法找到访问 IDA 结构并正确处理它们的“正确”方法。

帮助将得到积分、啤酒和 RE-SE 名声的赞赏和补偿。

1个回答

我不确定你想要完成什么。我的猜测是您正在尝试记录命令列表中的每个命令条目。

更改结构成员名称在结构视图中完成,或使用 idc 函数SetMemberName这将更改结构的所有实例的成员名称。

如果您想在 idc 脚本(未经测试)中使用类似的内容为所有成员以编程方式执行此操作:

sid = GetStrucIdByName("Commands_Array");
for (sofs = GetFirstMember(sid) ; sofs<=GetLastMember(sid) ; sofs += GetMemberSize(sid, sofs)) {
     SetMemberName(sid, sofs, "yournewname");
}

但也许您正在尝试为结构数组中的条目命名?在这种情况下,取消选中Create as array数组属性中复选框。然后,您将能够为结构数组中的每个项目分配名称。

或者,您可能只是在寻找结构的扩展视图?这可以通过ctrl +在视图菜单中键入或取消隐藏来完成

不可能的是为数组中的单个项目分配名称或注释。您可以向结构成员添加可重复的注释,这对于数组中的每个结构都是相同的。

或者您想更改结构中的值?为此,您将使用像PatchByte.

编辑:

我想我知道你想做什么:你想重命名结构中的 subs。不是结构成员名本身。

MakeName(Dword(ofs))