From 12659a7e2227a2277b0ca62f7866921a70f7ea4d Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 20 Jan 2022 18:02:35 -0500 Subject: Async IL fetching in stack, variables, and xref views --- function.cpp | 290 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) (limited to 'function.cpp') diff --git a/function.cpp b/function.cpp index a7e4c154..5b1d2ba4 100644 --- a/function.cpp +++ b/function.cpp @@ -1260,6 +1260,126 @@ set Function::GetHighLevelILSSAVariables() } +set Function::GetMediumLevelILVariablesIfAvailable() +{ + Ref mlil = this->GetMediumLevelILIfAvailable(); + if (!mlil) + return {}; + + size_t count; + BNVariable* vars = BNGetMediumLevelILVariables(mlil->GetObject(), &count); + + set result; + for (size_t i = 0; i < count; ++i) + result.emplace(vars[i]); + + BNFreeVariableList(vars); + return result; +} + + +set Function::GetMediumLevelILAliasedVariablesIfAvailable() +{ + Ref mlil = this->GetMediumLevelILIfAvailable(); + if (!mlil) + return {}; + + size_t count; + BNVariable* vars = BNGetMediumLevelILAliasedVariables(mlil->GetObject(), &count); + + set result; + for (size_t i = 0; i < count; ++i) + result.emplace(vars[i]); + + BNFreeVariableList(vars); + return result; +} + + +set Function::GetMediumLevelILSSAVariablesIfAvailable() +{ + Ref mlil = this->GetMediumLevelILIfAvailable(); + if (!mlil) + return {}; + + size_t count; + BNVariable* vars = BNGetMediumLevelILVariables(mlil->GetObject(), &count); + + set result; + for (size_t i = 0; i < count; ++i) + { + size_t versionCount; + size_t* versions = BNGetMediumLevelILVariableSSAVersions(mlil->GetObject(), &vars[i], &versionCount); + for (size_t j = 0; j < versionCount; ++j) + result.emplace(vars[i], versions[j]); + BNFreeILInstructionList(versions); + } + + BNFreeVariableList(vars); + return result; +} + + +set Function::GetHighLevelILVariablesIfAvailable() +{ + Ref hlil = this->GetHighLevelILIfAvailable(); + if (!hlil) + return {}; + + size_t count; + BNVariable* vars = BNGetHighLevelILVariables(hlil->GetObject(), &count); + + set result; + for (size_t i = 0; i < count; ++i) + result.emplace(vars[i]); + + BNFreeVariableList(vars); + return result; +} + + +set Function::GetHighLevelILAliasedVariablesIfAvailable() +{ + Ref hlil = this->GetHighLevelILIfAvailable(); + if (!hlil) + return {}; + + size_t count; + BNVariable* vars = BNGetHighLevelILAliasedVariables(hlil->GetObject(), &count); + + set result; + for (size_t i = 0; i < count; ++i) + result.emplace(vars[i]); + + BNFreeVariableList(vars); + return result; +} + + +set Function::GetHighLevelILSSAVariablesIfAvailable() +{ + Ref hlil = this->GetHighLevelILIfAvailable(); + if (!hlil) + return {}; + + size_t count; + BNVariable* vars = BNGetHighLevelILVariables(hlil->GetObject(), &count); + + set result; + for (size_t i = 0; i < count; ++i) + { + size_t versionCount; + size_t* versions = BNGetHighLevelILVariableSSAVersions(hlil->GetObject(), &vars[i], &versionCount); + for (size_t j = 0; j < versionCount; ++j) + result.emplace(vars[i], versions[j]); + BNFreeILInstructionList(versions); + } + + BNFreeVariableList(vars); + return result; +} + + void Function::CreateAutoVariable(const Variable& var, const Confidence>& type, const string& name, bool ignoreDisjointUses) { @@ -2484,6 +2604,176 @@ vector Function::GetHighLevelILVariableReferencesInRang } +vector Function::GetMediumLevelILVariableReferencesIfAvailable(const Variable& var) +{ + size_t count; + + BNVariable varData; + varData.type = var.type; + varData.index = var.index; + varData.storage = var.storage; + + BNILReferenceSource* refs = BNGetMediumLevelILVariableReferencesIfAvailable(m_object, &varData, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ILReferenceSource src; + src.func = new Function(BNNewFunctionReference(refs[i].func)); + src.arch = new CoreArchitecture(refs[i].arch); + src.addr = refs[i].addr; + src.type = refs[i].type; + src.exprId = refs[i].exprId; + result.push_back(src); + } + + BNFreeILReferences(refs, count); + return result; +} + + +vector Function::GetMediumLevelILVariableReferencesFromIfAvailable(Architecture* arch, uint64_t addr) +{ + size_t count; + BNVariableReferenceSource* refs = BNGetMediumLevelILVariableReferencesFromIfAvailable(m_object, arch->GetObject(), addr, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + VariableReferenceSource src; + src.var.index = refs[i].var.index; + src.var.storage = refs[i].var.storage; + src.var.type = refs[i].var.type; + + src.source.func = new Function(BNNewFunctionReference(refs[i].source.func)); + src.source.arch = new CoreArchitecture(refs[i].source.arch); + src.source.addr = refs[i].source.addr; + src.source.type = refs[i].source.type; + src.source.exprId = refs[i].source.exprId; + + result.push_back(src); + } + + BNFreeVariableReferenceSourceList(refs, count); + return result; +} + + +vector Function::GetMediumLevelILVariableReferencesInRangeIfAvailable(Architecture* arch, uint64_t addr, uint64_t len) +{ + size_t count; + BNVariableReferenceSource* refs = BNGetMediumLevelILVariableReferencesInRangeIfAvailable(m_object, arch->GetObject(), addr, len, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + VariableReferenceSource src; + src.var.index = refs[i].var.index; + src.var.storage = refs[i].var.storage; + src.var.type = refs[i].var.type; + + src.source.func = new Function(BNNewFunctionReference(refs[i].source.func)); + src.source.arch = new CoreArchitecture(refs[i].source.arch); + src.source.addr = refs[i].source.addr; + src.source.type = refs[i].source.type; + src.source.exprId = refs[i].source.exprId; + + result.push_back(src); + } + + BNFreeVariableReferenceSourceList(refs, count); + return result; +} + + +vector Function::GetHighLevelILVariableReferencesIfAvailable(const Variable& var) +{ + size_t count; + + BNVariable varData; + varData.type = var.type; + varData.index = var.index; + varData.storage = var.storage; + + BNILReferenceSource* refs = BNGetHighLevelILVariableReferencesIfAvailable(m_object, &varData, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + ILReferenceSource src; + src.func = new Function(BNNewFunctionReference(refs[i].func)); + src.arch = new CoreArchitecture(refs[i].arch); + src.addr = refs[i].addr; + src.type = refs[i].type; + src.exprId = refs[i].exprId; + result.push_back(src); + } + + BNFreeILReferences(refs, count); + return result; +} + + +vector Function::GetHighLevelILVariableReferencesFromIfAvailable(Architecture* arch, uint64_t addr) +{ + size_t count; + BNVariableReferenceSource* refs = BNGetHighLevelILVariableReferencesFromIfAvailable(m_object, arch->GetObject(), addr, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + VariableReferenceSource src; + src.var.index = refs[i].var.index; + src.var.storage = refs[i].var.storage; + src.var.type = refs[i].var.type; + + src.source.func = new Function(BNNewFunctionReference(refs[i].source.func)); + src.source.arch = new CoreArchitecture(refs[i].source.arch); + src.source.addr = refs[i].source.addr; + src.source.type = refs[i].source.type; + src.source.exprId = refs[i].source.exprId; + + result.push_back(src); + } + + BNFreeVariableReferenceSourceList(refs, count); + return result; +} + + +vector Function::GetHighLevelILVariableReferencesInRangeIfAvailable(Architecture* arch, uint64_t addr, uint64_t len) +{ + size_t count; + BNVariableReferenceSource* refs = BNGetHighLevelILVariableReferencesInRangeIfAvailable(m_object, arch->GetObject(), addr, len, &count); + + vector result; + result.reserve(count); + for (size_t i = 0; i < count; i++) + { + VariableReferenceSource src; + src.var.index = refs[i].var.index; + src.var.storage = refs[i].var.storage; + src.var.type = refs[i].var.type; + + src.source.func = new Function(BNNewFunctionReference(refs[i].source.func)); + src.source.arch = new CoreArchitecture(refs[i].source.arch); + src.source.addr = refs[i].source.addr; + src.source.type = refs[i].source.type; + src.source.exprId = refs[i].source.exprId; + + result.push_back(src); + } + + BNFreeVariableReferenceSourceList(refs, count); + return result; +} + + uint64_t Function::GetHighestAddress() { return BNGetFunctionHighestAddress(m_object); -- cgit v1.3.1