summaryrefslogtreecommitdiff
path: root/python/lowlevelil.py
diff options
context:
space:
mode:
authorJordan Wiens <jordan@psifertex.com>2019-06-08 23:46:19 -0400
committerJordan Wiens <jordan@psifertex.com>2019-06-08 23:46:19 -0400
commit3c7a00172b3b86add668257ca35b873fc85a7017 (patch)
tree73fa2eadacb5b8722258c159076bf48082eb607e /python/lowlevelil.py
parentef4e70f68d8c0855bcc64ad49f8f47a78dd3552a (diff)
final refactor for missing parameters
Diffstat (limited to 'python/lowlevelil.py')
-rw-r--r--python/lowlevelil.py788
1 files changed, 601 insertions, 187 deletions
diff --git a/python/lowlevelil.py b/python/lowlevelil.py
index ff5829e7..472dac10 100644
--- a/python/lowlevelil.py
+++ b/python/lowlevelil.py
@@ -42,171 +42,459 @@ class LowLevelILLabel(object):
class ILRegister(object):
def __init__(self, arch, reg):
- self.arch = arch
- self.index = reg
- self.temp = (self.index & 0x80000000) != 0
- if self.temp:
- self.name = "temp%d" % (self.index & 0x7fffffff)
+ self._arch = arch
+ self._index = reg
+ self._temp = (self._index & 0x80000000) != 0
+ if self._temp:
+ self._name = "temp%d" % (self._index & 0x7fffffff)
else:
- self.name = self.arch.get_reg_name(self.index)
+ self._name = self._arch.get_reg_name(self._index)
@property
def info(self):
- return self.arch.regs[self.name]
+ return self._arch.regs[self._name]
def __str__(self):
- return self.name
+ return self._name
def __repr__(self):
- return self.name
+ return self._name
def __eq__(self, other):
if not isinstance(other, type(self)):
return False
return self.info == other.info
+ @property
+ def arch(self):
+ """ """
+ return self._arch
+
+ @arch.setter
+ def arch(self, value):
+ self._arch = value
+
+ @property
+ def index(self):
+ """ """
+ return self._index
+
+ @index.setter
+ def index(self, value):
+ self._index = value
+
+ @property
+ def temp(self):
+ """ """
+ return self._temp
+
+ @temp.setter
+ def temp(self, value):
+ self._temp = value
+
+ @property
+ def name(self):
+ """ """
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ self._name = value
+
class ILRegisterStack(object):
def __init__(self, arch, reg_stack):
- self.arch = arch
- self.index = reg_stack
- self.name = self.arch.get_reg_stack_name(self.index)
+ self._arch = arch
+ self._index = reg_stack
+ self._name = self._arch.get_reg_stack_name(self._index)
@property
def info(self):
- return self.arch.reg_stacks[self.name]
+ return self._arch.reg_stacks[self._name]
def __str__(self):
- return self.name
+ return self._name
def __repr__(self):
- return self.name
+ return self._name
def __eq__(self, other):
if not isinstance(other, type(self)):
return False
return self.info == other.info
+ @property
+ def arch(self):
+ """ """
+ return self._arch
+
+ @arch.setter
+ def arch(self, value):
+ self._arch = value
+
+ @property
+ def index(self):
+ """ """
+ return self._index
+
+ @index.setter
+ def index(self, value):
+ self._index = value
+
+ @property
+ def name(self):
+ """ """
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ self._name = value
+
class ILFlag(object):
def __init__(self, arch, flag):
- self.arch = arch
- self.index = flag
- self.temp = (self.index & 0x80000000) != 0
- if self.temp:
- self.name = "cond:%d" % (self.index & 0x7fffffff)
+ self._arch = arch
+ self._index = flag
+ self._temp = (self._index & 0x80000000) != 0
+ if self._temp:
+ self._name = "cond:%d" % (self._index & 0x7fffffff)
else:
- self.name = self.arch.get_flag_name(self.index)
+ self._name = self._arch.get_flag_name(self._index)
def __str__(self):
- return self.name
+ return self._name
def __repr__(self):
- return self.name
+ return self._name
+
+ @property
+ def arch(self):
+ """ """
+ return self._arch
+
+ @arch.setter
+ def arch(self, value):
+ self._arch = value
+
+ @property
+ def index(self):
+ """ """
+ return self._index
+
+ @index.setter
+ def index(self, value):
+ self._index = value
+
+ @property
+ def temp(self):
+ """ """
+ return self._temp
+
+ @temp.setter
+ def temp(self, value):
+ self._temp = value
+
+ @property
+ def name(self):
+ """ """
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ self._name = value
class ILSemanticFlagClass(object):
def __init__(self, arch, sem_class):
- self.arch = arch
- self.index = sem_class
- self.name = self.arch.get_semantic_flag_class_name(self.index)
+ self._arch = arch
+ self._index = sem_class
+ self._name = self._arch.get_semantic_flag_class_name(self._index)
def __str__(self):
- return self.name
+ return self._name
def __repr__(self):
- return self.name
+ return self._name
def __eq__(self, other):
if not isinstance(other, type(self)):
return False
- return self.index == other.index
+ return self._index == other._index
+
+ @property
+ def arch(self):
+ """ """
+ return self._arch
+
+ @arch.setter
+ def arch(self, value):
+ self._arch = value
+
+ @property
+ def index(self):
+ """ """
+ return self._index
+
+ @index.setter
+ def index(self, value):
+ self._index = value
+
+ @property
+ def name(self):
+ """ """
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ self._name = value
class ILSemanticFlagGroup(object):
def __init__(self, arch, sem_group):
- self.arch = arch
- self.index = sem_group
- self.name = self.arch.get_semantic_flag_group_name(self.index)
+ self._arch = arch
+ self._index = sem_group
+ self._name = self._arch.get_semantic_flag_group_name(self._index)
def __str__(self):
- return self.name
+ return self._name
def __repr__(self):
- return self.name
+ return self._name
def __eq__(self, other):
if not isinstance(other, type(self)):
return False
- return self.index == other.index
+ return self._index == other.index
+
+ @property
+ def arch(self):
+ """ """
+ return self._arch
+
+ @arch.setter
+ def arch(self, value):
+ self._arch = value
+
+ @property
+ def index(self):
+ """ """
+ return self._index
+
+ @index.setter
+ def index(self, value):
+ self._index = value
+
+ @property
+ def name(self):
+ """ """
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ self._name = value
class ILIntrinsic(object):
def __init__(self, arch, intrinsic):
- self.arch = arch
- self.index = intrinsic
- self.name = self.arch.get_intrinsic_name(self.index)
- if self.name in self.arch.intrinsics:
- self.inputs = self.arch.intrinsics[self.name].inputs
- self.outputs = self.arch.intrinsics[self.name].outputs
+ self._arch = arch
+ self._index = intrinsic
+ self._name = self._arch.get_intrinsic_name(self._index)
+ if self._name in self._arch.intrinsics:
+ self._inputs = self._arch.intrinsics[self._name].inputs
+ self._outputs = self._arch.intrinsics[self._name].outputs
def __str__(self):
- return self.name
+ return self._name
def __repr__(self):
- return self.name
+ return self._name
def __eq__(self, other):
if not isinstance(other, type(self)):
return False
- return self.index == other.index
+ return self._index == other.index
+
+ @property
+ def arch(self):
+ """ """
+ return self._arch
+
+ @arch.setter
+ def arch(self, value):
+ self._arch = value
+
+ @property
+ def index(self):
+ """ """
+ return self._index
+
+ @index.setter
+ def index(self, value):
+ self._index = value
+
+ @property
+ def name(self):
+ """ """
+ return self._name
+
+ @name.setter
+ def name(self, value):
+ self._name = value
+
+ @property
+ def inputs(self):
+ """``inputs`` is only available if the IL intrinsic is an Architecture intrinsic """
+ return self._inputs
+
+ @inputs.setter
+ def inputs(self, value):
+ self._inputs = value
+
+ @property
+ def outputs(self):
+ """``outputs`` is only available if the IL intrinsic is an Architecture intrinsic """
+ return self._outputs
+
+ @outputs.setter
+ def outputs(self, value):
+ self._outputs = value
class SSARegister(object):
def __init__(self, reg, version):
- self.reg = reg
- self.version = version
+ self._reg = reg
+ self._version = version
def __repr__(self):
- return "<ssa %s version %d>" % (repr(self.reg), self.version)
+ return "<ssa %s version %d>" % (repr(self._reg), self._version)
+
+ @property
+ def reg(self):
+ """ """
+ return self._reg
+
+ @reg.setter
+ def reg(self, value):
+ self._reg = value
+
+ @property
+ def version(self):
+ """ """
+ return self._version
+
+ @version.setter
+ def version(self, value):
+ self._version = value
class SSARegisterStack(object):
def __init__(self, reg_stack, version):
- self.reg_stack = reg_stack
- self.version = version
+ self._reg_stack = reg_stack
+ self._version = version
def __repr__(self):
- return "<ssa %s version %d>" % (repr(self.reg_stack), self.version)
+ return "<ssa %s version %d>" % (repr(self._reg_stack), self._version)
+
+ @property
+ def reg_stack(self):
+ """ """
+ return self._reg_stack
+
+ @reg_stack.setter
+ def reg_stack(self, value):
+ self._reg_stack = value
+
+ @property
+ def version(self):
+ """ """
+ return self._version
+
+ @version.setter
+ def version(self, value):
+ self._version = value
class SSAFlag(object):
def __init__(self, flag, version):
- self.flag = flag
- self.version = version
+ self._flag = flag
+ self._version = version
def __repr__(self):
- return "<ssa %s version %d>" % (repr(self.flag), self.version)
+ return "<ssa %s version %d>" % (repr(self._flag), self._version)
+
+ @property
+ def flag(self):
+ """ """
+ return self._flag
+
+ @flag.setter
+ def flag(self, value):
+ self._flag = value
+
+ @property
+ def version(self):
+ """ """
+ return self._version
+
+ @version.setter
+ def version(self, value):
+ self._version = value
class SSARegisterOrFlag(object):
def __init__(self, reg_or_flag, version):
- self.reg_or_flag = reg_or_flag
- self.version = version
+ self._reg_or_flag = reg_or_flag
+ self._version = version
def __repr__(self):
- return "<ssa %s version %d>" % (repr(self.reg_or_flag), self.version)
+ return "<ssa %s version %d>" % (repr(self._reg_or_flag), self._version)
+
+ @property
+ def reg_or_flag(self):
+ """ """
+ return self._reg_or_flag
+
+ @reg_or_flag.setter
+ def reg_or_flag(self, value):
+ self._reg_or_flag = value
+
+ @property
+ def version(self):
+ """ """
+ return self._version
+
+ @version.setter
+ def version(self, value):
+ self._version = value
class LowLevelILOperationAndSize(object):
def __init__(self, operation, size):
- self.operation = operation
- self.size = size
+ self._operation = operation
+ self._size = size
def __repr__(self):
- if self.size == 0:
- return "<%s>" % self.operation.name
- return "<%s %d>" % (self.operation.name, self.size)
+ if self._size == 0:
+ return "<%s>" % self._operation.name
+ return "<%s %d>" % (self._operation.name, self._size)
+
+ @property
+ def operation(self):
+ """ """
+ return self._operation
+
+ @operation.setter
+ def operation(self, value):
+ self._operation = value
+
+ @property
+ def size(self):
+ """ """
+ return self._size
+
+ @size.setter
+ def size(self, value):
+ self._size = value
class LowLevelILInstruction(object):
@@ -356,21 +644,21 @@ class LowLevelILInstruction(object):
def __init__(self, func, expr_index, instr_index=None):
instr = core.BNGetLowLevelILByIndex(func.handle, expr_index)
- self.function = func
- self.expr_index = expr_index
- self.instr_index = instr_index
- self.operation = LowLevelILOperation(instr.operation)
- self.size = instr.size
- self.address = instr.address
- self.source_operand = instr.sourceOperand
+ self._function = func
+ self._expr_index = expr_index
+ self._instr_index = instr_index
+ self._operation = LowLevelILOperation(instr.operation)
+ self._size = instr.size
+ self._address = instr.address
+ self._source_operand = instr.sourceOperand
if instr.flags == 0:
- self.flags = None
+ self._flags = None
else:
- self.flags = func.arch.get_flag_write_type_name(instr.flags)
- if self.source_operand == 0xffffffff:
- self.source_operand = None
+ self._flags = func.arch.get_flag_write_type_name(instr.flags)
+ if self._source_operand == 0xffffffff:
+ self._source_operand = None
operands = LowLevelILInstruction.ILOperations[instr.operation]
- self.operands = []
+ self._operands = []
i = 0
for operand in operands:
name, operand_type = operand
@@ -405,8 +693,8 @@ class LowLevelILInstruction(object):
i += 1
value = SSARegisterStack(reg_stack, instr.operands[i])
i += 1
- self.operands.append(value)
- self.dest = value
+ self._operands.append(value)
+ self._dest = value
value = SSARegisterStack(reg_stack, instr.operands[i])
elif operand_type == "flag":
value = ILFlag(func.arch, instr.operands[i])
@@ -505,7 +793,7 @@ class LowLevelILInstruction(object):
adjust |= ~0x80000000
value[func.arch.get_reg_stack_name(reg_stack)] = adjust
core.BNLowLevelILFreeOperandList(operand_list)
- self.operands.append(value)
+ self._operands.append(value)
self.__dict__[name] = value
i += 1
@@ -524,19 +812,19 @@ class LowLevelILInstruction(object):
def __eq__(self, value):
if not isinstance(value, type(self)):
return False
- return self.function == value.function and self.expr_index == value.expr_index
+ return self._function == value.function and self.expr_index == value.expr_index
@property
def tokens(self):
"""LLIL tokens (read-only)"""
count = ctypes.c_ulonglong()
tokens = ctypes.POINTER(core.BNInstructionTextToken)()
- if (self.instr_index is not None) and (self.function.source_function is not None):
- if not core.BNGetLowLevelILInstructionText(self.function.handle, self.function.source_function.handle,
- self.function.arch.handle, self.instr_index, tokens, count):
+ if (self._instr_index is not None) and (self._function.source_function is not None):
+ if not core.BNGetLowLevelILInstructionText(self._function.handle, self._function.source_function.handle,
+ self._function.arch.handle, self._instr_index, tokens, count):
return None
else:
- if not core.BNGetLowLevelILExprText(self.function.handle, self.function.arch.handle,
+ if not core.BNGetLowLevelILExprText(self._function.handle, self._function.arch.handle,
self.expr_index, tokens, count):
return None
result = binaryninja.function.InstructionTextToken.get_instruction_lines(tokens, count.value)
@@ -547,29 +835,29 @@ class LowLevelILInstruction(object):
def il_basic_block(self):
"""IL basic block object containing this expression (read-only) (only available on finalized functions)"""
view = None
- if self.function.source_function is not None:
- view = self.function.source_function.view
- return LowLevelILBasicBlock(view, core.BNGetLowLevelILBasicBlockForInstruction(self.function.handle, self.instr_index), self.function)
+ if self._function.source_function is not None:
+ view = self._function.source_function.view
+ return LowLevelILBasicBlock(view, core.BNGetLowLevelILBasicBlockForInstruction(self._function.handle, self._instr_index), self._function)
@property
def ssa_form(self):
"""SSA form of expression (read-only)"""
- return LowLevelILInstruction(self.function.ssa_form,
- core.BNGetLowLevelILSSAExprIndex(self.function.handle, self.expr_index))
+ return LowLevelILInstruction(self._function.ssa_form,
+ core.BNGetLowLevelILSSAExprIndex(self._function.handle, self.expr_index))
@property
def non_ssa_form(self):
"""Non-SSA form of expression (read-only)"""
- return LowLevelILInstruction(self.function.non_ssa_form,
- core.BNGetLowLevelILNonSSAExprIndex(self.function.handle, self.expr_index))
+ return LowLevelILInstruction(self._function.non_ssa_form,
+ core.BNGetLowLevelILNonSSAExprIndex(self._function.handle, self.expr_index))
@property
def medium_level_il(self):
"""Gets the medium level IL expression corresponding to this expression (may be None for eliminated instructions)"""
- expr = self.function.get_medium_level_il_expr_index(self.expr_index)
+ expr = self._function.get_medium_level_il_expr_index(self.expr_index)
if expr is None:
return None
- return binaryninja.mediumlevelil.MediumLevelILInstruction(self.function.medium_level_il, expr)
+ return binaryninja.mediumlevelil.MediumLevelILInstruction(self._function.medium_level_il, expr)
@property
def mlil(self):
@@ -578,10 +866,10 @@ class LowLevelILInstruction(object):
@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)
+ expr = self._function.get_mapped_medium_level_il_expr_index(self.expr_index)
if expr is None:
return None
- return binaryninja.mediumlevelil.MediumLevelILInstruction(self.function.mapped_medium_level_il, expr)
+ return binaryninja.mediumlevelil.MediumLevelILInstruction(self._function.mapped_medium_level_il, expr)
@property
def mmlil(self):
@@ -590,23 +878,23 @@ class LowLevelILInstruction(object):
@property
def value(self):
"""Value of expression if constant or a known value (read-only)"""
- value = core.BNGetLowLevelILExprValue(self.function.handle, self.expr_index)
- result = binaryninja.function.RegisterValue(self.function.arch, value)
+ value = core.BNGetLowLevelILExprValue(self._function.handle, self.expr_index)
+ result = binaryninja.function.RegisterValue(self._function.arch, value)
return result
@property
def possible_values(self):
"""Possible values of expression using path-sensitive static data flow analysis (read-only)"""
- value = core.BNGetLowLevelILPossibleExprValues(self.function.handle, self.expr_index)
- result = binaryninja.function.PossibleValueSet(self.function.arch, value)
+ value = core.BNGetLowLevelILPossibleExprValues(self._function.handle, self.expr_index)
+ result = binaryninja.function.PossibleValueSet(self._function.arch, value)
core.BNFreePossibleValueSet(value)
return result
@property
def prefix_operands(self):
"""All operands in the expression tree in prefix order"""
- result = [LowLevelILOperationAndSize(self.operation, self.size)]
- for operand in self.operands:
+ result = [LowLevelILOperationAndSize(self._operation, self._size)]
+ for operand in self._operands:
if isinstance(operand, LowLevelILInstruction):
result += operand.prefix_operands
else:
@@ -617,85 +905,85 @@ class LowLevelILInstruction(object):
def postfix_operands(self):
"""All operands in the expression tree in postfix order"""
result = []
- for operand in self.operands:
+ for operand in self._operands:
if isinstance(operand, LowLevelILInstruction):
result += operand.postfix_operands
else:
result.append(operand)
- result.append(LowLevelILOperationAndSize(self.operation, self.size))
+ result.append(LowLevelILOperationAndSize(self._operation, self._size))
return result
def get_reg_value(self, reg):
- reg = self.function.arch.get_reg_index(reg)
- value = core.BNGetLowLevelILRegisterValueAtInstruction(self.function.handle, reg, self.instr_index)
- result = binaryninja.function.RegisterValue(self.function.arch, value)
+ reg = self._function.arch.get_reg_index(reg)
+ value = core.BNGetLowLevelILRegisterValueAtInstruction(self._function.handle, reg, self._instr_index)
+ result = binaryninja.function.RegisterValue(self._function.arch, value)
return result
def get_reg_value_after(self, reg):
- reg = self.function.arch.get_reg_index(reg)
- value = core.BNGetLowLevelILRegisterValueAfterInstruction(self.function.handle, reg, self.instr_index)
- result = binaryninja.function.RegisterValue(self.function.arch, value)
+ reg = self._function.arch.get_reg_index(reg)
+ value = core.BNGetLowLevelILRegisterValueAfterInstruction(self._function.handle, reg, self._instr_index)
+ result = binaryninja.function.RegisterValue(self._function.arch, value)
return result
def get_possible_reg_values(self, reg):
- reg = self.function.arch.get_reg_index(reg)
- value = core.BNGetLowLevelILPossibleRegisterValuesAtInstruction(self.function.handle, reg, self.instr_index)
- result = binaryninja.function.PossibleValueSet(self.function.arch, value)
+ reg = self._function.arch.get_reg_index(reg)
+ value = core.BNGetLowLevelILPossibleRegisterValuesAtInstruction(self._function.handle, reg, self._instr_index)
+ result = binaryninja.function.PossibleValueSet(self._function.arch, value)
core.BNFreePossibleValueSet(value)
return result
def get_possible_reg_values_after(self, reg):
- reg = self.function.arch.get_reg_index(reg)
- value = core.BNGetLowLevelILPossibleRegisterValuesAfterInstruction(self.function.handle, reg, self.instr_index)
- result = binaryninja.function.PossibleValueSet(self.function.arch, value)
+ reg = self._function.arch.get_reg_index(reg)
+ value = core.BNGetLowLevelILPossibleRegisterValuesAfterInstruction(self._function.handle, reg, self._instr_index)
+ result = binaryninja.function.PossibleValueSet(self._function.arch, value)
core.BNFreePossibleValueSet(value)
return result
def get_flag_value(self, flag):
- flag = self.function.arch.get_flag_index(flag)
- value = core.BNGetLowLevelILFlagValueAtInstruction(self.function.handle, flag, self.instr_index)
- result = binaryninja.function.RegisterValue(self.function.arch, value)
+ flag = self._function.arch.get_flag_index(flag)
+ value = core.BNGetLowLevelILFlagValueAtInstruction(self._function.handle, flag, self._instr_index)
+ result = binaryninja.function.RegisterValue(self._function.arch, value)
return result
def get_flag_value_after(self, flag):
- flag = self.function.arch.get_flag_index(flag)
- value = core.BNGetLowLevelILFlagValueAfterInstruction(self.function.handle, flag, self.instr_index)
- result = binaryninja.function.RegisterValue(self.function.arch, value)
+ flag = self._function.arch.get_flag_index(flag)
+ value = core.BNGetLowLevelILFlagValueAfterInstruction(self._function.handle, flag, self._instr_index)
+ result = binaryninja.function.RegisterValue(self._function.arch, value)
return result
def get_possible_flag_values(self, flag):
- flag = self.function.arch.get_flag_index(flag)
- value = core.BNGetLowLevelILPossibleFlagValuesAtInstruction(self.function.handle, flag, self.instr_index)
- result = binaryninja.function.PossibleValueSet(self.function.arch, value)
+ flag = self._function.arch.get_flag_index(flag)
+ value = core.BNGetLowLevelILPossibleFlagValuesAtInstruction(self._function.handle, flag, self._instr_index)
+ result = binaryninja.function.PossibleValueSet(self._function.arch, value)
core.BNFreePossibleValueSet(value)
return result
def get_possible_flag_values_after(self, flag):
- flag = self.function.arch.get_flag_index(flag)
- value = core.BNGetLowLevelILPossibleFlagValuesAfterInstruction(self.function.handle, flag, self.instr_index)
- result = binaryninja.function.PossibleValueSet(self.function.arch, value)
+ flag = self._function.arch.get_flag_index(flag)
+ value = core.BNGetLowLevelILPossibleFlagValuesAfterInstruction(self._function.handle, flag, self._instr_index)
+ result = binaryninja.function.PossibleValueSet(self._function.arch, value)
core.BNFreePossibleValueSet(value)
return result
def get_stack_contents(self, offset, size):
- value = core.BNGetLowLevelILStackContentsAtInstruction(self.function.handle, offset, size, self.instr_index)
- result = binaryninja.function.RegisterValue(self.function.arch, value)
+ value = core.BNGetLowLevelILStackContentsAtInstruction(self._function.handle, offset, size, self._instr_index)
+ result = binaryninja.function.RegisterValue(self._function.arch, value)
return result
def get_stack_contents_after(self, offset, size):
- value = core.BNGetLowLevelILStackContentsAfterInstruction(self.function.handle, offset, size, self.instr_index)
- result = binaryninja.function.RegisterValue(self.function.arch, value)
+ value = core.BNGetLowLevelILStackContentsAfterInstruction(self._function.handle, offset, size, self._instr_index)
+ result = binaryninja.function.RegisterValue(self._function.arch, value)
return result
def get_possible_stack_contents(self, offset, size):
- value = core.BNGetLowLevelILPossibleStackContentsAtInstruction(self.function.handle, offset, size, self.instr_index)
- result = binaryninja.function.PossibleValueSet(self.function.arch, value)
+ value = core.BNGetLowLevelILPossibleStackContentsAtInstruction(self._function.handle, offset, size, self._instr_index)
+ result = binaryninja.function.PossibleValueSet(self._function.arch, value)
core.BNFreePossibleValueSet(value)
return result
def get_possible_stack_contents_after(self, offset, size):
- value = core.BNGetLowLevelILPossibleStackContentsAfterInstruction(self.function.handle, offset, size, self.instr_index)
- result = binaryninja.function.PossibleValueSet(self.function.arch, value)
+ value = core.BNGetLowLevelILPossibleStackContentsAfterInstruction(self._function.handle, offset, size, self._instr_index)
+ result = binaryninja.function.PossibleValueSet(self._function.arch, value)
core.BNFreePossibleValueSet(value)
return result
@@ -705,6 +993,96 @@ class LowLevelILInstruction(object):
except AttributeError:
raise AttributeError("attribute '%s' is read only" % name)
+ @property
+ def function(self):
+ """ """
+ return self._function
+
+ @function.setter
+ def function(self, value):
+ self._function = value
+
+ @property
+ def expr_index(self):
+ """ """
+ return self._expr_index
+
+ @expr_index.setter
+ def expr_index(self, value):
+ self._expr_index = value
+
+ @property
+ def instr_index(self):
+ """ """
+ return self._instr_index
+
+ @instr_index.setter
+ def instr_index(self, value):
+ self._instr_index = value
+
+ @property
+ def operation(self):
+ """ """
+ return self._operation
+
+ @operation.setter
+ def operation(self, value):
+ self._operation = value
+
+ @property
+ def size(self):
+ """ """
+ return self._size
+
+ @size.setter
+ def size(self, value):
+ self._size = value
+
+ @property
+ def address(self):
+ """ """
+ return self._address
+
+ @address.setter
+ def address(self, value):
+ self._address = value
+
+ @property
+ def source_operand(self):
+ """ """
+ return self._source_operand
+
+ @source_operand.setter
+ def source_operand(self, value):
+ self._source_operand = value
+
+ @property
+ def flags(self):
+ """ """
+ return self._flags
+
+ @flags.setter
+ def flags(self, value):
+ self._flags = value
+
+ @property
+ def operands(self):
+ """ """
+ return self._operands
+
+ @operands.setter
+ def operands(self, value):
+ self._operands = value
+
+ @property
+ def dest(self):
+ """ """
+ return self._dest
+
+ @dest.setter
+ def dest(self, value):
+ self._dest = value
+
class LowLevelILExpr(object):
"""
@@ -714,7 +1092,16 @@ class LowLevelILExpr(object):
used instead.
"""
def __init__(self, index):
- self.index = index
+ self._index = index
+
+ @property
+ def index(self):
+ """ """
+ return self._index
+
+ @index.setter
+ def index(self, value):
+ self._index = value
class LowLevelILFunction(object):
@@ -746,29 +1133,29 @@ class LowLevelILFunction(object):
======================= ========== ===============================
"""
def __init__(self, arch = None, handle = None, source_func = None):
- self.arch = arch
- self.source_function = source_func
+ self._arch = arch
+ self._source_function = source_func
if handle is not None:
self.handle = core.handle_of_type(handle, core.BNLowLevelILFunction)
- if self.source_function is None:
+ if self._source_function is None:
source_handle = core.BNGetLowLevelILOwnerFunction(self.handle)
if source_handle:
- self.source_function = binaryninja.function.Function(handle = source_handle)
+ self._source_function = binaryninja.function.Function(handle = source_handle)
else:
- self.source_function = None
- if self.arch is None:
- self.arch = self.source_function.arch
+ self._source_function = None
+ if self._arch is None:
+ self._arch = self._source_function.arch
else:
- if self.arch is None:
- self.arch = self.source_function.arch
- if self.source_function is None:
+ if self._arch is None:
+ self._arch = self._source_function.arch
+ if self._source_function is None:
func_handle = None
else:
- func_handle = self.source_function.handle
+ func_handle = self._source_function.handle
self.handle = core.BNCreateLowLevelILFunction(arch.handle, func_handle)
def __hash__(self):
- return hash(('LLIL', self.source_function))
+ return hash(('LLIL', self._source_function))
def __del__(self):
if self.handle is not None:
@@ -791,11 +1178,11 @@ class LowLevelILFunction(object):
@current_address.setter
def current_address(self, value):
- core.BNLowLevelILSetCurrentAddress(self.handle, self.arch.handle, value)
+ core.BNLowLevelILSetCurrentAddress(self.handle, self._arch.handle, value)
def set_current_address(self, value, arch = None):
if arch is None:
- arch = self.arch
+ arch = self._arch
core.BNLowLevelILSetCurrentAddress(self.handle, arch.handle, value)
def set_current_source_block(self, block):
@@ -818,8 +1205,8 @@ class LowLevelILFunction(object):
blocks = core.BNGetLowLevelILBasicBlockList(self.handle, count)
result = []
view = None
- if self.source_function is not None:
- view = self.source_function.view
+ if self._source_function is not None:
+ view = self._source_function.view
for i in range(0, count.value):
result.append(LowLevelILBasicBlock(view, core.BNNewBasicBlockReference(blocks[i]), self))
core.BNFreeBasicBlockList(blocks, count.value)
@@ -838,7 +1225,7 @@ class LowLevelILFunction(object):
result = core.BNGetLowLevelILSSAForm(self.handle)
if not result:
return None
- return LowLevelILFunction(self.arch, result, self.source_function)
+ return LowLevelILFunction(self._arch, result, self._source_function)
@property
def non_ssa_form(self):
@@ -846,7 +1233,7 @@ class LowLevelILFunction(object):
result = core.BNGetLowLevelILNonSSAForm(self.handle)
if not result:
return None
- return LowLevelILFunction(self.arch, result, self.source_function)
+ return LowLevelILFunction(self._arch, result, self._source_function)
@property
def medium_level_il(self):
@@ -854,7 +1241,7 @@ class LowLevelILFunction(object):
result = core.BNGetMediumLevelILForLowLevelIL(self.handle)
if not result:
return None
- return binaryninja.mediumlevelil.MediumLevelILFunction(self.arch, result, self.source_function)
+ return binaryninja.mediumlevelil.MediumLevelILFunction(self._arch, result, self._source_function)
@property
def mlil(self):
@@ -868,7 +1255,7 @@ class LowLevelILFunction(object):
result = core.BNGetMappedMediumLevelIL(self.handle)
if not result:
return None
- return binaryninja.mediumlevelil.MediumLevelILFunction(self.arch, result, self.source_function)
+ return binaryninja.mediumlevelil.MediumLevelILFunction(self._arch, result, self._source_function)
@property
def mmlil(self):
@@ -902,8 +1289,8 @@ class LowLevelILFunction(object):
count = ctypes.c_ulonglong()
blocks = core.BNGetLowLevelILBasicBlockList(self.handle, count)
view = None
- if self.source_function is not None:
- view = self.source_function.view
+ if self._source_function is not None:
+ view = self._source_function.view
try:
for i in range(0, count.value):
yield LowLevelILBasicBlock(view, core.BNNewBasicBlockReference(blocks[i]), self)
@@ -912,7 +1299,7 @@ class LowLevelILFunction(object):
def get_instruction_start(self, addr, arch = None):
if arch is None:
- arch = self.arch
+ arch = self._arch
result = core.BNLowLevelILGetInstructionStart(self.handle, arch.handle, addr)
if result >= core.BNGetLowLevelILInstructionCount(self.handle):
return None
@@ -934,7 +1321,7 @@ class LowLevelILFunction(object):
elif isinstance(operation, LowLevelILOperation):
operation = operation.value
if isinstance(flags, str):
- flags = self.arch.get_flag_write_type_by_name(flags)
+ flags = self._arch.get_flag_write_type_by_name(flags)
elif flags is None:
flags = 0
return LowLevelILExpr(core.BNLowLevelILAddExpr(self.handle, operation, size, flags, a, b, c, d))
@@ -991,7 +1378,7 @@ class LowLevelILFunction(object):
:return: The expression ``reg = value``
:rtype: LowLevelILExpr
"""
- reg = self.arch.get_reg_index(reg)
+ reg = self._arch.get_reg_index(reg)
return self.expr(LowLevelILOperation.LLIL_SET_REG, reg, value.index, size = size, flags = flags)
def set_reg_split(self, size, hi, lo, value, flags = 0):
@@ -1007,8 +1394,8 @@ class LowLevelILFunction(object):
:return: The expression ``hi:lo = value``
:rtype: LowLevelILExpr
"""
- hi = self.arch.get_reg_index(hi)
- lo = self.arch.get_reg_index(lo)
+ hi = self._arch.get_reg_index(hi)
+ lo = self._arch.get_reg_index(lo)
return self.expr(LowLevelILOperation.LLIL_SET_REG_SPLIT, hi, lo, value.index, size = size, flags = flags)
def set_reg_stack_top_relative(self, size, reg_stack, entry, value, flags = 0):
@@ -1024,7 +1411,7 @@ class LowLevelILFunction(object):
:return: The expression ``reg_stack[entry] = value``
:rtype: LowLevelILExpr
"""
- reg_stack = self.arch.get_reg_stack_index(reg_stack)
+ reg_stack = self._arch.get_reg_stack_index(reg_stack)
return self.expr(LowLevelILOperation.LLIL_SET_REG_STACK_REL, reg_stack, entry.index, value.index,
size = size, flags = flags)
@@ -1040,7 +1427,7 @@ class LowLevelILFunction(object):
:return: The expression ``reg_stack.push(value)``
:rtype: LowLevelILExpr
"""
- reg_stack = self.arch.get_reg_stack_index(reg_stack)
+ reg_stack = self._arch.get_reg_stack_index(reg_stack)
return self.expr(LowLevelILOperation.LLIL_REG_STACK_PUSH, reg_stack, value.index, size = size, flags = flags)
def set_flag(self, flag, value):
@@ -1052,7 +1439,7 @@ class LowLevelILFunction(object):
:return: The expression FLAG.flag = value
:rtype: LowLevelILExpr
"""
- return self.expr(LowLevelILOperation.LLIL_SET_FLAG, self.arch.get_flag_by_name(flag), value.index)
+ return self.expr(LowLevelILOperation.LLIL_SET_FLAG, self._arch.get_flag_by_name(flag), value.index)
def load(self, size, addr):
"""
@@ -1108,7 +1495,7 @@ class LowLevelILFunction(object):
:return: A register expression for the given string
:rtype: LowLevelILExpr
"""
- reg = self.arch.get_reg_index(reg)
+ reg = self._arch.get_reg_index(reg)
return self.expr(LowLevelILOperation.LLIL_REG, reg, size=size)
def reg_split(self, size, hi, lo):
@@ -1121,8 +1508,8 @@ class LowLevelILFunction(object):
:return: The expression ``hi:lo``
:rtype: LowLevelILExpr
"""
- hi = self.arch.get_reg_index(hi)
- lo = self.arch.get_reg_index(lo)
+ hi = self._arch.get_reg_index(hi)
+ lo = self._arch.get_reg_index(lo)
return self.expr(LowLevelILOperation.LLIL_REG_SPLIT, hi, lo, size=size)
def reg_stack_top_relative(self, size, reg_stack, entry):
@@ -1136,7 +1523,7 @@ class LowLevelILFunction(object):
:return: The expression ``reg_stack[entry]``
:rtype: LowLevelILExpr
"""
- reg_stack = self.arch.get_reg_stack_index(reg_stack)
+ reg_stack = self._arch.get_reg_stack_index(reg_stack)
return self.expr(LowLevelILOperation.LLIL_REG_STACK_REL, reg_stack, entry.index, size=size)
def reg_stack_pop(self, size, reg_stack):
@@ -1149,7 +1536,7 @@ class LowLevelILFunction(object):
:return: The expression ``reg_stack.pop``
:rtype: LowLevelILExpr
"""
- reg_stack = self.arch.get_reg_stack_index(reg_stack)
+ reg_stack = self._arch.get_reg_stack_index(reg_stack)
return self.expr(LowLevelILOperation.LLIL_REG_STACK_POP, reg_stack, size=size)
def const(self, size, value):
@@ -1225,7 +1612,7 @@ class LowLevelILFunction(object):
:return: A flag expression of given flag name
:rtype: LowLevelILExpr
"""
- return self.expr(LowLevelILOperation.LLIL_FLAG, self.arch.get_flag_by_name(reg))
+ return self.expr(LowLevelILOperation.LLIL_FLAG, self._arch.get_flag_by_name(reg))
def flag_bit(self, size, reg, bit):
"""
@@ -1237,7 +1624,7 @@ class LowLevelILFunction(object):
:return: A constant expression of given value and size ``FLAG.reg = bit``
:rtype: LowLevelILExpr
"""
- return self.expr(LowLevelILOperation.LLIL_FLAG_BIT, self.arch.get_flag_by_name(reg), bit, size=size)
+ return self.expr(LowLevelILOperation.LLIL_FLAG_BIT, self._arch.get_flag_by_name(reg), bit, size=size)
def add(self, size, a, b, flags=None):
"""
@@ -1731,7 +2118,7 @@ class LowLevelILFunction(object):
cond = LowLevelILFlagCondition[cond]
elif isinstance(cond, LowLevelILFlagCondition):
cond = cond.value
- class_index = self.arch.get_semantic_flag_class_index(sem_class)
+ class_index = self._arch.get_semantic_flag_class_index(sem_class)
return self.expr(LowLevelILOperation.LLIL_FLAG_COND, cond, class_index)
def flag_group(self, sem_group):
@@ -1742,7 +2129,7 @@ class LowLevelILFunction(object):
:return: A flag_group expression
:rtype: LowLevelILExpr
"""
- group = self.arch.get_semantic_flag_group_index(sem_group)
+ group = self._arch.get_semantic_flag_group_index(sem_group)
return self.expr(LowLevelILOperation.LLIL_FLAG_GROUP, group)
def compare_equal(self, size, a, b):
@@ -1905,7 +2292,7 @@ class LowLevelILFunction(object):
param_list.append(param.index)
call_param = self.expr(LowLevelILOperation.LLIL_CALL_PARAM, len(params), self.add_operand_list(param_list).index)
return self.expr(LowLevelILOperation.LLIL_INTRINSIC, len(outputs), self.add_operand_list(output_list).index,
- self.arch.get_intrinsic_index(intrinsic), call_param.index, flags = flags)
+ self._arch.get_intrinsic_index(intrinsic), call_param.index, flags = flags)
def breakpoint(self):
"""
@@ -2344,14 +2731,14 @@ class LowLevelILFunction(object):
return core.BNGetLowLevelILNonSSAInstructionIndex(self.handle, instr)
def get_ssa_reg_definition(self, reg_ssa):
- reg = self.arch.get_reg_index(reg_ssa.reg)
+ reg = self._arch.get_reg_index(reg_ssa.reg)
result = core.BNGetLowLevelILSSARegisterDefinition(self.handle, reg, reg_ssa.version)
if result >= core.BNGetLowLevelILInstructionCount(self.handle):
return None
return self[result]
def get_ssa_flag_definition(self, flag_ssa):
- flag = self.arch.get_flag_index(flag_ssa.flag)
+ flag = self._arch.get_flag_index(flag_ssa.flag)
result = core.BNGetLowLevelILSSAFlagDefinition(self.handle, flag, flag_ssa.version)
if result >= core.BNGetLowLevelILInstructionCount(self.handle):
return None
@@ -2364,7 +2751,7 @@ class LowLevelILFunction(object):
return self[result]
def get_ssa_reg_uses(self, reg_ssa):
- reg = self.arch.get_reg_index(reg_ssa.reg)
+ reg = self._arch.get_reg_index(reg_ssa.reg)
count = ctypes.c_ulonglong()
instrs = core.BNGetLowLevelILSSARegisterUses(self.handle, reg, reg_ssa.version, count)
result = []
@@ -2374,7 +2761,7 @@ class LowLevelILFunction(object):
return result
def get_ssa_flag_uses(self, flag_ssa):
- flag = self.arch.get_flag_index(flag_ssa.flag)
+ flag = self._arch.get_flag_index(flag_ssa.flag)
count = ctypes.c_ulonglong()
instrs = core.BNGetLowLevelILSSAFlagUses(self.handle, flag, flag_ssa.version, count)
result = []
@@ -2393,15 +2780,15 @@ class LowLevelILFunction(object):
return result
def get_ssa_reg_value(self, reg_ssa):
- reg = self.arch.get_reg_index(reg_ssa.reg)
+ reg = self._arch.get_reg_index(reg_ssa.reg)
value = core.BNGetLowLevelILSSARegisterValue(self.handle, reg, reg_ssa.version)
- result = binaryninja.function.RegisterValue(self.arch, value)
+ result = binaryninja.function.RegisterValue(self._arch, value)
return result
def get_ssa_flag_value(self, flag_ssa):
- flag = self.arch.get_flag_index(flag_ssa.flag)
+ flag = self._arch.get_flag_index(flag_ssa.flag)
value = core.BNGetLowLevelILSSAFlagValue(self.handle, flag, flag_ssa.version)
- result = binaryninja.function.RegisterValue(self.arch, value)
+ result = binaryninja.function.RegisterValue(self._arch, value)
return result
def get_medium_level_il_instruction_index(self, instr):
@@ -2447,31 +2834,58 @@ class LowLevelILFunction(object):
settings_obj = None
return binaryninja.flowgraph.CoreFlowGraph(core.BNCreateLowLevelILFunctionGraph(self.handle, settings_obj))
+ @property
+ def arch(self):
+ """ """
+ return self._arch
+
+ @arch.setter
+ def arch(self, value):
+ self._arch = value
+
+ @property
+ def source_function(self):
+ """ """
+ return self._source_function
+
+ @source_function.setter
+ def source_function(self, value):
+ self._source_function = value
+
class LowLevelILBasicBlock(basicblock.BasicBlock):
def __init__(self, view, handle, owner):
super(LowLevelILBasicBlock, self).__init__(handle, view)
- self.il_function = owner
+ self._il_function = owner
def __iter__(self):
for idx in range(self.start, self.end):
- yield self.il_function[idx]
+ yield self._il_function[idx]
def __getitem__(self, idx):
size = self.end - self.start
if idx > size or idx < -size:
raise IndexError("list index is out of range")
if idx >= 0:
- return self.il_function[idx + self.start]
+ return self._il_function[idx + self.start]
else:
- return self.il_function[self.end + idx]
+ return self._il_function[self.end + idx]
def _create_instance(self, handle, view):
"""Internal method by super to instantiate child instances"""
- return LowLevelILBasicBlock(view, handle, self.il_function)
+ return LowLevelILBasicBlock(view, handle, self._il_function)
def __hash__(self):
- return hash((self.start, self.end, self.il_function))
+ return hash((self.start, self.end, self._il_function))
+
+ @property
+ def il_function(self):
+ """ """
+ return self._il_function
+
+ @il_function.setter
+ def il_function(self, value):
+ self._il_function = value
def LLIL_TEMP(n):