diff options
| author | Xusheng <xusheng@vector35.com> | 2020-11-16 17:51:46 +0800 |
|---|---|---|
| committer | Xusheng <xusheng@vector35.com> | 2021-02-17 12:05:47 +0800 |
| commit | d9b1df165f9daad6a5229718ecd0ee50a5ef6bf1 (patch) | |
| tree | 6307b8c16c80f8203bdb96ebc3d54a8d9f10b3bf /binaryview.cpp | |
| parent | b651141704a555cf0b6c53152ab0f70d011ec8af (diff) | |
add support for type xref and variable xref
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; |
