From b079d1a1e19151f5c39de84c2e1e6cc6a91abc74 Mon Sep 17 00:00:00 2001 From: Brandon Miller Date: Fri, 25 Apr 2025 13:30:45 -0400 Subject: Perform BB analysis from Architecture C++ API This commit moves AnalyzeBasicBlocks from the binary ninja core to the API and allows architecture plugins to optionally override AnalyzeBasicBlocks for a custom implementation Supply ABB inputs in BNBasicBlockAnalysisContext Register default analyze basic blocks callback This allows the nanomips and rust core architecture plugins to work again while using the C++ API DefaultAnalyzeBasicBlocks Use default ABB from Python plugins Fix bug in API ArchAndAddr operator overload Python APIs for basic block analysis --- architecture.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'architecture.cpp') diff --git a/architecture.cpp b/architecture.cpp index 22bf6fc3..22045ee2 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -24,6 +24,7 @@ #include #include #include "binaryninjaapi.h" +#include "lowlevelilinstruction.h" #include "ffi.h" using namespace BinaryNinja; @@ -327,6 +328,15 @@ bool Architecture::GetInstructionLowLevelILCallback( } +void Architecture::AnalyzeBasicBlocksCallback(void *ctxt, BNFunction* function, + BNBasicBlockAnalysisContext* context) +{ + CallbackRef arch(ctxt); + Ref func(new Function(BNNewFunctionReference(function))); + arch->AnalyzeBasicBlocks(*func, *context); +} + + char* Architecture::GetRegisterNameCallback(void* ctxt, uint32_t reg) { CallbackRef arch(ctxt); @@ -817,6 +827,7 @@ void Architecture::Register(Architecture* arch) callbacks.getInstructionText = GetInstructionTextCallback; callbacks.freeInstructionText = FreeInstructionTextCallback; callbacks.getInstructionLowLevelIL = GetInstructionLowLevelILCallback; + callbacks.analyzeBasicBlocks = AnalyzeBasicBlocksCallback; callbacks.getRegisterName = GetRegisterNameCallback; callbacks.getFlagName = GetFlagNameCallback; callbacks.getFlagWriteTypeName = GetFlagWriteTypeNameCallback; @@ -945,6 +956,12 @@ bool Architecture::GetInstructionLowLevelIL(const uint8_t*, uint64_t, size_t&, L } +void Architecture::AnalyzeBasicBlocks(Function& function, BasicBlockAnalysisContext& context) +{ + DefaultAnalyzeBasicBlocks(function, context); +} + + string Architecture::GetRegisterName(uint32_t reg) { return fmt::format("r{}", reg); @@ -1505,6 +1522,12 @@ bool CoreArchitecture::GetInstructionLowLevelIL(const uint8_t* data, uint64_t ad } +void CoreArchitecture::AnalyzeBasicBlocks(Function& function, BasicBlockAnalysisContext& context) +{ + BNArchitectureAnalyzeBasicBlocks(m_object, function.GetObject(), &context); +} + + string CoreArchitecture::GetRegisterName(uint32_t reg) { char* name = BNGetArchitectureRegisterName(m_object, reg); -- cgit v1.3.1