diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-03-10 03:21:04 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-03-10 03:21:04 -0400 |
| commit | 1c9293031e8b4554756350ccd33363cdd83bfc43 (patch) | |
| tree | 33906522917b26d7894784f75964fbe15392f092 | |
| parent | 55b999c719a33235c46166563df750b2a0fd30aa (diff) | |
Implement make function hotkey and disassembly navigation
| -rw-r--r-- | basicblock.cpp | 6 | ||||
| -rw-r--r-- | binaryninjaapi.h | 14 | ||||
| -rw-r--r-- | binaryview.cpp | 64 | ||||
| -rw-r--r-- | function.cpp | 6 | ||||
| -rw-r--r-- | functiongraphblock.cpp | 12 |
5 files changed, 102 insertions, 0 deletions
diff --git a/basicblock.cpp b/basicblock.cpp index a1becd10..bca6e704 100644 --- a/basicblock.cpp +++ b/basicblock.cpp @@ -63,3 +63,9 @@ vector<BasicBlockEdge> 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<Architecture> GetDefaultArchitecture() const; + void SetDefaultArchitecture(Architecture* arch); + bool IsExecutable() const; bool Save(FileAccessor* file); @@ -396,7 +400,12 @@ namespace BinaryNinja std::vector<Ref<Function>> GetAnalysisFunctionList(); Ref<Function> GetAnalysisFunction(Architecture* arch, uint64_t addr); + Ref<Function> GetRecentAnalysisFunctionForAddress(uint64_t addr); + std::vector<Ref<Function>> GetAnalysisFunctionsForAddress(uint64_t addr); Ref<Function> GetAnalysisEntryPoint(); + + Ref<BasicBlock> GetRecentBasicBlockForAddress(uint64_t addr); + std::vector<Ref<BasicBlock>> GetBasicBlocksForAddress(uint64_t addr); }; class BinaryData: public BinaryView @@ -690,6 +699,8 @@ namespace BinaryNinja uint64_t GetLength() const; std::vector<BasicBlockEdge> GetOutgoingEdges() const; + + void MarkRecentUse(); }; class FunctionGraph; @@ -708,6 +719,7 @@ namespace BinaryNinja uint64_t GetStart() const; std::vector<Ref<BasicBlock>> GetBasicBlocks() const; + void MarkRecentUse(); Ref<FunctionGraph> 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<Architecture> 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<Function> BinaryView::GetAnalysisFunction(Architecture* arch, uint64_t addr) } +Ref<Function> BinaryView::GetRecentAnalysisFunctionForAddress(uint64_t addr) +{ + BNFunction* func = BNGetRecentAnalysisFunctionForAddress(m_view, addr); + if (!func) + return nullptr; + return new Function(func); +} + + +vector<Ref<Function>> BinaryView::GetAnalysisFunctionsForAddress(uint64_t addr) +{ + size_t count; + BNFunction** list = BNGetAnalysisFunctionsForAddress(m_view, addr, &count); + + vector<Ref<Function>> result; + for (size_t i = 0; i < count; i++) + result.push_back(new Function(BNNewFunctionReference(list[i]))); + + BNFreeFunctionList(list, count); + return result; +} + + Ref<Function> BinaryView::GetAnalysisEntryPoint() { BNFunction* func = BNGetAnalysisEntryPoint(m_view); @@ -368,6 +409,29 @@ Ref<Function> BinaryView::GetAnalysisEntryPoint() } +Ref<BasicBlock> BinaryView::GetRecentBasicBlockForAddress(uint64_t addr) +{ + BNBasicBlock* block = BNGetRecentBasicBlockForAddress(m_view, addr); + if (!block) + return nullptr; + return new BasicBlock(block); +} + + +vector<Ref<BasicBlock>> BinaryView::GetBasicBlocksForAddress(uint64_t addr) +{ + size_t count; + BNBasicBlock** blocks = BNGetBasicBlocksForAddress(m_view, addr, &count); + + vector<Ref<BasicBlock>> 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<Ref<BasicBlock>> Function::GetBasicBlocks() const } +void Function::MarkRecentUse() +{ + BNMarkFunctionAsRecentlyUsed(m_func); +} + + Ref<FunctionGraph> 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); |
