From 42392a91e81b592a65b851bde1d7b236e199cbf9 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Wed, 6 Mar 2019 23:37:26 -0500 Subject: Add ability to query cross references directly on data variables --- python/binaryview.py | 31 +++++++++++++++++++++++++------ python/types.py | 3 +++ 2 files changed, 28 insertions(+), 6 deletions(-) (limited to 'python') diff --git a/python/binaryview.py b/python/binaryview.py index 02dfeb4a..6b373c27 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -203,10 +203,29 @@ class AnalysisProgress(object): class DataVariable(object): - def __init__(self, addr, var_type, auto_discovered): + def __init__(self, addr, var_type, auto_discovered, view=None): self.address = addr self.type = var_type self.auto_discovered = auto_discovered + self.view = view + + @property + def data_refs_from(self): + """data cross references from this data variable (read-only)""" + return self.view.get_data_refs_from(self.address, len(self.type)) + + @property + def data_refs(self): + """data cross references to this data variable (read-only)""" + return self.view.get_data_refs(self.address, len(self.type)) + + @property + def code_refs(self): + """code references to this data variable (read-only)""" + return self.view.get_code_refs(self.address, len(self.type)) + + def __len__(self): + return len(self.type) def __repr__(self): return "" % (self.address, str(self.type)) @@ -286,7 +305,7 @@ class BinaryDataNotificationCallbacks(object): address = var[0].address var_type = types.Type(core.BNNewTypeReference(var[0].type), platform = self.view.platform, confidence = var[0].typeConfidence) auto_discovered = var[0].autoDiscovered - self.notify.data_var_added(self.view, DataVariable(address, var_type, auto_discovered)) + self.notify.data_var_added(self.view, DataVariable(address, var_type, auto_discovered, view)) except: log.log_error(traceback.format_exc()) @@ -295,7 +314,7 @@ class BinaryDataNotificationCallbacks(object): address = var[0].address var_type = types.Type(core.BNNewTypeReference(var[0].type), platform = self.view.platform, confidence = var[0].typeConfidence) auto_discovered = var[0].autoDiscovered - self.notify.data_var_removed(self.view, DataVariable(address, var_type, auto_discovered)) + self.notify.data_var_removed(self.view, DataVariable(address, var_type, auto_discovered, view)) except: log.log_error(traceback.format_exc()) @@ -304,7 +323,7 @@ class BinaryDataNotificationCallbacks(object): address = var[0].address var_type = types.Type(core.BNNewTypeReference(var[0].type), platform = self.view.platform, confidence = var[0].typeConfidence) auto_discovered = var[0].autoDiscovered - self.notify.data_var_updated(self.view, DataVariable(address, var_type, auto_discovered)) + self.notify.data_var_updated(self.view, DataVariable(address, var_type, auto_discovered, view)) except: log.log_error(traceback.format_exc()) @@ -1161,7 +1180,7 @@ class BinaryView(object): addr = var_list[i].address var_type = types.Type(core.BNNewTypeReference(var_list[i].type), platform = self.platform, confidence = var_list[i].typeConfidence) auto_discovered = var_list[i].autoDiscovered - result[addr] = DataVariable(addr, var_type, auto_discovered) + result[addr] = DataVariable(addr, var_type, auto_discovered, self) core.BNFreeDataVariables(var_list, count.value) return result @@ -2353,7 +2372,7 @@ class BinaryView(object): var = core.BNDataVariable() if not core.BNGetDataVariableAtAddress(self.handle, addr, var): return None - return DataVariable(var.address, types.Type(var.type, platform = self.platform, confidence = var.typeConfidence), var.autoDiscovered) + return DataVariable(var.address, types.Type(var.type, platform = self.platform, confidence = var.typeConfidence), var.autoDiscovered, self) def get_functions_containing(self, addr): """ diff --git a/python/types.py b/python/types.py index 19714d54..f1c032b3 100644 --- a/python/types.py +++ b/python/types.py @@ -421,6 +421,9 @@ class Type(object): result = core.BNGetTypeStackAdjustment(self.handle) return SizeWithConfidence(result.value, confidence = result.confidence) + def __len__(self): + return self.width + def __str__(self): platform = None if self.platform is not None: -- cgit v1.3.1