使用 idapython 从堆栈变量生成数组

逆向工程 艾达 蟒蛇
2021-06-10 11:58:11

我想MakeArray()堆叠可以用 IDA 完成的变量,如下所示:

MakeArray 堆栈变量

MakeArray() 创建一个数组。

ea - 线性地址

nitems - 项目中数组的大小

此函数将创建一个具有相同类型的项目的数组

'ea' 处的项目类型。如果 'ea' 处的字节未定义,则

此函数将创建一个字节数组。我怎样才能做到这一点?谢谢。

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

怎么做到呢?谢谢。

2个回答

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

IDA 中的堆栈帧由具有自己的 id 和类型的结构表示。为了获得你需要的这个结构 id 你可以使用idc.get_frame_id
为了在较新的 API(IDA 7.0 + 如果我没记错的话)中获得结构本身,你可以使用ida_frame.get_frame

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

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

如果您正在使用结构 ID,则可以使用idc.add_struc_member

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

以下在 IDA 7.2 上对我有用:

  1. 获取帧 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)]
  1. 获取现有变量 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)

  1. 使用apply_type,以便把所述可变到一个数组。
Python> apply_type(var_id, parse_decl('int[2]', 0))
True

不知何故MakeArray不起作用:

Python> MakeArray(var_id, 2)
False