Python idaapi.print_tinfo() Examples

The following are 12 code examples of idaapi.print_tinfo(). You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may also want to check out all available functions/classes of the module idaapi , or try the search function .
Example #1
Source File: DataPluginBase.py    From DIE with MIT License 6 votes vote down vote up
def checkSupportedType(self, type):
        """
        Check if a type name string is supported
        @param type: IDA type_into_t object
        @return: True if type name is supported or otherwise False
        """
        try:
            tname = idaapi.print_tinfo('', 0, 0, idaapi.PRTYPE_1LINE, type, '', '')

            type_name = None
            if self.typeName_norm_cb is not None:
                type_name = self.typeName_norm_cb(tname)

            for (stype, sparams) in self.supported_types:
                if type_name == stype:
                    self.type_params = sparams
                    return True

            return False

        except Exception as ex:
            self.logger.exception("Error while checking for supported type: %s", ex) 
Example #2
Source File: DebugValue.py    From DIE with MIT License 6 votes vote down vote up
def __get_enum_values(self):
        try:
            enum_name = idaapi.print_tinfo("", 0, 0, idaapi.PRTYPE_1LINE, self.type, "", "")

            enum = sark.Enum(name=enum_name)
            for member in enum.members:
                if member.value == self.rawValue:
                    self.parsedValues.append(
                        ParsedValue("{}.{}".format(
                            enum_name, member.name), "Enum", MAX_SCORE, hex(self.rawValue), "enum"
                        )
                    )
                    return True
            return False
        except Exception as ex:
            self.logger.exception("Error while retrieving enum values: %s", ex)
            return False 
Example #3
Source File: IDATypeWrapers.py    From DIE with MIT License 6 votes vote down vote up
def __init__(self, type):

        self.logger = logging.getLogger(__name__)

        self.name = ""
        self.size = 0
        self.element_num = 0
        self.is_union = False

        self.elements = []

        self.type_info = type
        self.udt_type_data = idaapi.udt_type_data_t()


        try:
            if self.getStructData():
                self.getElements()

        except Exception as ex:
            self.logger.exception("Error while extracting Struct data: %s",
                          idaapi.print_tinfo('', 0, 0, idaapi.PRTYPE_1LINE, type, '', ''), ex)
            return False 
Example #4
Source File: IDATypeWrapers.py    From DIE with MIT License 6 votes vote down vote up
def getStructData(self):
        """
        Extract the struct data from tinfo_t object and populate all relevant class properties.
        @return: True if successful, otherwise False
        """

        if self.type_info.is_udt():
            if self.type_info.get_udt_details(self.udt_type_data):

                self.name = idaapi.print_tinfo('', 0, 0, idaapi.PRTYPE_1LINE, self.type_info, '', '')
                self.size = self.udt_type_data.size
                self.element_num = len(self.udt_type_data)
                self.is_union = self.udt_type_data.is_union

                return True

        return False 
Example #5
Source File: fn_fuzzy.py    From ida_haru with Apache License 2.0 5 votes vote down vote up
def export(self):
        if self.existed() and not self.f_update:
            info('{}: The sample records are present in DB. skipped.'.format(self.sha256))
            return False

        self.cur.execute("REPLACE INTO sample values(?, ?)", (self.sha256, self.idb_path))

        pnum = tnum = 0
        records = []
        for fva in idautils.Functions():
            fname = get_func_name(fva)
            tnum += 1
            if self.exclude_libthunk(fva, fname):
                continue
            fhd, bsize = self.calc_fn_ssdeep(fva, fname)
            fhm, cfgnum = self.calc_fn_machoc(fva, fname)
            if fhd and fhm:
                pnum += 1
                f_ana = bool(self.ana_pat.search(fname)) if self.f_ana_exp else False
                tinfo = idaapi.tinfo_t()
                idaapi.get_tinfo(fva, tinfo)
                ptype = idaapi.print_tinfo('', 0, 0, idaapi.PRTYPE_1LINE, tinfo, fname, '')
                ptype = ptype + ';' if ptype is not None else ptype
                # fva is 64-bit int causing OverflowError
                records.append((self.sha256, '{:#x}'.format(fva), fname, fhd, fhm, f_ana, bsize, ptype)) 
                self.debug('EXPORT {} at {:#x}: ssdeep={} (size={}), machoc={} (num of CFG={})'.format(fname, fva, fhd, bsize, fhm, cfgnum))

        self.cur.executemany("REPLACE INTO function values (?, ?, ?, ?, ?, ?, ?, ?)", records)
        success ('{} of {} functions exported'.format(pnum, tnum))
        return True 
Example #6
Source File: DebugValue.py    From DIE with MIT License 5 votes vote down vote up
def typeName(self):
        """
        Get the type human readable ASCII based name (in all upper case letters)
        """
        if self.type is None:
            return None

        typeName = idaapi.print_tinfo('', 0, 0, idaapi.PRTYPE_1LINE, self.type, '', '')
        if typeName is None or typeName == "":
            return None

        return typeName.upper() 
Example #7
Source File: IDATypeWrapers.py    From DIE with MIT License 5 votes vote down vote up
def type_str(self):
        """
        A string representation of the argument type
        """
        typeStr = idaapi.print_tinfo('', 0, 0, idaapi.PRTYPE_1LINE, self.argtype, '', '')

        return typeStr 
Example #8
Source File: _declaration.py    From ida-minsc with BSD 3-Clause "New" or "Revised" License 5 votes vote down vote up
def string(ti):
    prefix = ''
    name, indent = '', 4
    cmt, cindent = '', 4
    flags = idaapi.PRTYPE_DEF | idaapi.PRTYPE_MULTI
    return idaapi.print_tinfo(prefix, indent, cindent, flags, ti, name, cmt) 
Example #9
Source File: function.py    From ida-minsc with BSD 3-Clause "New" or "Revised" License 5 votes vote down vote up
def __new__(cls, func, info):
        '''Apply the ``idaapi.tinfo_t`` typeinfo in `info` to the function `func`.'''
        _, ea = interface.addressOfRuntimeOrStatic(func)

        # In order to apply the typeinfo with idaapi.apply_cdecl, we need the
        # typeinfo as a string. To accomplish this, we need need the typeinfo
        # with its name attached.
        fname = database.name(ea)
        realname = internal.declaration.unmangle_name(fname)

        # Filter out invalid characters from the function name since we're going
        # to use this to render the declaration next.
        valid = {item for item in string.digits}
        valid |= {item for item in ':'}
        filtered = str().join(item if item in valid or idaapi.is_valid_typename(utils.string.to(item)) else '_' for item in realname)

        # Now we have the name and its filtered, we can simply render it.
        try:
            tinfo_s = idaapi.print_tinfo('', 0, 0, 0, info, utils.string.to(filtered), '')

        # If we caught an error, then we couldn't render the string for some reason.
        except Exception:
            raise E.DisassemblerError(u"{:s}({:#x}, \"{:s}\") : Unable to render `idaapi.tinfo_t()` with name (\"{!s}\") to a string.".format('.'.join((__name__, cls.__name__)), ea, utils.string.escape("{!s}".format(info), '"'), utils.string.escape(realname, '"')))

        # Recurse back into ourselves in order to call idaapi.apply_cdecl
        return cls(ea, tinfo_s) 
Example #10
Source File: DataParser.py    From DIE with MIT License 4 votes vote down vote up
def ParseData(self, rawData, type=None, loc=None, custom_parser=None):
        """
        Parse Data
        @param rawData: The raw data to be parsed
        @param type: The data type (If unknown should be None)
        @param loc: raw value (memory) location
        @param custom_parser: A custom parser to use.
        @return: A list of ParsedValue objects (containing the guessed\exact parsed values)
        """
        parsedValues = []

        try:
            # If custom parser was defined
            if custom_parser is not None:
                custom_parser.run(rawData, type, match_override=True)
                ret_vals = custom_parser.getParsedValues()
                parsedValues.extend(ret_vals)

                return parsedValues

            # if type is known, try to look it up in the parser_type dict
            if type is not None:
                type_name = idaapi.print_tinfo('', 0, 0, idaapi.PRTYPE_1LINE, type, '', '')
                type_name = self.typeName_norm(type_name)

                if type_name in self.type_parsers:
                    for parser_plugin in self.type_parsers[type_name]:
                        parser_plugin.run(rawData, type)
                        ret_vals = parser_plugin.getParsedValues()
                        parsedValues.extend(ret_vals)

                    return parsedValues

            # Otherwise, the entire plugin list has to be iterated
            for pluginInfo in self.pManager.getAllPlugins():
                if pluginInfo.is_activated:
                    pluginInfo.plugin_object.run(rawData, type)
                    ret_vals = pluginInfo.plugin_object.getParsedValues()
                    parsedValues.extend(ret_vals)

            return parsedValues

        except Exception as ex:
            self.logger.exception("Error while parsing data: %s", ex) 
Example #11
Source File: function.py    From ida-minsc with BSD 3-Clause "New" or "Revised" License 4 votes vote down vote up
def tag(func):
    '''Returns all the tags defined for the function `func`.'''
    try:
        rt, ea = interface.addressOfRuntimeOrStatic(func)
    except E.FunctionNotFoundError:
        logging.warn(u"{:s}.tag({:s}) : Attempted to read tag from a non-function. Falling back to a database tag.".format(__name__, ("{:#x}" if isinstance(func, six.integer_types) else "{!r}").format(func)))
        return database.tag(func)

    if rt:
        logging.warn(u"{:s}.tag({:#x}) : Attempted to read tag from a runtime-linked address. Falling back to a database tag.".format(__name__, ea))
        return database.tag(ea)

    fn, repeatable = by_address(ea), True
    res = comment(fn, repeatable=False)
    d1 = internal.comment.decode(res)
    res = comment(fn, repeatable=True)
    d2 = internal.comment.decode(res)

    if d1.viewkeys() & d2.viewkeys():
        logging.info(u"{:s}.tag({:#x}) : Contents of both the repeatable and non-repeatable comment conflict with one another due to using the same keys ({!r}). Giving the {:s} comment priority.".format(__name__, ea, ', '.join(d1.viewkeys() & d2.viewkeys()), 'repeatable' if repeatable else 'non-repeatable'))

    res = {}
    map(res.update, (d1, d2) if repeatable else (d2, d1))

    # add the function's name to the result
    fname = name(fn)
    if fname and database.type.flags(interface.range.start(fn), idaapi.FF_NAME):
        res.setdefault('__name__', fname)

    # add the function's typeinfo to the result
    if type.has_prototype(fn):
        ti, fname = type(fn), database.name(interface.range.start(fn))

        # Demangle the name if necessary, and render it to a string.
        realname = internal.declaration.unmangle_name(fname)
        fprototype = idaapi.print_tinfo('', 0, 0, 0, ti, utils.string.to(realname), '')

        # And then return it to the user
        res.setdefault('__typeinfo__', fprototype)

    # ..and now hand it off.
    return res 
Example #12
Source File: __init__.py    From hrdev with MIT License 4 votes vote down vote up
def run(self):
        '''Start the plugin.'''

        if not idaapi.init_hexrays_plugin():
            print "HRDEV Error: Failed to initialise Hex-Rays plugin."
            return

        function_name = idaapi.get_func_name(idaapi.get_screen_ea())
        demangled_name = self.tools.demangle_name(function_name)

        src = idaapi.decompile(idaapi.get_screen_ea())

        file_name = '{}.cpp'.format(self.tools.to_file_name(demangled_name))
        cache_path = os.path.sep.join([tempfile.gettempdir(),
                                       'hrdev_cache',
                                       self._bin_name])

        # Create required directories if they dont exist
        tmp_dir_path = os.path.sep.join([tempfile.gettempdir(), 'hrdev_cache'])
        if not os.path.isdir(tmp_dir_path):
            os.mkdir(tmp_dir_path)

        if not os.path.isdir(cache_path):
            os.mkdir(cache_path)

        complete_path = os.path.sep.join([cache_path, file_name])
        idaapi.msg("HRDEV cache path: {}\n".format(complete_path))

        # Check if file is already in cache
        if not os.path.isfile(complete_path) or \
           self.config_main.getboolean('etc', 'disable_cache'):
            self.tools.save_file(complete_path, str(src))

        self.tools.set_file_path(complete_path)

        lvars = {}
        for v in src.lvars:
            _type = idaapi.print_tinfo('', 0, 0, idaapi.PRTYPE_1LINE, v.tif, '', '')
            lvars[str(v.name)] = "{} {} {}".\
                format(_type, str(v.name), str(v.cmt))

        max_title = self.config_main.getint('etc', 'max_title')
        self.gui = hrdev_plugin.include.gui.Canvas(self.config_main,
                                                   self.config_theme,
                                                   self.tools,
                                                   lvars,
                                                   demangled_name[:max_title])
        self.gui.Show('HRDEV')

        self.parser = hrdev_plugin.include.syntax.Parser(self, lvars)
        self.parser.run(complete_path)
        return