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
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))
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
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