From c69eec3c4b4cd0b8ed25ec379bfd32a8513b4447 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Wed, 9 Aug 2023 09:11:56 -0400 Subject: Add support for showing compiler information in the triage summary --- examples/triage/headers.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'examples/triage/headers.cpp') diff --git a/examples/triage/headers.cpp b/examples/triage/headers.cpp index 20332527..1bdc31fe 100644 --- a/examples/triage/headers.cpp +++ b/examples/triage/headers.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "headers.h" #include "fontsettings.h" #include "theme.h" @@ -261,6 +262,39 @@ PEHeaders::PEHeaders(BinaryViewRef data) AddField("DLL Characteristics", dllCharValues); } + + auto richHeaderIdentifiers = data->QueryMetadata("RichHeaderLookupIdentifiers"); + auto richHeaderNames = data->QueryMetadata("RichHeaderLookupNames"); + auto richHeader = data->QueryMetadata("RichHeader"); + if (richHeaderIdentifiers && richHeaderIdentifiers && richHeader) // Should only be present on PE files + { + std::vector compilersUsed; + + // Get a set of unique identifiers + std::map identifiers; + for (auto& entry : richHeader->GetArray()) + { + auto kv = entry->GetKeyValueStore(); + identifiers[kv["ObjectVersionValue"]->GetUnsignedInteger()] += kv["ObjectCount"]->GetUnsignedInteger(); + } + auto lookupVersionStrings = [&](uint64_t id) -> std::string { + auto ids = richHeaderIdentifiers->GetUnsignedIntegerList(); + auto names = richHeaderNames->GetStringList(); + for (size_t i = 0; i < ids.size(); i++) + { + if (ids[i] == id) + return names[i]; + if (ids[i] > id && i > 0) + return names[i - 1] + " and " + names[i]; + } + return "Unknown"; + }; + for (auto& entry : identifiers) + compilersUsed.push_back(QString::fromStdString(lookupVersionStrings(entry.first) + " (" + std::to_string(entry.second) + " objects)")); + + AddField("Compiler(s) Used", compilersUsed); + } + SetColumns(3); SetRowsPerColumn(9); } -- cgit v1.3.1