python-通过脚本在结构中设置IDA函数指针
作者:互联网
重新定义结构成员以使其成为函数指针的通常的手动方法是,按下该成员,单击“ Y”,然后在弹出框中输入正确的声明.
例如,对于结构成员fncQuery,我将字符串更改为:
BOOL(__cdecl * fncQuery)(字符* cmdID)
这会有所帮助;当我接下来确定对该函数指针的调用时,我会将相应的“ call [reg offset]”行标记为该函数指针,而IDA将
重新为我分析和评论参数.
我有一千个结构体,每个结构体至少具有一个这样的函数指针成员,以及这些函数的参数和返回值的描述的对应列表.可以理解的是,我想通过IDAPython脚本而不是手工来匹配它们.但是,我找不到脚本的“ Y”按钮的等效项:
据我所知,AddStrucMember并没有削减它-我可以通过为其赋予结构ID来声明一个成员成为该结构的指针,但这不是我所需要的.
SetMemberType与以前的相同.
SetType需要一个线性地址和一个类型字符串-除非线性地址是代码段专有的,否则它是完美的,因此我无法使用SetType来接触结构成员定义.
在我的搜索中,我找到了一个暗黑的魔术师,将低级的idaapi合并到他的IDAPython脚本中,以检测struct成员是否具有与已知函数相同的名称,如果存在,则“获取”该函数的类型.函数并将其“设置”到成员上.
具体而言,看到了这样的可怕调用(从其定义的上下文中删除,当我说这可以正常运行并且第一个函数调用用有意义的值填充了其许多参数时,您必须信任我):
get_named_type = g_dll.get_named_type
get_named_type.argtypes = [
ctypes.c_void_p, #const til_t *ti,
ctypes.c_char_p, #const char *name,
ctypes.c_int, #int ntf_flags,
ctypes.POINTER(ctypes.POINTER(ctypes.c_ubyte)), #const type_t **type=NULL,
ctypes.POINTER(ctypes.POINTER(ctypes.c_ubyte)), #const p_list **fields=NULL,
ctypes.POINTER(ctypes.POINTER(ctypes.c_ubyte)), #const char **cmt=NULL,
ctypes.POINTER(ctypes.POINTER(ctypes.c_ubyte)), #const p_list **fieldcmts=NULL,
ctypes.POINTER(ctypes.c_ulong), #sclass_t *sclass=NULL,
ctypes.POINTER(ctypes.c_ulong), #uint32 *value=NULL);
]
get_named_type(
til,
funcname,
idaapi.NTF_SYMM,
ctypes.byref(typ_type),
ctypes.byref(typ_fields),
ctypes.byref(typ_cmt),
ctypes.byref(typ_fieldcmts),
ctypes.byref(typ_sclass),
ctypes.byref(value)
type_arr = ctypes.create_string_buffer(0x400)
type_arr[0] = chr(idaapi.BT_PTR)
manualTypeCopy(type_arr, 1, len(type_arr), typ_type)
ret = g_dll.set_member_tinfo(
til,
struc,
memb,
ctypes.c_uint(0),
type_arr,
typ_fields,
ctypes.c_uint(0),
)
关于“ get_named_type”的幕后工作使我望而却步,并且调查其来源(并从中使用某些东西供我使用)可能是头脑强硬且为时过早的.
您是否知道可以满足我的需求的简便方法?
我只需要将结构成员定义为IDAPython脚本中的函数指针.
请帮忙,
谢谢 :)
解决方法:
这是个老问题,但我为其他人找到了解决方案:
SetType(GetMemberId(id, offset), "__int64 (__fastcall *)(ClassName *this)");
> id-结构的ID(由AddStrucEx返回的值)
>偏移量-是结构成员的偏移量,如果需要按成员名称更改类型-可以使用GetMemberOffset
标签:struct,function-pointers,ida,python,reverse-engineering 来源: https://codeday.me/bug/20191121/2052735.html