diff options
| author | Peter LaFosse <peter@vector35.com> | 2019-03-03 22:29:03 -0500 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2019-03-06 23:37:47 -0500 |
| commit | ff682853049753d233ecebbcca0d4bf9a6f1eff0 (patch) | |
| tree | 584742cfae8b7f89729f614d7f3c81129f6b83f4 | |
| parent | 6564ca9461ed83e2548dcde270fc3dc884486bd6 (diff) | |
Add get_data_refs_from API
| -rw-r--r-- | binaryninjaapi.h | 2 | ||||
| -rw-r--r-- | binaryninjacore.h | 2 | ||||
| -rw-r--r-- | binaryview.cpp | 20 | ||||
| -rw-r--r-- | python/binaryview.py | 41 |
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): """ |
