Skip to content

Commit df48a9e

Browse files
committed
Add improved instruction mapping APIs.
1 parent 20b03bd commit df48a9e

File tree

8 files changed

+99
-0
lines changed

8 files changed

+99
-0
lines changed

binaryninjaapi.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3755,6 +3755,7 @@ __attribute__ ((format (printf, 1, 2)))
37553755
Ref<MediumLevelILFunction> GetMappedMediumLevelIL() const;
37563756
size_t GetMediumLevelILInstructionIndex(size_t instr) const;
37573757
size_t GetMediumLevelILExprIndex(size_t expr) const;
3758+
std::set<size_t> GetMediumLevelILExprIndexes(size_t expr) const;
37583759
size_t GetMappedMediumLevelILInstructionIndex(size_t instr) const;
37593760
size_t GetMappedMediumLevelILExprIndex(size_t expr) const;
37603761

@@ -4098,6 +4099,7 @@ __attribute__ ((format (printf, 1, 2)))
40984099
Ref<LowLevelILFunction> GetLowLevelIL() const;
40994100
size_t GetLowLevelILInstructionIndex(size_t instr) const;
41004101
size_t GetLowLevelILExprIndex(size_t expr) const;
4102+
std::set<size_t> GetLowLevelILExprIndexes(size_t expr) const;
41014103
Ref<HighLevelILFunction> GetHighLevelIL() const;
41024104
size_t GetHighLevelILInstructionIndex(size_t instr) const;
41034105
size_t GetHighLevelILExprIndex(size_t expr) const;
@@ -4354,6 +4356,7 @@ __attribute__ ((format (printf, 1, 2)))
43544356

43554357
Ref<MediumLevelILFunction> GetMediumLevelIL() const;
43564358
size_t GetMediumLevelILExprIndex(size_t expr) const;
4359+
std::set<size_t> GetMediumLevelILExprIndexes(size_t expr) const;
43574360

43584361
void UpdateInstructionOperand(size_t i, size_t operandIndex, ExprId value);
43594362
void ReplaceExpr(size_t expr, size_t newExpr);

binaryninjacore.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3826,6 +3826,7 @@ __attribute__ ((format (printf, 1, 2)))
38263826
BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetMappedMediumLevelIL(BNLowLevelILFunction* func);
38273827
BINARYNINJACOREAPI size_t BNGetMediumLevelILInstructionIndex(BNLowLevelILFunction* func, size_t instr);
38283828
BINARYNINJACOREAPI size_t BNGetMediumLevelILExprIndex(BNLowLevelILFunction* func, size_t expr);
3829+
BINARYNINJACOREAPI size_t* BNGetMediumLevelILExprIndexes(BNLowLevelILFunction* func, size_t expr, size_t* count);
38293830
BINARYNINJACOREAPI size_t BNGetMappedMediumLevelILInstructionIndex(BNLowLevelILFunction* func, size_t instr);
38303831
BINARYNINJACOREAPI size_t BNGetMappedMediumLevelILExprIndex(BNLowLevelILFunction* func, size_t expr);
38313832

@@ -3968,6 +3969,7 @@ __attribute__ ((format (printf, 1, 2)))
39683969
BINARYNINJACOREAPI BNLowLevelILFunction* BNGetLowLevelILForMediumLevelIL(BNMediumLevelILFunction* func);
39693970
BINARYNINJACOREAPI size_t BNGetLowLevelILInstructionIndex(BNMediumLevelILFunction* func, size_t instr);
39703971
BINARYNINJACOREAPI size_t BNGetLowLevelILExprIndex(BNMediumLevelILFunction* func, size_t expr);
3972+
BINARYNINJACOREAPI size_t* BNGetLowLevelILExprIndexes(BNMediumLevelILFunction* func, size_t expr, size_t* count);
39713973

39723974
BINARYNINJACOREAPI BNHighLevelILFunction* BNGetHighLevelILForMediumLevelIL(BNMediumLevelILFunction* func);
39733975
BINARYNINJACOREAPI size_t BNGetHighLevelILInstructionIndex(BNMediumLevelILFunction* func, size_t instr);
@@ -4003,6 +4005,7 @@ __attribute__ ((format (printf, 1, 2)))
40034005

40044006
BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetMediumLevelILForHighLevelILFunction(BNHighLevelILFunction* func);
40054007
BINARYNINJACOREAPI size_t BNGetMediumLevelILExprIndexFromHighLevelIL(BNHighLevelILFunction* func, size_t expr);
4008+
BINARYNINJACOREAPI size_t* BNGetMediumLevelILExprIndexesFromHighLevelIL(BNHighLevelILFunction* func, size_t expr, size_t* count);
40064009

40074010
BINARYNINJACOREAPI void BNUpdateHighLevelILOperand(BNHighLevelILFunction* func, size_t instr, size_t operandIndex, uint64_t value);
40084011
BINARYNINJACOREAPI void BNReplaceHighLevelILExpr(BNHighLevelILFunction* func, size_t expr, size_t newExpr);

highlevelil.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,20 @@ size_t HighLevelILFunction::GetMediumLevelILExprIndex(size_t expr) const
384384
}
385385

386386

387+
set<size_t> HighLevelILFunction::GetMediumLevelILExprIndexes(size_t expr) const
388+
{
389+
size_t count;
390+
size_t* exprs = BNGetMediumLevelILExprIndexesFromHighLevelIL(m_object, expr, &count);
391+
392+
set<size_t> result;
393+
for (size_t i = 0; i < count; i++)
394+
result.insert(exprs[i]);
395+
396+
BNFreeILInstructionList(exprs);
397+
return result;
398+
}
399+
400+
387401
void HighLevelILFunction::UpdateInstructionOperand(size_t i, size_t operandIndex, ExprId value)
388402
{
389403
BNUpdateHighLevelILOperand(m_object, i, operandIndex, value);

lowlevelil.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,20 @@ size_t LowLevelILFunction::GetMediumLevelILExprIndex(size_t expr) const
798798
}
799799

800800

801+
set<size_t> LowLevelILFunction::GetMediumLevelILExprIndexes(size_t expr) const
802+
{
803+
size_t count;
804+
size_t* exprs = BNGetMediumLevelILExprIndexes(m_object, expr, &count);
805+
806+
set<size_t> result;
807+
for (size_t i = 0; i < count; i++)
808+
result.insert(exprs[i]);
809+
810+
BNFreeILInstructionList(exprs);
811+
return result;
812+
}
813+
814+
801815
size_t LowLevelILFunction::GetMappedMediumLevelILInstructionIndex(size_t instr) const
802816
{
803817
return BNGetMappedMediumLevelILInstructionIndex(m_object, instr);

mediumlevelil.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,20 @@ size_t MediumLevelILFunction::GetLowLevelILExprIndex(size_t expr) const
776776
}
777777

778778

779+
set<size_t> MediumLevelILFunction::GetLowLevelILExprIndexes(size_t expr) const
780+
{
781+
size_t count;
782+
size_t* exprs = BNGetLowLevelILExprIndexes(m_object, expr, &count);
783+
784+
set<size_t> result;
785+
for (size_t i = 0; i < count; i++)
786+
result.insert(exprs[i]);
787+
788+
BNFreeILInstructionList(exprs);
789+
return result;
790+
}
791+
792+
779793
Ref<HighLevelILFunction> MediumLevelILFunction::GetHighLevelIL() const
780794
{
781795
BNHighLevelILFunction* func = BNGetHighLevelILForMediumLevelIL(m_object);

python/highlevelil.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,14 @@ def mlil(self):
529529
"""Alias for medium_level_il"""
530530
return self.medium_level_il
531531

532+
@property
533+
def mlils(self):
534+
exprs = self.function.get_medium_level_il_expr_indexes(self._expr_index)
535+
result = []
536+
for expr in exprs:
537+
result.append(mediumlevelil.MediumLevelILInstruction(self._function.medium_level_il.ssa_form, expr))
538+
return result
539+
532540
@property
533541
def low_level_il(self):
534542
"""Low level IL form of this expression"""
@@ -924,6 +932,15 @@ def get_medium_level_il_expr_index(self, expr):
924932
return None
925933
return result
926934

935+
def get_medium_level_il_expr_indexes(self, expr):
936+
count = ctypes.c_ulonglong()
937+
exprs = core.BNGetMediumLevelILExprIndexesFromHighLevelIL(self.handle, expr, count)
938+
result = []
939+
for i in range(0, count.value):
940+
result.append(exprs[i])
941+
core.BNFreeILInstructionList(exprs)
942+
return result
943+
927944
def get_label(self, label_idx):
928945
result = core.BNGetHighLevelILExprIndexForLabel(self.handle, label_idx)
929946
if result >= core.BNGetHighLevelILExprCount(self.handle):

python/lowlevelil.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,14 @@ def medium_level_il(self):
10151015
def mlil(self):
10161016
return self.medium_level_il
10171017

1018+
@property
1019+
def mlils(self):
1020+
exprs = self.function.get_medium_level_il_expr_indexes(self.expr_index)
1021+
result = []
1022+
for expr in exprs:
1023+
result.append(binaryninja.mediumlevelil.MediumLevelILInstruction(self._function.medium_level_il, expr))
1024+
return result
1025+
10181026
@property
10191027
def mapped_medium_level_il(self):
10201028
"""Gets the mapped medium level IL expression corresponding to this expression"""
@@ -2994,6 +3002,15 @@ def get_medium_level_il_expr_index(self, expr):
29943002
return None
29953003
return result
29963004

3005+
def get_medium_level_il_expr_indexes(self, expr):
3006+
count = ctypes.c_ulonglong()
3007+
exprs = core.BNGetMediumLevelILExprIndexes(self.handle, expr, count)
3008+
result = []
3009+
for i in range(0, count.value):
3010+
result.append(exprs[i])
3011+
core.BNFreeILInstructionList(exprs)
3012+
return result
3013+
29973014
def get_mapped_medium_level_il_instruction_index(self, instr):
29983015
med_il = self.mapped_medium_level_il
29993016
if med_il is None:

python/mediumlevelil.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,14 @@ def llil(self):
469469
"""Alias for low_level_il"""
470470
return self.low_level_il
471471

472+
@property
473+
def llils(self):
474+
exprs = self.function.get_low_level_il_expr_indexes(self.expr_index)
475+
result = []
476+
for expr in exprs:
477+
result.append(lowlevelil.LowLevelILInstruction(self._function.low_level_il.ssa_form, expr))
478+
return result
479+
472480
@property
473481
def high_level_il(self):
474482
"""High level IL form of this expression"""
@@ -1162,6 +1170,15 @@ def get_low_level_il_expr_index(self, expr):
11621170
return None
11631171
return result
11641172

1173+
def get_low_level_il_expr_indexes(self, expr):
1174+
count = ctypes.c_ulonglong()
1175+
exprs = core.BNGetLowLevelILExprIndexes(self.handle, expr, count)
1176+
result = []
1177+
for i in range(0, count.value):
1178+
result.append(exprs[i])
1179+
core.BNFreeILInstructionList(exprs)
1180+
return result
1181+
11651182
def get_high_level_il_instruction_index(self, instr):
11661183
high_il = self.high_level_il
11671184
if high_il is None:

0 commit comments

Comments
 (0)