Example #1
0
    def _demangle_constants(self, constants):
        result = {}
        demangler = pe_vtypes.Demangler(self.metadata)
        for name, value in six.iteritems(constants):
            root_name = demangled_name = demangler.DemangleName(name)
            count = 0
            while demangled_name in result:
                demangled_name = "%s_%s" % (root_name, count)
                count += 1

            result[demangled_name] = value

        return result
Example #2
0
    def render(self, renderer):
        vtypes = {}

        for i, (struct_name, definition) in enumerate(self.tpi.Structs()):
            self.session.report_progress(" Exporting %s: %s", i, struct_name)
            struct_name = str(struct_name)
            existing_definition = vtypes.get(struct_name)
            if existing_definition:
                # Merge the old definition into the new definition.
                definition[1].update(existing_definition[1])

            vtypes[struct_name] = definition

        self.metadata.update(dict(
            ProfileClass=self.profile_class,
            Type="Profile",
            PDBFile=os.path.basename(self.filename),
            ))

        self.metadata.update(self.tpi.metadata)

        # Demangle all constants.
        demangler = pe_vtypes.Demangler(self.metadata)
        constants = {}
        for name, value in self.tpi.constants.iteritems():
            constants[demangler.DemangleName(name)] = value

        functions = {}
        for name, value in self.tpi.functions.iteritems():
            functions[demangler.DemangleName(name)] = value

        vtypes = self.PostProcessVTypes(vtypes)

        result = {
            "$METADATA": self.metadata,
            "$STRUCTS": vtypes,
            "$ENUMS": self.tpi.enums,
            }

        if not self.concise:
            result["$REVENUMS"] = self.tpi.rev_enums
            result["$CONSTANTS"] = constants
            result["$FUNCTIONS"] = functions

        if self.output_filename:
            with renderer.open(filename=self.output_filename,
                               directory=self.dump_dir,
                               mode="wb") as fd:
                fd.write(utils.PPrint(result))
        else:
            renderer.write(utils.PPrint(result))
Example #3
0
    def parse_pdb(self):
        with self.tpi:
            vtypes = {}

            for i, (struct_name, definition) in enumerate(self.tpi.Structs()):
                self.session.report_progress(" Exporting %s: %s", i,
                                             struct_name)

                struct_name = str(struct_name)
                existing_definition = vtypes.get(struct_name)
                if existing_definition:
                    # Merge the old definition into the new definition.
                    definition[1].update(existing_definition[1])

                vtypes[struct_name] = definition

            self.metadata.update(
                dict(
                    ProfileClass=self.plugin_args.profile_class,
                    Type="Profile",
                    PDBFile=os.path.basename(self.plugin_args.pdb_filename),
                ))

            self.metadata.update(self.tpi.metadata)

            # Demangle all constants.
            demangler = pe_vtypes.Demangler(self.metadata)
            constants = {}
            for name, value in self.tpi.constants.iteritems():
                constants[demangler.DemangleName(name)] = value

            functions = {}
            for name, value in self.tpi.functions.iteritems():
                functions[demangler.DemangleName(name)] = value

            vtypes = self.PostProcessVTypes(vtypes)

            result = {
                "$METADATA": self.metadata,
                "$STRUCTS": vtypes,
                "$ENUMS": self.tpi.enums,
            }

            if not self.plugin_args.concise:
                result["$REVENUMS"] = self.tpi.rev_enums
                result["$CONSTANTS"] = constants
                result["$FUNCTIONS"] = functions

            return result
Example #4
0
    def _demangle_constants(self, constants):
        """Demangle the constants and handle repeated symbols.

        This code sorts the symbols by their offset to ensure
        repeatable results.
        """
        tmp = {}
        demangler = pe_vtypes.Demangler(self.metadata)
        for name, value in six.iteritems(constants):
            demangled_name = demangler.DemangleName(name)
            tmp.setdefault(demangled_name, []).append(value)

        result = {}
        for name, values in six.iteritems(tmp):
            root_name = name
            for i, value in enumerate(sorted(values)):
                if i > 0:
                    name = "%s_%s" % (root_name, i)

                result[name] = value

        return result