diff options
Diffstat (limited to 'platform/efi/efi_resolver/src/Plugin.cpp')
| -rw-r--r-- | platform/efi/efi_resolver/src/Plugin.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/platform/efi/efi_resolver/src/Plugin.cpp b/platform/efi/efi_resolver/src/Plugin.cpp new file mode 100644 index 00000000..bfa19a7f --- /dev/null +++ b/platform/efi/efi_resolver/src/Plugin.cpp @@ -0,0 +1,64 @@ +#include "DxeResolver.h" +#include "PeiResolver.h" +#include "binaryninjaapi.h" +#include <thread> + +using namespace BinaryNinja; + +extern "C" { +BN_DECLARE_CORE_ABI_VERSION + +BINARYNINJAPLUGIN void CorePluginDependencies() +{ + BinaryNinja::AddOptionalPluginDependency("arch_x86"); + BinaryNinja::AddOptionalPluginDependency("arch_armv7"); + BinaryNinja::AddOptionalPluginDependency("arch_arm64"); + BinaryNinja::AddOptionalPluginDependency("platform_efi"); +} + +static Ref<BackgroundTask> efiBackgroundTask = nullptr; + +void Run(Ref<BinaryView> view) +{ + efiBackgroundTask = new BackgroundTask("Loading EFI protocol mappings!", true); + thread resolverThread([view]() { + LogInfo("Entering new thread"); + + LogInfo("Identifying module type"); + EFIModuleType moduleType = identifyModuleType(view); + +#ifdef DEBUG + auto undo = view->BeginUndoActions(); +#endif + if (moduleType == PEI) { + efiBackgroundTask->SetProgressText("Resolving PEIM..."); + auto resolver = PeiResolver(view, efiBackgroundTask); + resolver.resolvePei(); + } else if (moduleType == DXE) { + efiBackgroundTask->SetProgressText("Resolving DXE protocols..."); + auto resolver = DxeResolver(view, efiBackgroundTask); + resolver.resolveDxe(); + efiBackgroundTask->SetProgressText("Resolving MM related protocols..."); + resolver.resolveSmm(); + } + +#ifdef DEBUG + resolver.m_view->CommitUndoActions(undo); +#endif + efiBackgroundTask->Finish(); + }); + resolverThread.detach(); +} + +BINARYNINJAPLUGIN bool CorePluginInit() +{ + EfiGuidRenderer::Register(); + + PluginCommand::Register( + "EFI Resolver\\Resolve EFI Types And Protocols", + "Resolve EFI Protocols", + &Run); + + return true; +} +} |
