summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXusheng <xusheng@vector35.com>2022-08-16 15:58:34 +0800
committerXusheng <xusheng@vector35.com>2022-08-16 16:00:35 +0800
commit7fa85d4571cfd736b9c7164e8c830b3d585a1550 (patch)
tree105b148394f7f2b5e80b4a38b9e4685f1f4adced
parent77078fa55a35a931f6df1cd2bd1d96f90aab39c9 (diff)
Add several missing API functions in LowLevelILFunction. Close https://github.com/Vector35/binaryninja-api/issues/3397
-rw-r--r--binaryninjaapi.h8
-rw-r--r--lowlevelil.cpp126
2 files changed, 134 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 522024e7..bffc678e 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -7103,6 +7103,14 @@ namespace BinaryNinja {
void ClearIndirectBranches();
void SetIndirectBranches(const std::vector<ArchAndAddr>& branches);
+ std::vector<uint32_t> GetRegisters();
+ std::vector<uint32_t> GetRegisterStacks();
+ std::vector<uint32_t> GetFlags();
+
+ std::vector<SSARegister> GetSSARegisters();
+ std::vector<SSARegisterStack> GetRegisterStackSSAVersions();
+ std::vector<SSAFlag> GetFlagSSAVersions();
+
ExprId AddExpr(BNLowLevelILOperation operation, size_t size, uint32_t flags, ExprId a = 0, ExprId b = 0,
ExprId c = 0, ExprId d = 0);
ExprId AddExprWithLocation(BNLowLevelILOperation operation, uint64_t addr, uint32_t sourceOperand, size_t size,
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)
{