summaryrefslogtreecommitdiff
path: root/platform/efi/efi_resolver/include
diff options
context:
space:
mode:
authorZichuan Li <34680029+river-li@users.noreply.github.com>2024-08-15 18:23:43 -0400
committerBrandon Miller <brandon@vector35.com>2025-05-08 07:23:08 -0400
commitf07f66ba03dfeed222f419e1bae274e95cbcd2d4 (patch)
treeac93834d248b5b2af242a9288785106bcecc354f /platform/efi/efi_resolver/include
parent7f08117cfeb48a8f48d08e14cb498ee028efcef2 (diff)
misc: formated code and fixed several small issues
1. Fix code related to SMI handlers 2. also parse handlers registered by SxDispatch and parse them together 3. Set Progress Text properly
Diffstat (limited to 'platform/efi/efi_resolver/include')
-rw-r--r--platform/efi/efi_resolver/include/DxeResolver.h31
-rw-r--r--platform/efi/efi_resolver/include/GuidRenderer.h15
-rw-r--r--platform/efi/efi_resolver/include/ModuleType.h23
-rw-r--r--platform/efi/efi_resolver/include/PeiResolver.h27
-rw-r--r--platform/efi/efi_resolver/include/Resolver.h93
-rw-r--r--platform/efi/efi_resolver/include/TypePropagation.h15
-rw-r--r--platform/efi/efi_resolver/include/Utils.h46
7 files changed, 128 insertions, 122 deletions
diff --git a/platform/efi/efi_resolver/include/DxeResolver.h b/platform/efi/efi_resolver/include/DxeResolver.h
index 3515b94a..eef6e6c2 100644
--- a/platform/efi/efi_resolver/include/DxeResolver.h
+++ b/platform/efi/efi_resolver/include/DxeResolver.h
@@ -2,24 +2,25 @@
#include "Resolver.h"
-class DxeResolver : Resolver {
- bool resolveBootServices();
- bool resolveRuntimeServices();
+class DxeResolver : Resolver
+{
+ bool resolveBootServices();
+ bool resolveRuntimeServices();
- bool resolveSmmTables(string serviceName, string tableName);
- bool resolveSmmServices();
- bool resolveSmiHandlers();
+ bool resolveSmmTables(string serviceName, string tableName);
+ bool resolveSmmServices();
+ bool resolveSmiHandlers();
public:
- /*!
- resolve BootServices and RuntimeServices, define protocol types that loaded by BootServices
- */
- bool resolveDxe();
+ /*!
+ resolve BootServices and RuntimeServices, define protocol types that loaded by BootServices
+ */
+ bool resolveDxe();
- /*!
- Define MMST/SMMST and resolve SMM related protocols
- */
- bool resolveSmm();
+ /*!
+ Define MMST/SMMST and resolve SMM related protocols
+ */
+ bool resolveSmm();
- DxeResolver(Ref<BinaryView> view, Ref<BackgroundTask> task);
+ DxeResolver(Ref<BinaryView> view, Ref<BackgroundTask> task);
}; \ No newline at end of file
diff --git a/platform/efi/efi_resolver/include/GuidRenderer.h b/platform/efi/efi_resolver/include/GuidRenderer.h
index 30bd9126..e30aa880 100644
--- a/platform/efi/efi_resolver/include/GuidRenderer.h
+++ b/platform/efi/efi_resolver/include/GuidRenderer.h
@@ -6,16 +6,15 @@
using namespace BinaryNinja;
using namespace std;
-class EfiGuidRenderer : public BinaryNinja::DataRenderer {
- EfiGuidRenderer() = default;
+class EfiGuidRenderer : public BinaryNinja::DataRenderer
+{
+ EfiGuidRenderer() = default;
public:
- bool IsValidForData(BinaryView*, uint64_t address, Type*,
- vector<pair<Type*, size_t>>&) override;
+ bool IsValidForData(BinaryView*, uint64_t address, Type*, vector<pair<Type*, size_t>>&) override;
- vector<DisassemblyTextLine> GetLinesForData(
- BinaryView*, uint64_t address, Type*, const vector<InstructionTextToken>& prefix,
- size_t width, vector<pair<Type*, size_t>>&) override;
+ vector<DisassemblyTextLine> GetLinesForData(BinaryView*, uint64_t address, Type*,
+ const vector<InstructionTextToken>& prefix, size_t width, vector<pair<Type*, size_t>>&) override;
- static void Register();
+ static void Register();
}; \ No newline at end of file
diff --git a/platform/efi/efi_resolver/include/ModuleType.h b/platform/efi/efi_resolver/include/ModuleType.h
index 81b579b9..187dcc36 100644
--- a/platform/efi/efi_resolver/include/ModuleType.h
+++ b/platform/efi/efi_resolver/include/ModuleType.h
@@ -4,19 +4,20 @@
using namespace BinaryNinja;
-enum EFIModuleType {
- UNKNOWN,
- PEI,
- DXE,
+enum EFIModuleType
+{
+ UNKNOWN,
+ PEI,
+ DXE,
};
static inline EFIModuleType identifyModuleType(BinaryView* bv)
{
- std::string viewType = bv->GetCurrentView();
- if (viewType == "Linear:PE")
- return DXE;
- else if (viewType == "Linear:TE")
- return PEI;
- else
- return UNKNOWN;
+ std::string viewType = bv->GetCurrentView();
+ if (viewType == "Linear:PE")
+ return DXE;
+ else if (viewType == "Linear:TE")
+ return PEI;
+ else
+ return UNKNOWN;
} \ No newline at end of file
diff --git a/platform/efi/efi_resolver/include/PeiResolver.h b/platform/efi/efi_resolver/include/PeiResolver.h
index 76827a1a..2ecf8ace 100644
--- a/platform/efi/efi_resolver/include/PeiResolver.h
+++ b/platform/efi/efi_resolver/include/PeiResolver.h
@@ -2,19 +2,20 @@
#include "Resolver.h"
-class PeiResolver : Resolver {
- bool resolvePeiIdt();
- bool resolvePeiMrc();
- bool resolvePeiMrs();
- bool resolvePlatformPointers();
- bool resolvePeiDescriptors();
- bool resolvePeiServices();
+class PeiResolver : Resolver
+{
+ bool resolvePeiIdt();
+ bool resolvePeiMrc();
+ bool resolvePeiMrs();
+ bool resolvePlatformPointers();
+ bool resolvePeiDescriptors();
+ bool resolvePeiServices();
public:
- /*!
- resolve Pei related types and PPIs, this function will also resolve processor-specific pointers
- and tried to define the EFI_PEI_DESCRIPTORS
- */
- bool resolvePei();
- PeiResolver(Ref<BinaryView> view, Ref<BackgroundTask> task);
+ /*!
+ resolve Pei related types and PPIs, this function will also resolve processor-specific pointers
+ and tried to define the EFI_PEI_DESCRIPTORS
+ */
+ bool resolvePei();
+ PeiResolver(Ref<BinaryView> view, Ref<BackgroundTask> task);
}; \ No newline at end of file
diff --git a/platform/efi/efi_resolver/include/Resolver.h b/platform/efi/efi_resolver/include/Resolver.h
index 7bbd3b99..91bb1862 100644
--- a/platform/efi/efi_resolver/include/Resolver.h
+++ b/platform/efi/efi_resolver/include/Resolver.h
@@ -16,61 +16,60 @@ using namespace std;
typedef array<uint8_t, 16> EFI_GUID;
-class Resolver {
+class Resolver
+{
protected:
- Ref<BinaryView> m_view;
- Ref<BackgroundTask> m_task;
- size_t m_width;
- map<EFI_GUID, pair<string, string>> m_protocol;
- map<EFI_GUID, string> m_user_guids;
+ Ref<BinaryView> m_view;
+ Ref<BackgroundTask> m_task;
+ size_t m_width;
+ map<EFI_GUID, pair<string, string>> m_protocol;
+ map<EFI_GUID, string> m_user_guids;
- vector<pair<uint64_t, string>> m_service_usages;
- vector<pair<uint64_t, string>> m_protocol_usages;
- vector<pair<uint64_t, EFI_GUID>> m_guid_usages;
- vector<pair<uint64_t, string>> m_variable_usages;
+ vector<pair<uint64_t, string>> m_service_usages;
+ vector<pair<uint64_t, string>> m_protocol_usages;
+ vector<pair<uint64_t, EFI_GUID>> m_guid_usages;
+ vector<pair<uint64_t, string>> m_variable_usages;
- bool parseUserGuidIfExists(const string& filePath);
- bool parseProtocolMapping(const string& filePath);
+ bool parseUserGuidIfExists(const string& filePath);
+ bool parseProtocolMapping(const string& filePath);
- /*!
- For backward compatibility, if a user saved a bndb with older version Binary Ninja
- this function will try to retrieve types from Platform Types if it doesn't find one
- in BinaryView
- */
- Ref<Type> GetTypeFromViewAndPlatform(string type_name);
- void initProtocolMapping();
+ /*!
+ For backward compatibility, if a user saved a bndb with older version Binary Ninja
+ this function will try to retrieve types from Platform Types if it doesn't find one
+ in BinaryView
+ */
+ Ref<Type> GetTypeFromViewAndPlatform(string type_name);
+ void initProtocolMapping();
public:
- bool setModuleEntry(EFIModuleType fileType);
- bool resolveGuidInterface(Ref<Function> func, uint64_t addr, int guid_pos, int interface_pos);
- Resolver(Ref<BinaryView> view, Ref<BackgroundTask> task);
+ bool setModuleEntry(EFIModuleType fileType);
+ bool resolveGuidInterface(Ref<Function> func, uint64_t addr, int guid_pos, int interface_pos);
+ Resolver(Ref<BinaryView> view, Ref<BackgroundTask> task);
- pair<string, string> lookupGuid(EFI_GUID guidBytes);
- pair<string, string> defineAndLookupGuid(uint64_t addr);
+ pair<string, string> lookupGuid(EFI_GUID guidBytes);
+ pair<string, string> defineAndLookupGuid(uint64_t addr);
- string nonConflictingName(const string& basename);
- static string nonConflictingLocalName(Ref<Function> func, const string& basename);
+ string nonConflictingName(const string& basename);
+ static string nonConflictingLocalName(Ref<Function> func, const string& basename);
- /*!
- Define the structure used at the callsite with type `typeName`, propagate it to the data section. If it's a structure type, define it fields
- according to the `followFields` parameter. The input `addr` should be a call instruction
- \param func the function that contains the callsite (it's parent function)
- \param addr address of the callsite
- \param typeName the type that need to define
- \param paramIdx the parameter index that want to define
- \param followFields whether to define the structure's fields if they are pointers
- \return False if failed
+ /*!
+ Define the structure used at the callsite with type `typeName`, propagate it to the data section. If it's a
+ structure type, define it fields according to the `followFields` parameter. The input `addr` should be a call
+ instruction \param func the function that contains the callsite (it's parent function) \param addr address of the
+ callsite \param typeName the type that need to define \param paramIdx the parameter index that want to define \param
+ followFields whether to define the structure's fields if they are pointers \return False if failed
- \b Example:
- \code{.cpp}
- refs = bv->GetCodeReferencesForType(QualifiedName("EFI_GET_VARIABLE"));
- for (auto ref : refs)
- {
- // ... some checking, need to make sure is a call instruction
- bool ok = defineTypeAtCallsite(ref.func, ref.addr, "EFI_GUID", 2, false);
- }
- \endcode
- */
- bool defineTypeAtCallsite(Ref<Function> func, uint64_t addr, string typeName, int paramIdx, bool followFields = false);
- vector<HighLevelILInstruction> HighLevelILExprsAt(Ref<Function> func, Ref<Architecture> arch, uint64_t addr);
+ \b Example:
+ \code{.cpp}
+ refs = bv->GetCodeReferencesForType(QualifiedName("EFI_GET_VARIABLE"));
+ for (auto ref : refs)
+ {
+ // ... some checking, need to make sure is a call instruction
+ bool ok = defineTypeAtCallsite(ref.func, ref.addr, "EFI_GUID", 2, false);
+ }
+ \endcode
+ */
+ bool defineTypeAtCallsite(
+ Ref<Function> func, uint64_t addr, string typeName, int paramIdx, bool followFields = false);
+ vector<HighLevelILInstruction> HighLevelILExprsAt(Ref<Function> func, Ref<Architecture> arch, uint64_t addr);
}; \ No newline at end of file
diff --git a/platform/efi/efi_resolver/include/TypePropagation.h b/platform/efi/efi_resolver/include/TypePropagation.h
index 2ba131ba..1985e2ab 100644
--- a/platform/efi/efi_resolver/include/TypePropagation.h
+++ b/platform/efi/efi_resolver/include/TypePropagation.h
@@ -5,13 +5,14 @@
using namespace BinaryNinja;
-class TypePropagation {
- Ref<BinaryView> m_view;
- std::deque<uint64_t> m_queue;
- Ref<Platform> m_platform;
+class TypePropagation
+{
+ Ref<BinaryView> m_view;
+ std::deque<uint64_t> m_queue;
+ Ref<Platform> m_platform;
public:
- TypePropagation(BinaryView* view);
- bool propagateFuncParamTypes(Function* func);
- bool propagateFuncParamTypes(Function* func, SSAVariable ssa_var);
+ TypePropagation(BinaryView* view);
+ bool propagateFuncParamTypes(Function* func);
+ bool propagateFuncParamTypes(Function* func, SSAVariable ssa_var);
}; \ No newline at end of file
diff --git a/platform/efi/efi_resolver/include/Utils.h b/platform/efi/efi_resolver/include/Utils.h
index f2c371a8..981908b2 100644
--- a/platform/efi/efi_resolver/include/Utils.h
+++ b/platform/efi/efi_resolver/include/Utils.h
@@ -6,31 +6,35 @@ using namespace BinaryNinja;
static inline std::string GetOriginalTypeName(Ref<Type> type)
{
- std::string result;
- if (type->IsPointer()) {
- if (type->GetChildType().GetValue()->IsNamedTypeRefer()) {
- return type->GetChildType().GetValue()->GetNamedTypeReference()->GetName().GetString();
- }
- return type->GetTypeName().GetString();
- }
- if (type->IsNamedTypeRefer())
- return type->GetNamedTypeReference()->GetName().GetString();
+ std::string result;
+ if (type->IsPointer())
+ {
+ if (type->GetChildType().GetValue()->IsNamedTypeRefer())
+ {
+ return type->GetChildType().GetValue()->GetNamedTypeReference()->GetName().GetString();
+ }
+ return type->GetTypeName().GetString();
+ }
+ if (type->IsNamedTypeRefer())
+ return type->GetNamedTypeReference()->GetName().GetString();
- return type->GetTypeName().GetString();
+ return type->GetTypeName().GetString();
}
static inline std::string GetVarNameForTypeStr(const std::string typeStr)
{
- std::istringstream iss(typeStr);
- std::string word;
- std::string result;
+ std::istringstream iss(typeStr);
+ std::string word;
+ std::string result;
- while (std::getline(iss, word, '_')) {
- if (!word.empty()) {
- word[0] = std::toupper(word[0]);
- std::transform(word.begin() + 1, word.end(), word.begin() + 1, ::tolower);
- result += word;
- }
- }
- return result;
+ while (std::getline(iss, word, '_'))
+ {
+ if (!word.empty())
+ {
+ word[0] = std::toupper(word[0]);
+ std::transform(word.begin() + 1, word.end(), word.begin() + 1, ::tolower);
+ result += word;
+ }
+ }
+ return result;
}