diff options
| -rw-r--r-- | binaryninjaapi.h | 3 | ||||
| -rw-r--r-- | binaryninjacore.h | 3 | ||||
| -rw-r--r-- | highlevelil.cpp | 14 | ||||
| -rw-r--r-- | lowlevelil.cpp | 14 | ||||
| -rw-r--r-- | mediumlevelil.cpp | 14 | ||||
| -rw-r--r-- | python/highlevelil.py | 17 | ||||
| -rw-r--r-- | python/lowlevelil.py | 17 | ||||
| -rw-r--r-- | python/mediumlevelil.py | 17 |
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: |
