summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-02-18 00:44:25 -0500
committerRusty Wagner <rusty@vector35.com>2015-02-18 00:44:25 -0500
commit3f36f01667138e248d030701b9c0c047c1c7f5d7 (patch)
tree07ca9fc0c591a747408eacba1208a7ab6ddf0c7e
parent256e44f3a1443e1e9fd689387f09ea37d57dbcf8 (diff)
Add simple basic block analysis
-rw-r--r--binaryninjaapi.h8
-rw-r--r--binaryview.cpp26
2 files changed, 34 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index dbbd4b25..331fa1fb 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -278,6 +278,8 @@ namespace BinaryNinja
virtual size_t Write(uint64_t offset, const void* src, size_t len) override;
};
+ class Architecture;
+
class BinaryView: public RefCountObject
{
protected:
@@ -294,6 +296,7 @@ namespace BinaryNinja
static BNModificationStatus GetModificationCallback(void* ctxt, uint64_t offset);
static uint64_t GetStartCallback(void* ctxt);
static uint64_t GetLengthCallback(void* ctxt);
+ static uint64_t GetEntryPointCallback(void* ctxt);
static bool IsExecutableCallback(void* ctxt);
static bool SaveCallback(void* ctxt, BNFileAccessor* file);
@@ -305,6 +308,7 @@ namespace BinaryNinja
virtual BNModificationStatus PerformGetModification(uint64_t offset) { (void)offset; return Original; }
virtual uint64_t PerformGetStart() const { return 0; }
virtual uint64_t PerformGetLength() const { return 0; }
+ virtual uint64_t PerformGetEntryPoint() const { return 0; }
virtual bool PerformIsExecutable() const { return false; }
virtual bool PerformSave(FileAccessor* file) { (void)file; return false; }
@@ -346,6 +350,7 @@ namespace BinaryNinja
uint64_t GetStart() const;
uint64_t GetEnd() const;
uint64_t GetLength() const;
+ uint64_t GetEntryPoint() const;
bool IsExecutable() const;
@@ -354,6 +359,9 @@ namespace BinaryNinja
void RegisterNotification(BinaryDataNotification* notify);
void UnregisterNotification(BinaryDataNotification* notify);
+
+ void AddFunctionForAnalysis(Architecture* arch, uint64_t addr);
+ void UpdateAnalysis();
};
class BinaryData: public BinaryView
diff --git a/binaryview.cpp b/binaryview.cpp
index 1dc21283..e99ed738 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -48,6 +48,7 @@ BinaryView::BinaryView(FileMetadata* file)
view.getModification = GetModificationCallback;
view.getStart = GetStartCallback;
view.getLength = GetLengthCallback;
+ view.getEntryPoint = GetEntryPointCallback;
view.isExecutable = IsExecutableCallback;
view.save = SaveCallback;
@@ -118,6 +119,13 @@ uint64_t BinaryView::GetLengthCallback(void* ctxt)
}
+uint64_t BinaryView::GetEntryPointCallback(void* ctxt)
+{
+ BinaryView* view = (BinaryView*)ctxt;
+ return view->PerformGetEntryPoint();
+}
+
+
bool BinaryView::IsExecutableCallback(void* ctxt)
{
BinaryView* view = (BinaryView*)ctxt;
@@ -286,6 +294,12 @@ uint64_t BinaryView::GetLength() const
}
+uint64_t BinaryView::GetEntryPoint() const
+{
+ return BNGetEntryPoint(m_view);
+}
+
+
bool BinaryView::IsExecutable() const
{
return BNIsExecutableView(m_view);
@@ -298,6 +312,18 @@ bool BinaryView::Save(FileAccessor* file)
}
+void BinaryView::AddFunctionForAnalysis(Architecture* arch, uint64_t addr)
+{
+ BNAddFunctionForAnalysis(m_view, arch->GetArchitectureObject(), addr);
+}
+
+
+void BinaryView::UpdateAnalysis()
+{
+ BNUpdateAnalysis(m_view);
+}
+
+
BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetFileObject()))
{
}