From 1c9293031e8b4554756350ccd33363cdd83bfc43 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Tue, 10 Mar 2015 03:21:04 -0400 Subject: Implement make function hotkey and disassembly navigation --- basicblock.cpp | 6 +++++ binaryninjaapi.h | 14 +++++++++++ binaryview.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ function.cpp | 6 +++++ functiongraphblock.cpp | 12 ++++++++++ 5 files changed, 102 insertions(+) diff --git a/basicblock.cpp b/basicblock.cpp index a1becd10..bca6e704 100644 --- a/basicblock.cpp +++ b/basicblock.cpp @@ -63,3 +63,9 @@ vector BasicBlock::GetOutgoingEdges() const BNFreeBasicBlockOutgoingEdgeList(array); return result; } + + +void BasicBlock::MarkRecentUse() +{ + BNMarkBasicBlockAsRecentlyUsed(m_block); +} diff --git a/binaryninjaapi.h b/binaryninjaapi.h index b0ed5a04..4e6c09b3 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -308,6 +308,7 @@ namespace BinaryNinja class Architecture; class Function; + class BasicBlock; class BinaryView: public RefCountObject { @@ -381,6 +382,9 @@ namespace BinaryNinja uint64_t GetLength() const; uint64_t GetEntryPoint() const; + Ref GetDefaultArchitecture() const; + void SetDefaultArchitecture(Architecture* arch); + bool IsExecutable() const; bool Save(FileAccessor* file); @@ -396,7 +400,12 @@ namespace BinaryNinja std::vector> GetAnalysisFunctionList(); Ref GetAnalysisFunction(Architecture* arch, uint64_t addr); + Ref GetRecentAnalysisFunctionForAddress(uint64_t addr); + std::vector> GetAnalysisFunctionsForAddress(uint64_t addr); Ref GetAnalysisEntryPoint(); + + Ref GetRecentBasicBlockForAddress(uint64_t addr); + std::vector> GetBasicBlocksForAddress(uint64_t addr); }; class BinaryData: public BinaryView @@ -690,6 +699,8 @@ namespace BinaryNinja uint64_t GetLength() const; std::vector GetOutgoingEdges() const; + + void MarkRecentUse(); }; class FunctionGraph; @@ -708,6 +719,7 @@ namespace BinaryNinja uint64_t GetStart() const; std::vector> GetBasicBlocks() const; + void MarkRecentUse(); Ref CreateFunctionGraph(); }; @@ -736,6 +748,8 @@ namespace BinaryNinja BNFunctionGraphBlock* GetBlockObject() const { return m_block; } + uint64_t GetStart() const; + uint64_t GetEnd() const; int GetX() const; int GetY() const; int GetWidth() const; diff --git a/binaryview.cpp b/binaryview.cpp index d274acb7..82fcdc6d 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -300,6 +300,24 @@ uint64_t BinaryView::GetEntryPoint() const } +Ref BinaryView::GetDefaultArchitecture() const +{ + BNArchitecture* arch = BNGetDefaultArchitecture(m_view); + if (!arch) + return nullptr; + return new CoreArchitecture(arch); +} + + +void BinaryView::SetDefaultArchitecture(Architecture* arch) +{ + if (arch) + BNSetDefaultArchitecture(m_view, arch->GetArchitectureObject()); + else + BNSetDefaultArchitecture(m_view, nullptr); +} + + bool BinaryView::IsExecutable() const { return BNIsExecutableView(m_view); @@ -359,6 +377,29 @@ Ref BinaryView::GetAnalysisFunction(Architecture* arch, uint64_t addr) } +Ref BinaryView::GetRecentAnalysisFunctionForAddress(uint64_t addr) +{ + BNFunction* func = BNGetRecentAnalysisFunctionForAddress(m_view, addr); + if (!func) + return nullptr; + return new Function(func); +} + + +vector> BinaryView::GetAnalysisFunctionsForAddress(uint64_t addr) +{ + size_t count; + BNFunction** list = BNGetAnalysisFunctionsForAddress(m_view, addr, &count); + + vector> result; + for (size_t i = 0; i < count; i++) + result.push_back(new Function(BNNewFunctionReference(list[i]))); + + BNFreeFunctionList(list, count); + return result; +} + + Ref BinaryView::GetAnalysisEntryPoint() { BNFunction* func = BNGetAnalysisEntryPoint(m_view); @@ -368,6 +409,29 @@ Ref BinaryView::GetAnalysisEntryPoint() } +Ref BinaryView::GetRecentBasicBlockForAddress(uint64_t addr) +{ + BNBasicBlock* block = BNGetRecentBasicBlockForAddress(m_view, addr); + if (!block) + return nullptr; + return new BasicBlock(block); +} + + +vector> BinaryView::GetBasicBlocksForAddress(uint64_t addr) +{ + size_t count; + BNBasicBlock** blocks = BNGetBasicBlocksForAddress(m_view, addr, &count); + + vector> result; + for (size_t i = 0; i < count; i++) + result.push_back(new BasicBlock(BNNewBasicBlockReference(blocks[i]))); + + BNFreeBasicBlockList(blocks, count); + return result; +} + + BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetFileObject())) { } diff --git a/function.cpp b/function.cpp index a57c90f6..eb42c46c 100644 --- a/function.cpp +++ b/function.cpp @@ -41,6 +41,12 @@ vector> Function::GetBasicBlocks() const } +void Function::MarkRecentUse() +{ + BNMarkFunctionAsRecentlyUsed(m_func); +} + + Ref Function::CreateFunctionGraph() { BNFunctionGraph* graph = BNCreateFunctionGraph(m_func); diff --git a/functiongraphblock.cpp b/functiongraphblock.cpp index 3914cc18..3653d749 100644 --- a/functiongraphblock.cpp +++ b/functiongraphblock.cpp @@ -15,6 +15,18 @@ FunctionGraphBlock::~FunctionGraphBlock() } +uint64_t FunctionGraphBlock::GetStart() const +{ + return BNGetFunctionGraphBlockStart(m_block); +} + + +uint64_t FunctionGraphBlock::GetEnd() const +{ + return BNGetFunctionGraphBlockEnd(m_block); +} + + int FunctionGraphBlock::GetX() const { return BNGetFunctionGraphBlockX(m_block); -- cgit v1.3.1