def open_function(self): addresses = self.addresses if len(addresses) > 1: address = helper.choose_virtual_func_address(self.name) if not address: return elif len(addresses) == 1: address = addresses[0] else: return if helper.decompile_function(address): idaapi.open_pseudocode(address, 0) else: idaapi.jumpto(address)
def _get_member(self, offset, cexpr, obj, tinfo=None, obj_ea=None): if offset < 0: logger.error( "Considered to be imposible: offset - {}, obj - {}".format( offset, helper.to_hex(self._find_asm_address(cexpr)))) raise AssertionError applicable = not self.crippled cexpr_ea = self._find_asm_address(cexpr) scan_obj = ScannedObject.create(obj, cexpr_ea, self.__origin, applicable) if obj_ea: if temporary_structure.VirtualTable.check_address(obj_ea): return temporary_structure.VirtualTable( offset, obj_ea, scan_obj, self.__origin) if helper.is_code_ea(obj_ea): cfunc = helper.decompile_function(obj_ea) if cfunc: tinfo = cfunc.type tinfo.create_ptr(tinfo) else: tinfo = const.DUMMY_FUNC return temporary_structure.Member(offset, tinfo, scan_obj, self.__origin) # logger.warn("Want to see this ea - {},".format(Helper.to_hex(cexpr_ea))) if not tinfo or tinfo.equals_to(const.VOID_TINFO) or tinfo.equals_to( const.CONST_VOID_TINFO): return temporary_structure.VoidMember(offset, scan_obj, self.__origin) if tinfo.equals_to(const.CHAR_TINFO): return temporary_structure.VoidMember(offset, scan_obj, self.__origin, char=True) if tinfo.equals_to(const.CONST_PCHAR_TINFO): tinfo = const.PCHAR_TINFO elif tinfo.equals_to(const.CONST_PVOID_TINFO): tinfo = const.PVOID_TINFO else: tinfo.clr_const() return temporary_structure.Member(offset, tinfo, scan_obj, self.__origin)
def __iter_callers(self): for ea in self.__callers_ea: cfunc = helper.decompile_function(ea) if cfunc: yield cfunc