我想MakeArray()可以像这样用IDA来堆叠变量:




MakeArray()创建数组。

ea-线性地址

nitems-项目中数组的大小

此函数将创建与<相同类型的项目的数组br />
'ea'中项目的类型。如果未定义'ea'处的字节,则

该函数将创建一个字节数组。
谢谢。



MakeArray()仅适用于线性地址,不适用于如上所示的堆栈变量。

如何可以吗?
谢谢。

#1 楼

据我所知,您需要修改函数的堆栈框架以实现您的目标。

IDA中的堆栈框架由具有自己的ID和类型的结构表示。
要获得此结构ID,您可以使用idc.get_frame_id
要在更新的API中获得结构本身(IDA 7.0 +如果我没记错的话),可以使用ida_frame.get_frame

获取框架ID或结构后,可以对其进行修改。

如果使用结构,则可以使用模块ida_struct中的函数对其进行修改。

如果使用结构ID,则可以使用idc.add_struc_member。

您可能需要先删除占据所需空间的框架成员。

评论


MakeArray()需要一个ea作为参数,它可以在结构上工作吗?如何提取结构变量的ea?

– Kinetics332
19年7月30日在11:16



@ Kinetics332:将struct成员ID用作ea

–伊戈尔·斯科钦斯基♦
19年8月1日在8:21

#2 楼

以下代码在IDA 7.2上为我工作:

获取框架ID并确认它是健全的。

Python> frame_id = get_frame_id(get_name_ea(BADADDR, 'sub_5450'))
Python> print(list(StructMembers(frame_id)))
[(0L, 'var_18', 8L), (12L, 'var_C', 4L), (24L, ' r', 8L)]


获取现有变量ID。

Python> var_id = get_member_id(frame_id, 12)

如果我需要一个新变量,我会先使用add_struc_member(frame_id, 'var_name', var_offset, FF_DATA | FF_BYTE, -1, 1)

使用apply_type可以将变量转换为数组。

Python> apply_type(var_id, parse_decl('int[2]', 0))
True

以某种方式MakeArray不起作用:
Python> MakeArray(var_id, 2)
False