From 3cc05db3e42d402cb03fe3fb8ca582e3ded882f7 Mon Sep 17 00:00:00 2001 From: Peter LaFosse Date: Tue, 23 Oct 2018 22:29:15 -0400 Subject: Add new APIs for querying data references --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 3 +++ binaryview.cpp | 20 ++++++++++++++++++++ python/binaryview.py | 14 ++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 958697c7..1fdb74d2 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -1357,6 +1357,8 @@ namespace BinaryNinja std::vector GetCodeReferences(uint64_t addr); std::vector GetCodeReferences(uint64_t addr, uint64_t len); + std::vector GetDataReferences(uint64_t addr); + std::vector GetDataReferences(uint64_t addr, uint64_t len); Ref GetSymbolByAddress(uint64_t addr, const NameSpace& nameSpace=NameSpace()); Ref GetSymbolByRawName(const std::string& name, const NameSpace& nameSpace=NameSpace()); diff --git a/binaryninjacore.h b/binaryninjacore.h index 161a23af..4e736e38 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2596,6 +2596,9 @@ extern "C" BINARYNINJACOREAPI BNReferenceSource* BNGetCodeReferencesInRange(BNBinaryView* view, uint64_t addr, uint64_t len, size_t* count); 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 void BNFreeDataReferences(uint64_t* refs); BINARYNINJACOREAPI void BNRegisterGlobalFunctionRecognizer(BNFunctionRecognizer* rec); diff --git a/binaryview.cpp b/binaryview.cpp index 4447494e..1302b0cb 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1415,6 +1415,26 @@ vector BinaryView::GetCodeReferences(uint64_t addr, uint64_t le } +vector BinaryView::GetDataReferences(uint64_t addr) +{ + size_t count; + uint64_t* refs = BNGetDataReferences(m_object, addr, &count); + vector result(refs, &refs[count]); + BNFreeDataReferences(refs); + return result; +} + + +vector BinaryView::GetDataReferences(uint64_t addr, uint64_t len) +{ + size_t count; + uint64_t* refs = BNGetDataReferencesInRange(m_object, addr, len, &count); + vector result(refs, &refs[count]); + BNFreeDataReferences(refs); + return result; +} + + Ref BinaryView::GetSymbolByAddress(uint64_t addr, const NameSpace& nameSpace) { BNNameSpace ns = nameSpace.GetAPIObject(); diff --git a/python/binaryview.py b/python/binaryview.py index fe7a9dc9..958318f7 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -2476,6 +2476,20 @@ class BinaryView(object): core.BNFreeCodeReferences(refs, count.value) return result + def get_data_refs(self, addr, length=None): + count = ctypes.c_ulonglong(0) + if length is None: + refs = core.BNGetDataReferences(self.handle, addr, count) + else: + refs = core.BNGetDataReferencesInRange(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): """ ``get_symbol_at`` returns the Symbol at the provided virtual address. -- cgit v1.3.1