summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h7
-rw-r--r--binaryninjacore.h18
-rw-r--r--binaryview.cpp39
-rw-r--r--python/__init__.py39
4 files changed, 96 insertions, 7 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index d1d8eeb5..94e888d3 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -523,6 +523,7 @@ namespace BinaryNinja
class BinaryView;
class Function;
+ struct DataVariable;
class BinaryDataNotification
{
@@ -535,6 +536,9 @@ namespace BinaryNinja
static void FunctionAddedCallback(void* ctxt, BNBinaryView* data, BNFunction* func);
static void FunctionRemovedCallback(void* ctxt, BNBinaryView* data, BNFunction* func);
static void FunctionUpdatedCallback(void* ctxt, BNBinaryView* data, BNFunction* func);
+ static void DataVariableAddedCallback(void* ctxt, BNBinaryView* data, BNDataVariable* var);
+ static void DataVariableRemovedCallback(void* ctxt, BNBinaryView* data, BNDataVariable* var);
+ static void DataVariableUpdatedCallback(void* ctxt, BNBinaryView* data, BNDataVariable* var);
static void StringFoundCallback(void* ctxt, BNBinaryView* data, BNStringType type, uint64_t offset, size_t len);
static void StringRemovedCallback(void* ctxt, BNBinaryView* data, BNStringType type, uint64_t offset, size_t len);
@@ -550,6 +554,9 @@ namespace BinaryNinja
virtual void OnAnalysisFunctionAdded(BinaryView* view, Function* func) { (void)view; (void)func; }
virtual void OnAnalysisFunctionRemoved(BinaryView* view, Function* func) { (void)view; (void)func; }
virtual void OnAnalysisFunctionUpdated(BinaryView* view, Function* func) { (void)view; (void)func; }
+ virtual void OnDataVariableAdded(BinaryView* view, const DataVariable& var) { (void)view; (void)var; }
+ virtual void OnDataVariableRemoved(BinaryView* view, const DataVariable& var) { (void)view; (void)var; }
+ virtual void OnDataVariableUpdated(BinaryView* view, const DataVariable& var) { (void)view; (void)var; }
virtual void OnStringFound(BinaryView* data, BNStringType type, uint64_t offset, size_t len) { (void)data; (void)type; (void)offset; (void)len; }
virtual void OnStringRemoved(BinaryView* data, BNStringType type, uint64_t offset, size_t len) { (void)data; (void)type; (void)offset; (void)len; }
};
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 9af53442..d667d12a 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -171,6 +171,7 @@ extern "C"
HexDumpInvalidByteToken = 18,
HexDumpTextToken = 19,
OpcodeToken = 20,
+ StringToken = 21,
// The following are output by the analysis system automatically, these should
// not be used directly by the architecture plugins
@@ -556,6 +557,13 @@ extern "C"
uint64_t value;
};
+ struct BNDataVariable
+ {
+ uint64_t address;
+ BNType* type;
+ bool autoDiscovered;
+ };
+
// Callbacks
struct BNLogListener
{
@@ -582,6 +590,9 @@ extern "C"
void (*functionAdded)(void* ctxt, BNBinaryView* view, BNFunction* func);
void (*functionRemoved)(void* ctxt, BNBinaryView* view, BNFunction* func);
void (*functionUpdated)(void* ctxt, BNBinaryView* view, BNFunction* func);
+ void (*dataVariableAdded)(void* ctxt, BNBinaryView* view, BNDataVariable* var);
+ void (*dataVariableRemoved)(void* ctxt, BNBinaryView* view, BNDataVariable* var);
+ void (*dataVariableUpdated)(void* ctxt, BNBinaryView* view, BNDataVariable* var);
void (*stringFound)(void* ctxt, BNBinaryView* view, BNStringType type, uint64_t offset, size_t len);
void (*stringRemoved)(void* ctxt, BNBinaryView* view, BNStringType type, uint64_t offset, size_t len);
};
@@ -930,13 +941,6 @@ extern "C"
size_t count, total;
};
- struct BNDataVariable
- {
- uint64_t address;
- BNType* type;
- bool autoDiscovered;
- };
-
BINARYNINJACOREAPI char* BNAllocString(const char* contents);
BINARYNINJACOREAPI void BNFreeString(char* str);
diff --git a/binaryview.cpp b/binaryview.cpp
index 6d96c8ea..6c84a69b 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -75,6 +75,42 @@ void BinaryDataNotification::FunctionUpdatedCallback(void* ctxt, BNBinaryView* o
}
+void BinaryDataNotification::DataVariableAddedCallback(void* ctxt, BNBinaryView* object, BNDataVariable* var)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new BinaryView(BNNewViewReference(object));
+ DataVariable varObj;
+ varObj.address = var->address;
+ varObj.type = new Type(BNNewTypeReference(var->type));
+ varObj.autoDiscovered = var->autoDiscovered;
+ notify->OnDataVariableAdded(view, varObj);
+}
+
+
+void BinaryDataNotification::DataVariableRemovedCallback(void* ctxt, BNBinaryView* object, BNDataVariable* var)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new BinaryView(BNNewViewReference(object));
+ DataVariable varObj;
+ varObj.address = var->address;
+ varObj.type = new Type(BNNewTypeReference(var->type));
+ varObj.autoDiscovered = var->autoDiscovered;
+ notify->OnDataVariableRemoved(view, varObj);
+}
+
+
+void BinaryDataNotification::DataVariableUpdatedCallback(void* ctxt, BNBinaryView* object, BNDataVariable* var)
+{
+ BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
+ Ref<BinaryView> view = new BinaryView(BNNewViewReference(object));
+ DataVariable varObj;
+ varObj.address = var->address;
+ varObj.type = new Type(BNNewTypeReference(var->type));
+ varObj.autoDiscovered = var->autoDiscovered;
+ notify->OnDataVariableUpdated(view, varObj);
+}
+
+
void BinaryDataNotification::StringFoundCallback(void* ctxt, BNBinaryView* object, BNStringType type, uint64_t offset, size_t len)
{
BinaryDataNotification* notify = (BinaryDataNotification*)ctxt;
@@ -100,6 +136,9 @@ BinaryDataNotification::BinaryDataNotification()
m_callbacks.functionAdded = FunctionAddedCallback;
m_callbacks.functionRemoved = FunctionRemovedCallback;
m_callbacks.functionUpdated = FunctionUpdatedCallback;
+ m_callbacks.dataVariableAdded = DataVariableAddedCallback;
+ m_callbacks.dataVariableRemoved = DataVariableRemovedCallback;
+ m_callbacks.dataVariableUpdated = DataVariableUpdatedCallback;
m_callbacks.stringFound = StringFoundCallback;
m_callbacks.stringRemoved = StringRemovedCallback;
}
diff --git a/python/__init__.py b/python/__init__.py
index 0d9c15a2..7564ee98 100644
--- a/python/__init__.py
+++ b/python/__init__.py
@@ -387,6 +387,15 @@ class BinaryDataNotification:
def function_updated(self, view, func):
pass
+ def data_var_added(self, view, var):
+ pass
+
+ def data_var_removed(self, view, var):
+ pass
+
+ def data_var_updated(self, view, var):
+ pass
+
def string_found(self, view, string_type, offset, length):
pass
@@ -483,6 +492,9 @@ class BinaryDataNotificationCallbacks:
self._cb.functionAdded = self._cb.functionAdded.__class__(self._function_added)
self._cb.functionRemoved = self._cb.functionRemoved.__class__(self._function_removed)
self._cb.functionUpdated = self._cb.functionUpdated.__class__(self._function_updated)
+ self._cb.dataVariableAdded = self._cb.dataVariableAdded.__class__(self._data_var_added)
+ self._cb.dataVariableRemoved = self._cb.dataVariableRemoved.__class__(self._data_var_removed)
+ self._cb.dataVariableUpdated = self._cb.dataVariableUpdated.__class__(self._data_var_updated)
self._cb.stringFound = self._cb.stringFound.__class__(self._string_found)
self._cb.stringRemoved = self._cb.stringRemoved.__class__(self._string_removed)
@@ -528,6 +540,33 @@ class BinaryDataNotificationCallbacks:
except:
log_error(traceback.format_exc())
+ def _data_var_added(self, ctxt, view, var):
+ try:
+ address = var.address
+ var_type = Type(core.BNNewTypeReference(var.type))
+ auto_discovered = var.autoDiscovered
+ self.notify.data_var_added(self.view, DataVariable(address, var_type, auto_discovered))
+ except:
+ log_error(traceback.format_exc())
+
+ def _data_var_removed(self, ctxt, view, var):
+ try:
+ address = var.address
+ var_type = Type(core.BNNewTypeReference(var.type))
+ auto_discovered = var.autoDiscovered
+ self.notify.data_var_removed(self.view, DataVariable(address, var_type, auto_discovered))
+ except:
+ log_error(traceback.format_exc())
+
+ def _data_var_updated(self, ctxt, view, var):
+ try:
+ address = var.address
+ var_type = Type(core.BNNewTypeReference(var.type))
+ auto_discovered = var.autoDiscovered
+ self.notify.data_var_updated(self.view, DataVariable(address, var_type, auto_discovered))
+ except:
+ log_error(traceback.format_exc())
+
def _string_found(self, ctxt, view, string_type, offset, length):
try:
self.notify.string_found(self.view, core.BNStringType_names[string_type], offset, length)