diff options
| author | Brandon Miller <brandon@vector35.com> | 2025-04-25 13:30:45 -0400 |
|---|---|---|
| committer | Ryan Snyder <ryan@vector35.com> | 2025-06-23 13:44:12 -0400 |
| commit | b079d1a1e19151f5c39de84c2e1e6cc6a91abc74 (patch) | |
| tree | 8cf27224630b690fcfdfd490ee43ec1cd56fc9b6 /binaryninjacore.h | |
| parent | 76215b86ff629da58aa94d4cf4093d2e67017412 (diff) | |
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
Diffstat (limited to 'binaryninjacore.h')
| -rw-r--r-- | binaryninjacore.h | 77 |
1 files changed, 69 insertions, 8 deletions
diff --git a/binaryninjacore.h b/binaryninjacore.h index f94d4de6..9d84cf2a 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -307,6 +307,8 @@ extern "C" typedef struct BNLineFormatter BNLineFormatter; typedef struct BNRenderLayer BNRenderLayer; typedef struct BNStringRef BNStringRef; + typedef struct BNIndirectBranchInfo BNIndirectBranchInfo; + typedef struct BNArchitectureAndAddress BNArchitectureAndAddress; typedef bool(*BNProgressFunction)(void*, size_t, size_t); @@ -1856,6 +1858,30 @@ extern "C" uint8_t confidence; } BNTypeWithConfidence; + typedef enum BNFunctionAnalysisSkipOverride + { + DefaultFunctionAnalysisSkip, + NeverSkipFunctionAnalysis, + AlwaysSkipFunctionAnalysis + } BNFunctionAnalysisSkipOverride; + + typedef struct BNBasicBlockAnalysisContext + { + size_t indirectBranchesCount; + BNIndirectBranchInfo* indirectBranches; + BNFunctionAnalysisSkipOverride analysisSkipOverride; + bool translateTailCalls; + bool disallowBranchToString; + bool haltOnInvalidInstructions; + uint64_t maxFunctionSize; + + // OUT + bool maxSizeReached; + + BNArchitectureAndAddress* haltedDisassemblyAddresses; + size_t haltedDisassemblyAddressesCount; + } BNBasicBlockAnalysisContext; + typedef struct BNCustomArchitecture { void* context; @@ -1874,6 +1900,7 @@ extern "C" void (*freeInstructionText)(BNInstructionTextToken* tokens, size_t count); bool (*getInstructionLowLevelIL)( void* ctxt, const uint8_t* data, uint64_t addr, size_t* len, BNLowLevelILFunction* il); + void (*analyzeBasicBlocks)(void* ctxt, BNFunction* function, BNBasicBlockAnalysisContext* context); char* (*getRegisterName)(void* ctxt, uint32_t reg); char* (*getFlagName)(void* ctxt, uint32_t flag); char* (*getFlagWriteTypeName)(void* ctxt, uint32_t flags); @@ -1980,6 +2007,14 @@ extern "C" bool fallThrough; } BNBasicBlockEdge; + typedef struct BNPendingBasicBlockEdge + { + BNBranchType type; + BNArchitecture* arch; + uint64_t target; + bool fallThrough; + } BNPendingBasicBlockEdge; + typedef struct BNPoint { float x; @@ -3145,13 +3180,6 @@ extern "C" uint8_t confidence; } BNRegisterStackAdjustment; - typedef enum BNFunctionAnalysisSkipOverride - { - DefaultFunctionAnalysisSkip, - NeverSkipFunctionAnalysis, - AlwaysSkipFunctionAnalysis - } BNFunctionAnalysisSkipOverride; - typedef enum BNReportType { PlainTextReportType, @@ -4501,6 +4529,10 @@ extern "C" BINARYNINJACOREAPI bool BNGetInstructionLowLevelIL( BNArchitecture* arch, const uint8_t* data, uint64_t addr, size_t* len, BNLowLevelILFunction* il); BINARYNINJACOREAPI void BNFreeInstructionText(BNInstructionTextToken* tokens, size_t count); + BINARYNINJACOREAPI bool BNArchitectureSetDefaultAnalyzeBasicBlocksCallback(void *callback); + BINARYNINJACOREAPI void BNArchitectureDefaultAnalyzeBasicBlocks(BNFunction* function, BNBasicBlockAnalysisContext* context); + BINARYNINJACOREAPI void BNArchitectureAnalyzeBasicBlocks(BNArchitecture* arch, BNFunction* function, + BNBasicBlockAnalysisContext* context); BINARYNINJACOREAPI void BNFreeInstructionTextLines(BNInstructionTextLine* lines, size_t count); BINARYNINJACOREAPI char* BNGetArchitectureRegisterName(BNArchitecture* arch, uint32_t reg); BINARYNINJACOREAPI char* BNGetArchitectureFlagName(BNArchitecture* arch, uint32_t flag); @@ -4616,6 +4648,7 @@ extern "C" BINARYNINJACOREAPI void BNUpdateAnalysisAndWait(BNBinaryView* view); BINARYNINJACOREAPI void BNUpdateAnalysis(BNBinaryView* view); BINARYNINJACOREAPI void BNAbortAnalysis(BNBinaryView* view); + BINARYNINJACOREAPI bool BNAnalysisIsAborted(BNBinaryView* view); BINARYNINJACOREAPI bool BNIsFunctionUpdateNeeded(BNFunction* func); BINARYNINJACOREAPI void BNRequestAdvancedFunctionAnalysisData(BNFunction* func); BINARYNINJACOREAPI void BNReleaseAdvancedFunctionAnalysisData(BNFunction* func); @@ -4679,6 +4712,9 @@ extern "C" BINARYNINJACOREAPI void BNFreeBasicBlock(BNBasicBlock* block); BINARYNINJACOREAPI BNBasicBlock** BNGetFunctionBasicBlockList(BNFunction* func, size_t* count); BINARYNINJACOREAPI void BNFreeBasicBlockList(BNBasicBlock** blocks, size_t count); + BINARYNINJACOREAPI BNBasicBlock* BNCreateFunctionBasicBlock(BNFunction* func, BNArchitecture* arch, uint64_t addr); + BINARYNINJACOREAPI void BNAddFunctionBasicBlock(BNFunction* func, BNBasicBlock* block); + BINARYNINJACOREAPI void BNFinalizeFunctionBasicBlocks(BNFunction* func); BINARYNINJACOREAPI BNBasicBlock* BNGetFunctionBasicBlockAtAddress( BNFunction* func, BNArchitecture* arch, uint64_t addr); BINARYNINJACOREAPI BNBasicBlock* BNGetRecentBasicBlockForAddress(BNBinaryView* view, uint64_t addr); @@ -4816,14 +4852,26 @@ extern "C" BINARYNINJACOREAPI BNArchitecture* BNGetBasicBlockArchitecture(BNBasicBlock* block); BINARYNINJACOREAPI BNBasicBlock* BNGetBasicBlockSource(BNBasicBlock* block); BINARYNINJACOREAPI uint64_t BNGetBasicBlockStart(BNBasicBlock* block); + BINARYNINJACOREAPI void BNSetBasicBlockEnd(BNBasicBlock* block, uint64_t end); BINARYNINJACOREAPI uint64_t BNGetBasicBlockEnd(BNBasicBlock* block); BINARYNINJACOREAPI uint64_t BNGetBasicBlockLength(BNBasicBlock* block); BINARYNINJACOREAPI BNBasicBlockEdge* BNGetBasicBlockOutgoingEdges(BNBasicBlock* block, size_t* count); BINARYNINJACOREAPI BNBasicBlockEdge* BNGetBasicBlockIncomingEdges(BNBasicBlock* block, size_t* count); BINARYNINJACOREAPI void BNFreeBasicBlockEdgeList(BNBasicBlockEdge* edges, size_t count); BINARYNINJACOREAPI bool BNBasicBlockHasUndeterminedOutgoingEdges(BNBasicBlock* block); + BINARYNINJACOREAPI void BNBasicBlockAddPendingOutgoingEdge(BNBasicBlock* block, BNBranchType type, + uint64_t addr, BNArchitecture* arch, bool fallThrough); + BINARYNINJACOREAPI BNPendingBasicBlockEdge* BNGetBasicBlockPendingOutgoingEdges(BNBasicBlock* block, size_t* count); + BINARYNINJACOREAPI void BNFreePendingBasicBlockEdgeList(BNPendingBasicBlockEdge* edges); + BINARYNINJACOREAPI void BNClearBasicBlockPendingOutgoingEdges(BNBasicBlock* block); + BINARYNINJACOREAPI void BNBasicBlockSetUndeterminedOutgoingEdges(BNBasicBlock* block, bool value); + BINARYNINJACOREAPI const uint8_t* BNBasicBlockGetInstructionData(BNBasicBlock* block, uint64_t addr, size_t* len); + BINARYNINJACOREAPI void BNBasicBlockAddInstructionData(BNBasicBlock* block, const void* data, size_t len); + BINARYNINJACOREAPI void BNBasicBlockSetFallThroughToFunction(BNBasicBlock* block, bool value); + BINARYNINJACOREAPI bool BNBasicBlockIsFallThroughToFunction(BNBasicBlock* block); BINARYNINJACOREAPI bool BNBasicBlockCanExit(BNBasicBlock* block); BINARYNINJACOREAPI void BNBasicBlockSetCanExit(BNBasicBlock* block, bool value); + BINARYNINJACOREAPI void BNBasicBlockSetHasInvalidInstructions(BNBasicBlock* block, bool value); BINARYNINJACOREAPI bool BNBasicBlockHasInvalidInstructions(BNBasicBlock* block); BINARYNINJACOREAPI size_t BNGetBasicBlockIndex(BNBasicBlock* block); BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockDominators(BNBasicBlock* block, size_t* count, bool post); @@ -5048,6 +5096,18 @@ extern "C" BINARYNINJACOREAPI BNIndirectBranchInfo* BNGetIndirectBranchesAt( BNFunction* func, BNArchitecture* arch, uint64_t addr, size_t* count); BINARYNINJACOREAPI void BNFreeIndirectBranchList(BNIndirectBranchInfo* branches); + BINARYNINJACOREAPI void BNFunctionAddDirectCodeReference(BNFunction* func, BNArchitectureAndAddress* source, + uint64_t target); + BINARYNINJACOREAPI void BNFunctionAddDirectNoReturnCall(BNFunction* func, BNArchitectureAndAddress* location); + BINARYNINJACOREAPI bool BNFunctionLocationHasNoReturnCalls(BNFunction* func, BNArchitectureAndAddress* location); + BINARYNINJACOREAPI BNFunction* BNGetCalleeForAnalysis(BNFunction* func, BNPlatform* platform, + uint64_t addr, bool exact); + BINARYNINJACOREAPI void BNFunctionAddTempOutgoingReference(BNFunction* func, BNFunction* target); + BINARYNINJACOREAPI bool BNFunctionHasTempOutgoingReference(BNFunction* func, BNFunction* target); + BINARYNINJACOREAPI void BNFunctionAddTempIncomingReference(BNFunction* func, BNFunction* source); + + BINARYNINJACOREAPI bool BNFunctionGetContextualFunctionReturn(BNFunction* func, BNArchitectureAndAddress* location, bool* value); + BINARYNINJACOREAPI void BNFunctionSetContextualFunctionReturn(BNFunction* func, BNArchitectureAndAddress* location, bool value); BINARYNINJACOREAPI uint64_t* BNGetUnresolvedIndirectBranches(BNFunction* func, size_t* count); BINARYNINJACOREAPI bool BNHasUnresolvedIndirectBranches(BNFunction* func); @@ -5117,13 +5177,14 @@ extern "C" BINARYNINJACOREAPI void BNSetMaxFunctionSizeForAnalysis(BNBinaryView* view, uint64_t size); BINARYNINJACOREAPI bool BNGetNewAutoFunctionAnalysisSuppressed(BNBinaryView* view); BINARYNINJACOREAPI void BNSetNewAutoFunctionAnalysisSuppressed(BNBinaryView* view, bool suppress); - BINARYNINJACOREAPI BNAnalysisCompletionEvent* BNAddAnalysisCompletionEvent( BNBinaryView* view, void* ctxt, void (*callback)(void* ctxt)); BINARYNINJACOREAPI BNAnalysisCompletionEvent* BNNewAnalysisCompletionEventReference( BNAnalysisCompletionEvent* event); BINARYNINJACOREAPI void BNFreeAnalysisCompletionEvent(BNAnalysisCompletionEvent* event); BINARYNINJACOREAPI void BNCancelAnalysisCompletionEvent(BNAnalysisCompletionEvent* event); + BINARYNINJACOREAPI bool BNShouldSkipTargetAnalysis(BNBinaryView* view, BNArchitectureAndAddress* source, + BNFunction* sourceFunc, uint64_t sourceEnd, BNArchitectureAndAddress* target); BINARYNINJACOREAPI BNAnalysisInfo* BNGetAnalysisInfo(BNBinaryView* view); BINARYNINJACOREAPI void BNFreeAnalysisInfo(BNAnalysisInfo* info); |
