我想知道是否有人知道如何使用IDAPython将结构分配给堆栈变量(比如我们做Alt + Q时);对.data中的地址执行此操作不是问题,但我无法找出一种方法来解决IDA为给定函数创建的堆栈结构。

似乎有两个API在idaapi中执行以下操作:

def set_member_tinfo2(*args):
  """
  set_member_tinfo2(sptr, mptr, memoff, tif, flags) -> smt_code_t
  """

def set_member_tinfo(*args):
"""
set_member_tinfo(til, sptr, mptr, memoff, type, fields, flags) -> bool
"""
return _idaapi.set_member_tinfo(*args)


问题是我不知道如何从我在当地人身上拥有的结构。我到目前为止的代码是这样的:我应该通过传递我的type_t结构的tinfo_t来调用_CONFIG,但是我不知道如何获取它。尝试了几种方法但没有成功。例如:

# 00000000167ED lea     r8, [rbp+190h+var_170]

lea_addr = 0x167ED
# Get the stack struct
current_func = idaapi.get_func(lea_addr)
stack_id = idc.GetFrame(current_func)
stack_struc = idaapi.get_struc(stack_id)

# Get the stack operand offset value and stack member
stack_member_offset = idc.GetOperandValue(lea_addr, 1)
stack_member = stack_struc.get_member(stack_member_offset)

target_struct_id = idaapi.get_struc_id("_CONFIG")
target_struc = idaapi.get_struc(target_struct_id )


它总是返回False。


感谢@Bambu,我实际上已经尝试了您的方法,但是也不适合我我最终发现可行的方法是,首先取消定义IDA定义的堆栈成员(已定义的堆栈成员和基本的“ r”成员除外),然后使用结构的大小定义一个新的byte成员。之后,使用var_170更改类型。

idc.SetMemberType(stack_id, stack_member_offset, idc.FF_STRU|idc.FF_DATA, target_struct_id, 0)


#1 楼

我最终发现可行的方法是,首先取消定义IDA定义的堆栈成员(已定义的堆栈成员和基数“ r”成员除外),然后使用结构的大小定义一个新的byte成员。之后,使用SetMemberType更改类型。

def delete_all_function_stack_members(func_ea):
    members, base = retrieve_stack_members(func_ea)
    stack_id = idc.GetFrame(func_ea)
    for k, v in members.items():
        if k != base:
            idc.DelStrucMember(stack_id, k)
    g_functions_stack.add(func_ea)

delete_all_function_stack_members(current_func)
AddStrucMember(stack_id, "config", stack_member_offset, FF_BYTE|FF_DATA, -1, GetStrucSize(target_struct_id))
idc.SetMemberType(stack_id, stack_member_offset, idc.FF_STRU|idc.FF_DATA, target_struct_id, 1)


#2 楼

您可以使用tinfo_t_CONFIG结构获得parse_decl2。然后使用idaapi.set_member_tinfo2进行应用。

获得stack_strucstack_member后,您可以执行以下操作:需要;的结尾。