From 09f2b5f1254aeaa7dc6b54500a71dfe86f783d84 Mon Sep 17 00:00:00 2001 From: Xusheng Date: Wed, 17 Aug 2022 18:01:47 +0800 Subject: Improve Python/C++ APIs to get registers, register stacks, and flags for LLIL --- lowlevelil.cpp | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 8 deletions(-) (limited to 'lowlevelil.cpp') diff --git a/lowlevelil.cpp b/lowlevelil.cpp index 9d23d70c..6724e9c2 100644 --- a/lowlevelil.cpp +++ b/lowlevelil.cpp @@ -176,13 +176,67 @@ std::vector LowLevelILFunction::GetFlags() } +std::vector LowLevelILFunction::GetSSARegistersWithoutVersions() +{ + std::vector result; + size_t count; + + auto regs = BNGetLowLevelSSARegistersWithoutVersions(m_object, &count); + if (!regs) + return result; + + result.reserve(count); + for (size_t i = 0; i < count; i++) + result.emplace_back(regs[i], 0); + + BNFreeLLILVariablesList(regs); + return result; +} + + +std::vector LowLevelILFunction::GetSSARegisterStacksWithoutVersions() +{ + std::vector result; + size_t count; + + auto regs = BNGetLowLevelSSARegisterStacksWithoutVersions(m_object, &count); + if (!regs) + return result; + + result.reserve(count); + for (size_t i = 0; i < count; i++) + result.emplace_back(regs[i], 0); + + BNFreeLLILVariablesList(regs); + return result; +} + + +std::vector LowLevelILFunction::GetSSAFlagsWithoutVersions() +{ + std::vector result; + size_t count; + + auto regs = BNGetLowLevelSSAFlagsWithoutVersions(m_object, &count); + if (!regs) + return result; + + result.reserve(count); + for (size_t i = 0; i < count; i++) + result.emplace_back(regs[i], 0); + + BNFreeLLILVariablesList(regs); + return result; +} + + std::vector LowLevelILFunction::GetSSARegisters() { std::vector result; size_t count; - auto regs = GetRegisters(); - for (const auto reg: regs) + auto regs = GetSSARegistersWithoutVersions(); + for (const auto& [reg, _]: regs) { size_t* versions = BNGetLowLevelRegisterSSAVersions(m_object, reg, &count); if (versions == nullptr) @@ -198,13 +252,13 @@ std::vector LowLevelILFunction::GetSSARegisters() } -std::vector LowLevelILFunction::GetRegisterStackSSAVersions() +std::vector LowLevelILFunction::GetSSARegisterStacks() { std::vector result; size_t count; - auto regs = GetRegisterStacks(); - for (const auto reg: regs) + auto regs = GetSSARegisterStacksWithoutVersions(); + for (const auto& [reg, _]: regs) { size_t* versions = BNGetLowLevelRegisterStackSSAVersions(m_object, reg, &count); if (versions == nullptr) @@ -220,13 +274,13 @@ std::vector LowLevelILFunction::GetRegisterStackSSAVersions() } -std::vector LowLevelILFunction::GetFlagSSAVersions() +std::vector LowLevelILFunction::GetSSAFlags() { std::vector result; size_t count; - auto flags = GetFlags(); - for (const auto flag: flags) + auto flags = GetSSAFlagsWithoutVersions(); + for (const auto& [flag, _]: flags) { size_t* versions = BNGetLowLevelFlagSSAVersions(m_object, flag, &count); if (versions == nullptr) -- cgit v1.3.1