diff options
Diffstat (limited to 'binaryview.cpp')
| -rw-r--r-- | binaryview.cpp | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/binaryview.cpp b/binaryview.cpp index d6417352..86878f8c 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1683,6 +1683,21 @@ vector<Ref<Function>> BinaryView::GetAnalysisFunctionsForAddress(uint64_t addr) } +vector<Ref<Function>> BinaryView::GetAnalysisFunctionsContainingAddress(uint64_t addr) +{ + size_t count; + BNFunction** list = BNGetAnalysisFunctionsContainingAddress(m_object, addr, &count); + + vector<Ref<Function>> 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<Function> BinaryView::GetAnalysisEntryPoint() { BNFunction* func = BNGetAnalysisEntryPoint(m_object); @@ -1847,6 +1862,213 @@ void BinaryView::RemoveUserDataReference(uint64_t fromAddr, uint64_t toAddr) } +vector<ReferenceSource> BinaryView::GetCodeReferencesForType(const QualifiedName& type) +{ + size_t count; + + BNQualifiedName nameObj = type.GetAPIObject(); + BNReferenceSource* refs = BNGetCodeReferencesForType(m_object, &nameObj, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector<ReferenceSource> 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<uint64_t> BinaryView::GetDataReferencesForType(const QualifiedName& type) +{ + size_t count; + BNQualifiedName nameObj = type.GetAPIObject(); + uint64_t* refs = BNGetDataReferencesForType(m_object, &nameObj, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector<uint64_t> result(refs, &refs[count]); + BNFreeDataReferences(refs); + return result; +} + + +vector<TypeReferenceSource> BinaryView::GetTypeReferencesForType(const QualifiedName& type) +{ + size_t count; + + BNQualifiedName nameObj = type.GetAPIObject(); + BNTypeReferenceSource* refs = BNGetTypeReferencesForType(m_object, &nameObj, &count); + QualifiedName::FreeAPIObject(&nameObj); + + vector<TypeReferenceSource> 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<ReferenceSource> 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<ReferenceSource> 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<uint64_t> 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<uint64_t> result(refs, &refs[count]); + BNFreeDataReferences(refs); + return result; +} + + +vector<TypeReferenceSource> 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<TypeReferenceSource> 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<TypeReferenceSource> 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<TypeReferenceSource> 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<TypeReferenceSource> 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<TypeReferenceSource> 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<TypeReferenceSource> 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<TypeReferenceSource> 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<TypeReferenceSource> 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<TypeReferenceSource> 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<uint64_t> BinaryView::GetCallees(ReferenceSource callSite) { size_t count; |
