From 7fa85d4571cfd736b9c7164e8c830b3d585a1550 Mon Sep 17 00:00:00 2001 From: Xusheng Date: Tue, 16 Aug 2022 15:58:34 +0800 Subject: Add several missing API functions in LowLevelILFunction. Close https://github.com/Vector35/binaryninja-api/issues/3397 --- lowlevelil.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) (limited to 'lowlevelil.cpp') diff --git a/lowlevelil.cpp b/lowlevelil.cpp index 4e0743b3..9d23d70c 100644 --- a/lowlevelil.cpp +++ b/lowlevelil.cpp @@ -116,6 +116,132 @@ void LowLevelILFunction::SetIndirectBranches(const vector& branches } +std::vector LowLevelILFunction::GetRegisters() +{ + std::vector result; + size_t count; + + uint32_t* regs = BNGetLowLevelRegisters(m_object, &count); + if (regs == nullptr) + return result; + + result.reserve(count); + for (auto i = 0; i < count; i++) + { + result.push_back(regs[i]); + } + BNFreeLLILVariablesList(regs); + + return result; +} + + +std::vector LowLevelILFunction::GetRegisterStacks() +{ + std::vector result; + size_t count; + + uint32_t* regs = BNGetLowLevelRegisterStacks(m_object, &count); + if (regs == nullptr) + return result; + + result.reserve(count); + for (auto i = 0; i < count; i++) + { + result.push_back(regs[i]); + } + BNFreeLLILVariablesList(regs); + + return result; +} + + +std::vector LowLevelILFunction::GetFlags() +{ + std::vector result; + size_t count; + + uint32_t* regs = BNGetLowLevelFlags(m_object, &count); + if (regs == nullptr) + return result; + + result.reserve(count); + for (auto i = 0; i < count; i++) + { + result.push_back(regs[i]); + } + BNFreeLLILVariablesList(regs); + + return result; +} + + +std::vector LowLevelILFunction::GetSSARegisters() +{ + std::vector result; + size_t count; + + auto regs = GetRegisters(); + for (const auto reg: regs) + { + size_t* versions = BNGetLowLevelRegisterSSAVersions(m_object, reg, &count); + if (versions == nullptr) + continue; + + result.reserve(result.size() + count); + for (size_t i = 0; i < count; i++) + result.emplace_back(reg, versions[i]); + + BNFreeLLILVariableVersionList(versions); + } + return result; +} + + +std::vector LowLevelILFunction::GetRegisterStackSSAVersions() +{ + std::vector result; + size_t count; + + auto regs = GetRegisterStacks(); + for (const auto reg: regs) + { + size_t* versions = BNGetLowLevelRegisterStackSSAVersions(m_object, reg, &count); + if (versions == nullptr) + continue; + + result.reserve(result.size() + count); + for (size_t i = 0; i < count; i++) + result.emplace_back(reg, versions[i]); + + BNFreeLLILVariableVersionList(versions); + } + return result; +} + + +std::vector LowLevelILFunction::GetFlagSSAVersions() +{ + std::vector result; + size_t count; + + auto flags = GetFlags(); + for (const auto flag: flags) + { + size_t* versions = BNGetLowLevelFlagSSAVersions(m_object, flag, &count); + if (versions == nullptr) + continue; + + result.reserve(result.size() + count); + for (size_t i = 0; i < count; i++) + result.emplace_back(flag, versions[i]); + + BNFreeLLILVariableVersionList(versions); + } + return result; +} + + ExprId LowLevelILFunction::AddExpr( BNLowLevelILOperation operation, size_t size, uint32_t flags, ExprId a, ExprId b, ExprId c, ExprId d) { -- cgit v1.3.1