From d9b1df165f9daad6a5229718ecd0ee50a5ef6bf1 Mon Sep 17 00:00:00 2001 From: Xusheng Date: Mon, 16 Nov 2020 17:51:46 +0800 Subject: add support for type xref and variable xref --- binaryview.cpp | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) (limited to 'binaryview.cpp') diff --git a/binaryview.cpp b/binaryview.cpp index d6417352..86878f8c 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1683,6 +1683,21 @@ vector> BinaryView::GetAnalysisFunctionsForAddress(uint64_t addr) } +vector> BinaryView::GetAnalysisFunctionsContainingAddress(uint64_t addr) +{ + size_t count; + BNFunction** list = BNGetAnalysisFunctionsContainingAddress(m_object, addr, &count); + + vector> result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + result.push_back(new Function(BNNewFunctionReference(list[i]))); + + BNFreeFunctionList(list, count); + return result; +} + + Ref BinaryView::GetAnalysisEntryPoint() { BNFunction* func = BNGetAnalysisEntryPoint(m_object); @@ -1847,6 +1862,213 @@ void BinaryView::RemoveUserDataReference(uint64_t fromAddr, uint64_t toAddr) } +vector BinaryView::GetCodeReferencesForType(const QualifiedName& type) +{ + size_t count; + + BNQualifiedName nameObj = type.GetAPIObject(); + BNReferenceSource* refs = BNGetCodeReferencesForType(m_object, &nameObj, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ReferenceSource src; + src.func = new Function(BNNewFunctionReference(refs[i].func)); + src.arch = new CoreArchitecture(refs[i].arch); + src.addr = refs[i].addr; + result.push_back(src); + } + + BNFreeCodeReferences(refs, count); + return result; +} + + +vector BinaryView::GetDataReferencesForType(const QualifiedName& type) +{ + size_t count; + BNQualifiedName nameObj = type.GetAPIObject(); + uint64_t* refs = BNGetDataReferencesForType(m_object, &nameObj, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector result(refs, &refs[count]); + BNFreeDataReferences(refs); + return result; +} + + +vector BinaryView::GetTypeReferencesForType(const QualifiedName& type) +{ + size_t count; + + BNQualifiedName nameObj = type.GetAPIObject(); + BNTypeReferenceSource* refs = BNGetTypeReferencesForType(m_object, &nameObj, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + TypeReferenceSource src; + src.name = QualifiedName::FromAPIObject(&refs[i].name); + src.offset = refs[i].offset; + src.type = refs[i].type; + result.push_back(src); + } + + BNFreeTypeReferences(refs, count); + return result; +} + + +vector BinaryView::GetCodeReferencesForTypeField(const QualifiedName& type, uint64_t offset) +{ + size_t count; + BNQualifiedName nameObj = type.GetAPIObject(); + BNReferenceSource* refs = BNGetCodeReferencesForTypeField(m_object, &nameObj, offset, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ReferenceSource src; + src.func = new Function(BNNewFunctionReference(refs[i].func)); + src.arch = new CoreArchitecture(refs[i].arch); + src.addr = refs[i].addr; + result.push_back(src); + } + + BNFreeCodeReferences(refs, count); + return result; +} + + +vector BinaryView::GetDataReferencesForTypeField(const QualifiedName& type, uint64_t offset) +{ + size_t count; + BNQualifiedName nameObj = type.GetAPIObject(); + uint64_t* refs = BNGetDataReferencesForTypeField(m_object, &nameObj, offset, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector result(refs, &refs[count]); + BNFreeDataReferences(refs); + return result; +} + + +vector BinaryView::GetTypeReferencesForTypeField(const QualifiedName& type, uint64_t offset) +{ + size_t count; + BNQualifiedName nameObj = type.GetAPIObject(); + BNTypeReferenceSource* refs = BNGetTypeReferencesForTypeField(m_object, &nameObj, offset, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + TypeReferenceSource src; + src.name = QualifiedName::FromAPIObject(&refs[i].name); + src.offset = refs[i].offset; + src.type = refs[i].type; + result.push_back(src); + } + + BNFreeTypeReferences(refs, count); + return result; +} + + +vector BinaryView::GetCodeReferencesForTypeFrom(ReferenceSource src) +{ + size_t count; + BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr }; + BNTypeReferenceSource* refs = BNGetCodeReferencesForTypeFrom(m_object, &_src, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + TypeReferenceSource src; + src.name = QualifiedName::FromAPIObject(&refs[i].name); + src.offset = refs[i].offset; + src.type = refs[i].type; + result.push_back(src); + } + + BNFreeTypeReferences(refs, count); + return result; +} + + +vector BinaryView::GetCodeReferencesForTypeFrom(ReferenceSource src, uint64_t len) +{ + size_t count; + BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr }; + BNTypeReferenceSource* refs = BNGetCodeReferencesForTypeFromInRange(m_object, &_src, len, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + TypeReferenceSource src; + src.name = QualifiedName::FromAPIObject(&refs[i].name); + src.offset = refs[i].offset; + src.type = refs[i].type; + result.push_back(src); + } + + BNFreeTypeReferences(refs, count); + return result; +} + +vector BinaryView::GetCodeReferencesForTypeFieldFrom(ReferenceSource src) +{ + size_t count; + BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr }; + BNTypeReferenceSource* refs = BNGetCodeReferencesForTypeFieldsFrom(m_object, &_src, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + TypeReferenceSource src; + src.name = QualifiedName::FromAPIObject(&refs[i].name); + src.offset = refs[i].offset; + src.type = refs[i].type; + result.push_back(src); + } + + BNFreeTypeReferences(refs, count); + return result; +} + + +vector BinaryView::GetCodeReferencesForTypeFieldFrom(ReferenceSource src, uint64_t len) +{ + size_t count; + BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr }; + BNTypeReferenceSource* refs = BNGetCodeReferencesForTypeFieldsFromInRange(m_object, &_src, len, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + TypeReferenceSource src; + src.name = QualifiedName::FromAPIObject(&refs[i].name); + src.offset = refs[i].offset; + src.type = refs[i].type; + result.push_back(src); + } + + BNFreeTypeReferences(refs, count); + return result; +} + + vector BinaryView::GetCallees(ReferenceSource callSite) { size_t count; -- cgit v1.3.1