blob: b562975c15c13d2f23b0543933cad6462e7650e5 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#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);
#ifndef 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();
}
#ifndef DEBUG
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;
}
}
|