summaryrefslogtreecommitdiff
path: root/platform/efi/efi_resolver/include
diff options
context:
space:
mode:
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;
}