示例#1
0
    def __process_names(self):
        names = list()

        for i in range(0, ida_name.get_nlist_size()):
            ea = ida_name.get_nlist_ea(i)
            if ida_funcs.get_func(ea) is not None:
                continue

            name = {
                'rva': ea - self._base,
                'name': ida_name.get_nlist_name(i),
                'name_demangled':
                ida_name.get_demangled_name(ea, 0xFFFF, 0, 0),
                'is_public': ida_name.is_public_name(ea),
                'is_func': ida_funcs.get_func(ea) is not None
            }

            # PE32/PE32+ only support binaries up to 2GB
            if name['rva'] >= 2**32:
                print('RVA out of range for name: ' + name['name'],
                      file=sys.stderr)

            names.append(name)

        return names
示例#2
0
    def __process_functions(self):
        functions = list()

        start = ida_ida.cvar.inf.min_ea
        end = ida_ida.cvar.inf.max_ea

        # find first function head chunk in the range
        chunk = ida_funcs.get_fchunk(start)

        if not chunk:
            chunk = ida_funcs.get_next_fchunk(start)
        while chunk and chunk.start_ea < end and (chunk.flags
                                                  & ida_funcs.FUNC_TAIL) != 0:
            chunk = ida_funcs.get_next_fchunk(chunk.start_ea)

        func = chunk

        while func and func.start_ea < end:
            start_ea = func.start_ea

            func_flags = ida_bytes.get_full_flags(start_ea)
            func_name = ida_funcs.get_func_name(start_ea)
            func_name_demangled = ida_name.get_demangled_name(
                start_ea, 0xFFFF, 0, 0)
            func_autonamed = func_flags & ida_bytes.FF_LABL != 0
            func_public = ida_name.is_public_name(start_ea)

            function = {
                'start_rva': start_ea - self._base,
                'name': func_name,
                'name_demangled': func_name_demangled,
                'is_public': func_public,
                'is_autonamed': func_autonamed
            }

            # PE32/PE32+ only support binaries up to 2GB
            if function['start_rva'] >= 2**32:
                print('RVA out of range for function: ' + function['name'],
                      file=sys.stderr)

            self.__process_function_typeinfo(function, func)

            function['labels'] = self.__process_function_labels(func)

            functions.append(function)

            func = ida_funcs.get_next_func(start_ea)

        return functions