diff options
| author | Xusheng <xusheng@vector35.com> | 2022-08-16 15:58:34 +0800 |
|---|---|---|
| committer | Xusheng <xusheng@vector35.com> | 2022-08-16 16:00:35 +0800 |
| commit | 7fa85d4571cfd736b9c7164e8c830b3d585a1550 (patch) | |
| tree | 105b148394f7f2b5e80b4a38b9e4685f1f4adced /lowlevelil.cpp | |
| parent | 77078fa55a35a931f6df1cd2bd1d96f90aab39c9 (diff) | |
Add several missing API functions in LowLevelILFunction. Close https://github.com/Vector35/binaryninja-api/issues/3397
Diffstat (limited to 'lowlevelil.cpp')
| -rw-r--r-- | lowlevelil.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
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<ArchAndAddr>& branches } +std::vector<uint32_t> LowLevelILFunction::GetRegisters() +{ + std::vector<uint32_t> 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<uint32_t> LowLevelILFunction::GetRegisterStacks() +{ + std::vector<uint32_t> 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<uint32_t> LowLevelILFunction::GetFlags() +{ + std::vector<uint32_t> 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<SSARegister> LowLevelILFunction::GetSSARegisters() +{ + std::vector<SSARegister> 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<SSARegisterStack> LowLevelILFunction::GetRegisterStackSSAVersions() +{ + std::vector<SSARegisterStack> 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<SSAFlag> LowLevelILFunction::GetFlagSSAVersions() +{ + std::vector<SSAFlag> 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) { |
