summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2019-03-06 23:37:26 -0500
committerPeter LaFosse <peter@vector35.com>2019-03-06 23:37:47 -0500
commit42392a91e81b592a65b851bde1d7b236e199cbf9 (patch)
treeff45a0e6f642ceb4fbac8b554ab8a818b2d12714 /python
parentff682853049753d233ecebbcca0d4bf9a6f1eff0 (diff)
Add ability to query cross references directly on data variables
Diffstat (limited to 'python')
-rw-r--r--python/binaryview.py31
-rw-r--r--python/types.py3
2 files changed, 28 insertions, 6 deletions
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 "<var 0x%x: %s>" % (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: