summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h3
-rw-r--r--binaryninjacore.h3
-rw-r--r--highlevelil.cpp14
-rw-r--r--lowlevelil.cpp14
-rw-r--r--mediumlevelil.cpp14
-rw-r--r--python/highlevelil.py17
-rw-r--r--python/lowlevelil.py17
-rw-r--r--python/mediumlevelil.py17
8 files changed, 99 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 6009aa20..75d83ccc 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -3755,6 +3755,7 @@ __attribute__ ((format (printf, 1, 2)))
Ref<MediumLevelILFunction> GetMappedMediumLevelIL() const;
size_t GetMediumLevelILInstructionIndex(size_t instr) const;
size_t GetMediumLevelILExprIndex(size_t expr) const;
+ std::set<size_t> GetMediumLevelILExprIndexes(size_t expr) const;
size_t GetMappedMediumLevelILInstructionIndex(size_t instr) const;
size_t GetMappedMediumLevelILExprIndex(size_t expr) const;
@@ -4098,6 +4099,7 @@ __attribute__ ((format (printf, 1, 2)))
Ref<LowLevelILFunction> GetLowLevelIL() const;
size_t GetLowLevelILInstructionIndex(size_t instr) const;
size_t GetLowLevelILExprIndex(size_t expr) const;
+ std::set<size_t> GetLowLevelILExprIndexes(size_t expr) const;
Ref<HighLevelILFunction> GetHighLevelIL() const;
size_t GetHighLevelILInstructionIndex(size_t instr) const;
size_t GetHighLevelILExprIndex(size_t expr) const;
@@ -4354,6 +4356,7 @@ __attribute__ ((format (printf, 1, 2)))
Ref<MediumLevelILFunction> GetMediumLevelIL() const;
size_t GetMediumLevelILExprIndex(size_t expr) const;
+ std::set<size_t> GetMediumLevelILExprIndexes(size_t expr) const;
void UpdateInstructionOperand(size_t i, size_t operandIndex, ExprId value);
void ReplaceExpr(size_t expr, size_t newExpr);
diff --git a/binaryninjacore.h b/binaryninjacore.h
index c03406df..b64427ed 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -3826,6 +3826,7 @@ __attribute__ ((format (printf, 1, 2)))
BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetMappedMediumLevelIL(BNLowLevelILFunction* func);
BINARYNINJACOREAPI size_t BNGetMediumLevelILInstructionIndex(BNLowLevelILFunction* func, size_t instr);
BINARYNINJACOREAPI size_t BNGetMediumLevelILExprIndex(BNLowLevelILFunction* func, size_t expr);
+ BINARYNINJACOREAPI size_t* BNGetMediumLevelILExprIndexes(BNLowLevelILFunction* func, size_t expr, size_t* count);
BINARYNINJACOREAPI size_t BNGetMappedMediumLevelILInstructionIndex(BNLowLevelILFunction* func, size_t instr);
BINARYNINJACOREAPI size_t BNGetMappedMediumLevelILExprIndex(BNLowLevelILFunction* func, size_t expr);
@@ -3968,6 +3969,7 @@ __attribute__ ((format (printf, 1, 2)))
BINARYNINJACOREAPI BNLowLevelILFunction* BNGetLowLevelILForMediumLevelIL(BNMediumLevelILFunction* func);
BINARYNINJACOREAPI size_t BNGetLowLevelILInstructionIndex(BNMediumLevelILFunction* func, size_t instr);
BINARYNINJACOREAPI size_t BNGetLowLevelILExprIndex(BNMediumLevelILFunction* func, size_t expr);
+ BINARYNINJACOREAPI size_t* BNGetLowLevelILExprIndexes(BNMediumLevelILFunction* func, size_t expr, size_t* count);
BINARYNINJACOREAPI BNHighLevelILFunction* BNGetHighLevelILForMediumLevelIL(BNMediumLevelILFunction* func);
BINARYNINJACOREAPI size_t BNGetHighLevelILInstructionIndex(BNMediumLevelILFunction* func, size_t instr);
@@ -4003,6 +4005,7 @@ __attribute__ ((format (printf, 1, 2)))
BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetMediumLevelILForHighLevelILFunction(BNHighLevelILFunction* func);
BINARYNINJACOREAPI size_t BNGetMediumLevelILExprIndexFromHighLevelIL(BNHighLevelILFunction* func, size_t expr);
+ BINARYNINJACOREAPI size_t* BNGetMediumLevelILExprIndexesFromHighLevelIL(BNHighLevelILFunction* func, size_t expr, size_t* count);
BINARYNINJACOREAPI void BNUpdateHighLevelILOperand(BNHighLevelILFunction* func, size_t instr, size_t operandIndex, uint64_t value);
BINARYNINJACOREAPI void BNReplaceHighLevelILExpr(BNHighLevelILFunction* func, size_t expr, size_t newExpr);
diff --git a/highlevelil.cpp b/highlevelil.cpp
index 264af7c3..6c304d0e 100644
--- a/highlevelil.cpp
+++ b/highlevelil.cpp
@@ -384,6 +384,20 @@ size_t HighLevelILFunction::GetMediumLevelILExprIndex(size_t expr) const
}
+set<size_t> HighLevelILFunction::GetMediumLevelILExprIndexes(size_t expr) const
+{
+ size_t count;
+ size_t* exprs = BNGetMediumLevelILExprIndexesFromHighLevelIL(m_object, expr, &count);
+
+ set<size_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(exprs[i]);
+
+ BNFreeILInstructionList(exprs);
+ return result;
+}
+
+
void HighLevelILFunction::UpdateInstructionOperand(size_t i, size_t operandIndex, ExprId value)
{
BNUpdateHighLevelILOperand(m_object, i, operandIndex, value);
diff --git a/lowlevelil.cpp b/lowlevelil.cpp
index 13b465f9..ed9c7884 100644
--- a/lowlevelil.cpp
+++ b/lowlevelil.cpp
@@ -798,6 +798,20 @@ size_t LowLevelILFunction::GetMediumLevelILExprIndex(size_t expr) const
}
+set<size_t> LowLevelILFunction::GetMediumLevelILExprIndexes(size_t expr) const
+{
+ size_t count;
+ size_t* exprs = BNGetMediumLevelILExprIndexes(m_object, expr, &count);
+
+ set<size_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(exprs[i]);
+
+ BNFreeILInstructionList(exprs);
+ return result;
+}
+
+
size_t LowLevelILFunction::GetMappedMediumLevelILInstructionIndex(size_t instr) const
{
return BNGetMappedMediumLevelILInstructionIndex(m_object, instr);
diff --git a/mediumlevelil.cpp b/mediumlevelil.cpp
index 6fb43d22..3d13545e 100644
--- a/mediumlevelil.cpp
+++ b/mediumlevelil.cpp
@@ -776,6 +776,20 @@ size_t MediumLevelILFunction::GetLowLevelILExprIndex(size_t expr) const
}
+set<size_t> MediumLevelILFunction::GetLowLevelILExprIndexes(size_t expr) const
+{
+ size_t count;
+ size_t* exprs = BNGetLowLevelILExprIndexes(m_object, expr, &count);
+
+ set<size_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(exprs[i]);
+
+ BNFreeILInstructionList(exprs);
+ return result;
+}
+
+
Ref<HighLevelILFunction> MediumLevelILFunction::GetHighLevelIL() const
{
BNHighLevelILFunction* func = BNGetHighLevelILForMediumLevelIL(m_object);
diff --git a/python/highlevelil.py b/python/highlevelil.py
index e1d26f62..164be0e1 100644
--- a/python/highlevelil.py
+++ b/python/highlevelil.py
@@ -530,6 +530,14 @@ class HighLevelILInstruction(object):
return self.medium_level_il
@property
+ def mlils(self):
+ exprs = self.function.get_medium_level_il_expr_indexes(self._expr_index)
+ result = []
+ for expr in exprs:
+ result.append(mediumlevelil.MediumLevelILInstruction(self._function.medium_level_il.ssa_form, expr))
+ return result
+
+ @property
def low_level_il(self):
"""Low level IL form of this expression"""
if self.mlil is None:
@@ -924,6 +932,15 @@ class HighLevelILFunction(object):
return None
return result
+ def get_medium_level_il_expr_indexes(self, expr):
+ count = ctypes.c_ulonglong()
+ exprs = core.BNGetMediumLevelILExprIndexesFromHighLevelIL(self.handle, expr, count)
+ result = []
+ for i in range(0, count.value):
+ result.append(exprs[i])
+ core.BNFreeILInstructionList(exprs)
+ return result
+
def get_label(self, label_idx):
result = core.BNGetHighLevelILExprIndexForLabel(self.handle, label_idx)
if result >= core.BNGetHighLevelILExprCount(self.handle):
diff --git a/python/lowlevelil.py b/python/lowlevelil.py
index 870b787a..5f09d06c 100644
--- a/python/lowlevelil.py
+++ b/python/lowlevelil.py
@@ -1016,6 +1016,14 @@ class LowLevelILInstruction(object):
return self.medium_level_il
@property
+ def mlils(self):
+ exprs = self.function.get_medium_level_il_expr_indexes(self.expr_index)
+ result = []
+ for expr in exprs:
+ result.append(binaryninja.mediumlevelil.MediumLevelILInstruction(self._function.medium_level_il, expr))
+ return result
+
+ @property
def mapped_medium_level_il(self):
"""Gets the mapped medium level IL expression corresponding to this expression"""
expr = self._function.get_mapped_medium_level_il_expr_index(self.expr_index)
@@ -2994,6 +3002,15 @@ class LowLevelILFunction(object):
return None
return result
+ def get_medium_level_il_expr_indexes(self, expr):
+ count = ctypes.c_ulonglong()
+ exprs = core.BNGetMediumLevelILExprIndexes(self.handle, expr, count)
+ result = []
+ for i in range(0, count.value):
+ result.append(exprs[i])
+ core.BNFreeILInstructionList(exprs)
+ return result
+
def get_mapped_medium_level_il_instruction_index(self, instr):
med_il = self.mapped_medium_level_il
if med_il is None:
diff --git a/python/mediumlevelil.py b/python/mediumlevelil.py
index 68da31f3..acfc7478 100644
--- a/python/mediumlevelil.py
+++ b/python/mediumlevelil.py
@@ -470,6 +470,14 @@ class MediumLevelILInstruction(object):
return self.low_level_il
@property
+ def llils(self):
+ exprs = self.function.get_low_level_il_expr_indexes(self.expr_index)
+ result = []
+ for expr in exprs:
+ result.append(lowlevelil.LowLevelILInstruction(self._function.low_level_il.ssa_form, expr))
+ return result
+
+ @property
def high_level_il(self):
"""High level IL form of this expression"""
expr = self._function.get_high_level_il_expr_index(self._expr_index)
@@ -1162,6 +1170,15 @@ class MediumLevelILFunction(object):
return None
return result
+ def get_low_level_il_expr_indexes(self, expr):
+ count = ctypes.c_ulonglong()
+ exprs = core.BNGetLowLevelILExprIndexes(self.handle, expr, count)
+ result = []
+ for i in range(0, count.value):
+ result.append(exprs[i])
+ core.BNFreeILInstructionList(exprs)
+ return result
+
def get_high_level_il_instruction_index(self, instr):
high_il = self.high_level_il
if high_il is None: