summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-03-10 03:21:04 -0400
committerRusty Wagner <rusty@vector35.com>2015-03-10 03:21:04 -0400
commit1c9293031e8b4554756350ccd33363cdd83bfc43 (patch)
tree33906522917b26d7894784f75964fbe15392f092
parent55b999c719a33235c46166563df750b2a0fd30aa (diff)
Implement make function hotkey and disassembly navigation
-rw-r--r--basicblock.cpp6
-rw-r--r--binaryninjaapi.h14
-rw-r--r--binaryview.cpp64
-rw-r--r--function.cpp6
-rw-r--r--functiongraphblock.cpp12
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);