예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
파일: vds17.py 프로젝트: toyszyg/src
 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
예제 #5
0
    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)
예제 #6
0
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
예제 #7
0
    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 []