def __process_function_typeinfo(self, info, func): tinfo = ida_typeinf.tinfo_t() ida_nalt.get_tinfo(tinfo,func.start_ea) func_type_data = ida_typeinf.func_type_data_t() tinfo.get_func_details(func_type_data) #calling convention info['calling_convention'] = self.__describe_callingconvention(func_type_data.cc) info['memory_model_code'] = self.__describe_memorymodel_code(func_type_data.cc) info['memory_model_data'] = self.__describe_memorymodel_data(func_type_data.cc) #return type info['return_type'] = ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, func_type_data.rettype, '', '') #arguments arguments = list() for funcarg in func_type_data: arginfo = { 'name' : funcarg.name, 'type' : ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, funcarg.type, '', ''), 'argument_location' : self.__describe_argloc(funcarg.argloc.atype()) } arguments.append(arginfo) info['arguments'] = arguments
def __process_function_typeinfo(self, info, func): tinfo = ida_typeinf.tinfo_t() func_type_data = ida_typeinf.func_type_data_t() if ida_pro.IDA_SDK_VERSION >= 740: ida_typeinf.guess_tinfo(tinfo,func.start_ea) else: ida_typeinf.guess_tinfo(func.start_ea,tinfo) tinfo.get_func_details(func_type_data) #calling convention info['calling_convention'] = self.__describe_callingconvention(func_type_data.cc) func_type_data.rettype #return tpye info['return_type'] = ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, func_type_data.rettype, '', '') #arguments arguments = list() for funcarg in func_type_data: arginfo = { 'name' : funcarg.name, 'type' : ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, funcarg.type, '', ''), 'argument_location' : self.__describe_argloc(funcarg.argloc.atype()) } arguments.append(arginfo) info['arguments'] = arguments
def __process_struct_members(self, st_obj): members = [] for st_member in st_obj.members: mem_name = ida_struct.get_member_name( st_member.id) or ('unknown_%s' % st_member.id) mem_off_start = 0 if st_obj.is_union() else st_member.soff mem_off_end = st_member.eoff mem_tinfo = ida_typeinf.tinfo_t() ida_struct.get_member_tinfo(mem_tinfo, st_member) mem_typename = ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, mem_tinfo, '', '') if not mem_typename: mem_typename = self.__describe_type_basetype( mem_tinfo.get_realtype()) members.append({ 'offset': mem_off_start, 'length': mem_off_end - mem_off_start, 'type': mem_typename, 'name': mem_name, }) return members
def apply(self, opnum, path, top_tif, spath): typename = ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, top_tif, '', '') idaapi.msg("User selected %s of type %s\n" % (spath, typename)) if path.empty(): return False vu.cfunc.set_user_union_selection(self.ea, path) vu.cfunc.save_user_unions() return True
def get_struc_name(self): x = self.target.operands['x'] m = self.target.operands['m'] xtype = x.type xtype.remove_ptr_or_array() typename = ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, xtype, '', '') sid = ida_struct.get_struc_id(typename) sptr = ida_struct.get_struc(sid) member = ida_struct.get_member(sptr, m) return '%s::%s' % (typename, member)
def processFunctionTypeinfo(function): tinfo = ida_typeinf.tinfo_t() func_type_data = ida_typeinf.func_type_data_t() tinfo.get_named_type ida_typeinf.guess_tinfo(function['start_ea'], tinfo) tinfo.get_func_details(func_type_data) #calling convention function['calling_convention'] = describe_callingconvention( func_type_data.cc) func_type_data.rettype #return tpye function['return_type'] = ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, func_type_data.rettype, '', '') #arguments arguments = list() for funcarg in func_type_data: arginfo = { 'name': funcarg.name, 'type': ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, funcarg.type, '', ''), 'argument_location': describe_argloc(funcarg.argloc.atype()) } arguments.append(arginfo) function['arguments'] = arguments
def get_items_for_type(self): x = self.target.operands['x'] m = self.target.operands['m'] xtype = x.type xtype.remove_ptr_or_array() typename = ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, xtype, '', '') addresses = [] for ea in idautils.Functions(): try: cfunc = ida_hexrays.decompile(ea) except: print('Decompilation of %x failed' % (ea, )) continue str(cfunc) for citem in cfunc.treeitems: citem = citem.to_specific_type if not (type(citem) == ida_hexrays.cexpr_t and citem.opname in ('memptr', 'memref')): continue _x = citem.operands['x'] _m = citem.operands['m'] _xtype = _x.type _xtype.remove_ptr_or_array() _typename = ida_typeinf.print_tinfo('', 0, 0, ida_typeinf.PRTYPE_1LINE, _xtype, '', '') if not (_typename == typename and _m == m): continue parent = citem while parent: if type(parent.to_specific_type) == ida_hexrays.cinsn_t: break parent = cfunc.body.find_parent_of(parent) if not parent: print('cannot find parent statement (?!)') continue if parent.ea in addresses: continue if parent.ea == ida_idaapi.BADADDR: print('parent.ea is BADADDR') continue addresses.append(parent.ea) self.functions.append(cfunc.entry_ea) self.items.append( (parent.ea, ida_funcs.get_func_name(cfunc.entry_ea) or "", self.get_decompiled_line(cfunc, parent.ea))) return []