summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2019-03-03 22:29:03 -0500
committerPeter LaFosse <peter@vector35.com>2019-03-06 23:37:47 -0500
commitff682853049753d233ecebbcca0d4bf9a6f1eff0 (patch)
tree584742cfae8b7f89729f614d7f3c81129f6b83f4
parent6564ca9461ed83e2548dcde270fc3dc884486bd6 (diff)
Add get_data_refs_from API
-rw-r--r--binaryninjaapi.h2
-rw-r--r--binaryninjacore.h2
-rw-r--r--binaryview.cpp20
-rw-r--r--python/binaryview.py41
4 files changed, 65 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 33b0c24a..6226d329 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -1367,6 +1367,8 @@ namespace BinaryNinja
std::vector<ReferenceSource> GetCodeReferences(uint64_t addr, uint64_t len);
std::vector<uint64_t> GetDataReferences(uint64_t addr);
std::vector<uint64_t> GetDataReferences(uint64_t addr, uint64_t len);
+ std::vector<uint64_t> GetDataReferencesFrom(uint64_t addr);
+ std::vector<uint64_t> GetDataReferencesFrom(uint64_t addr, uint64_t len);
Ref<Symbol> GetSymbolByAddress(uint64_t addr, const NameSpace& nameSpace=NameSpace());
Ref<Symbol> GetSymbolByRawName(const std::string& name, const NameSpace& nameSpace=NameSpace());
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 4e0c0af5..7c8ea970 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -2656,6 +2656,8 @@ extern "C"
BINARYNINJACOREAPI void BNFreeCodeReferences(BNReferenceSource* refs, size_t count);
BINARYNINJACOREAPI uint64_t* BNGetDataReferences(BNBinaryView* view, uint64_t addr, size_t* count);
BINARYNINJACOREAPI uint64_t* BNGetDataReferencesInRange(BNBinaryView* view, uint64_t addr, uint64_t len, size_t* count);
+ BINARYNINJACOREAPI uint64_t* BNGetDataReferencesFrom(BNBinaryView* view, uint64_t addr, size_t* count);
+ BINARYNINJACOREAPI uint64_t* BNGetDataReferencesFromInRange(BNBinaryView* view, uint64_t addr, uint64_t len, size_t* count);
BINARYNINJACOREAPI void BNFreeDataReferences(uint64_t* refs);
BINARYNINJACOREAPI void BNRegisterGlobalFunctionRecognizer(BNFunctionRecognizer* rec);
diff --git a/binaryview.cpp b/binaryview.cpp
index 8479c7d0..690ccee1 100644
--- a/binaryview.cpp
+++ b/binaryview.cpp
@@ -1435,6 +1435,26 @@ vector<uint64_t> BinaryView::GetDataReferences(uint64_t addr, uint64_t len)
}
+vector<uint64_t> BinaryView::GetDataReferencesFrom(uint64_t addr)
+{
+ size_t count;
+ uint64_t* refs = BNGetDataReferencesFrom(m_object, addr, &count);
+ vector<uint64_t> result(refs, &refs[count]);
+ BNFreeDataReferences(refs);
+ return result;
+}
+
+
+vector<uint64_t> BinaryView::GetDataReferencesFrom(uint64_t addr, uint64_t len)
+{
+ size_t count;
+ uint64_t* refs = BNGetDataReferencesFromInRange(m_object, addr, len, &count);
+ vector<uint64_t> result(refs, &refs[count]);
+ BNFreeDataReferences(refs);
+ return result;
+}
+
+
Ref<Symbol> BinaryView::GetSymbolByAddress(uint64_t addr, const NameSpace& nameSpace)
{
BNNameSpace ns = nameSpace.GetAPIObject();
diff --git a/python/binaryview.py b/python/binaryview.py
index b316f24b..02dfeb4a 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -2492,6 +2492,20 @@ class BinaryView(object):
return result
def get_data_refs(self, addr, length=None):
+ """
+ ``get_data_refs`` returns a list of virtual addresses of data which references ``addr``. Optionally specifying
+ a length. When ``length`` is set ``get_data_refs`` returns the data which references in the range ``addr``-``addr``+``length``.
+
+ :param int addr: virtual address to query for references
+ :param int length: optional length of query
+ :return: list of integers
+ :rtype: list(integer)
+ :Example:
+
+ >>> bv.get_data_refs(here)
+ [4203812]
+ >>>
+ """
count = ctypes.c_ulonglong(0)
if length is None:
refs = core.BNGetDataReferences(self.handle, addr, count)
@@ -2504,6 +2518,33 @@ class BinaryView(object):
core.BNFreeDataReferences(refs, count.value)
return result
+ def get_data_refs_from(self, addr, length=None):
+ """
+ ``get_data_refs_from`` returns a list of virtual addresses referenced by the address ``addr``. Optionally specifying
+ a length. When ``length`` is set ``get_data_refs_from`` returns the data referenced in the range ``addr``-``addr``+``length``.
+
+ :param int addr: virtual address to query for references
+ :param int length: optional length of query
+ :return: list of integers
+ :rtype: list(integer)
+ :Example:
+
+ >>> bv.get_data_refs_from(here)
+ [4200327]
+ >>>
+ """
+ count = ctypes.c_ulonglong(0)
+ if length is None:
+ refs = core.BNGetDataReferencesFrom(self.handle, addr, count)
+ else:
+ refs = core.BNGetDataReferencesFromInRange(self.handle, addr, length, count)
+
+ result = []
+ for i in range(0, count.value):
+ result.append(refs[i])
+ core.BNFreeDataReferences(refs, count.value)
+ return result
+
def get_symbol_at(self, addr, namespace=None):
"""