From 9bb1a15b800da0ac5b60c40e3b10321e4efc5a1b Mon Sep 17 00:00:00 2001 From: rollsafe Date: Tue, 30 Jul 2019 21:48:38 -0400 Subject: Cache function callee addresses and create an API to access them --- binaryview.cpp | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) (limited to 'binaryview.cpp') diff --git a/binaryview.cpp b/binaryview.cpp index 7806c656..fd93b340 100644 --- a/binaryview.cpp +++ b/binaryview.cpp @@ -1513,7 +1513,7 @@ vector BinaryView::GetCodeReferencesFrom(ReferenceSource src) BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr }; uint64_t* refs = BNGetCodeReferencesFrom(m_object, &_src, &count); vector result(refs, &refs[count]); - BNFreeCodeReferencesFrom(refs); + BNFreeAddressList(refs); return result; } @@ -1524,7 +1524,7 @@ vector BinaryView::GetCodeReferencesFrom(ReferenceSource src, uint64_t BNReferenceSource _src{ src.func->m_object, src.arch->m_object, src.addr }; uint64_t* refs = BNGetCodeReferencesFromInRange(m_object, &_src, len, &count); vector result(refs, &refs[count]); - BNFreeCodeReferencesFrom(refs); + BNFreeAddressList(refs); return result; } @@ -1581,6 +1581,38 @@ void BinaryView::RemoveUserDataReference(uint64_t fromAddr, uint64_t toAddr) } +vector BinaryView::GetCallees(ReferenceSource callSite) +{ + size_t count; + BNReferenceSource src { callSite.func->m_object, callSite.arch->m_object, callSite.addr }; + uint64_t* refs = BNGetCallees(m_object, &src, &count); + vector result(refs, &refs[count]); + BNFreeAddressList(refs); + return result; +} + + +vector BinaryView::GetCallers(uint64_t addr) +{ + size_t count; + BNReferenceSource* refs = BNGetCallers(m_object, addr, &count); + + 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; +} + + Ref BinaryView::GetSymbolByAddress(uint64_t addr, const NameSpace& nameSpace) { BNNameSpace ns = nameSpace.GetAPIObject(); -- cgit v1.3.1