似乎有两个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_struc
和stack_member
后,您可以执行以下操作:需要;
的结尾。