diff options
Diffstat (limited to 'python/basicblock.py')
| -rw-r--r-- | python/basicblock.py | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/python/basicblock.py b/python/basicblock.py index 6c03fe32..a8dc85a8 100644 --- a/python/basicblock.py +++ b/python/basicblock.py @@ -23,6 +23,7 @@ from dataclasses import dataclass from typing import Generator, Optional, List, Tuple # Binary Ninja components +import binaryninja from . import _binaryninjacore as core from .enums import BranchType, HighlightStandardColor from . import binaryview @@ -88,6 +89,33 @@ class BasicBlock: if core is not None: core.BNFreeBasicBlock(self.handle) + @classmethod + def _from_core_block(cls, block: core.BNBasicBlockHandle) -> Optional['BasicBlock']: + """From a BNBasicBlockHandle, get a BasicBlock or one of the IL subclasses (takes ref)""" + func_handle = core.BNGetBasicBlockFunction(block) + if not func_handle: + core.BNFreeBasicBlock(block) + return None + + view = binaryview.BinaryView(handle=core.BNGetFunctionData(func_handle)) + func = _function.Function(view, func_handle) + + if core.BNIsLowLevelILBasicBlock(block): + return binaryninja.lowlevelil.LowLevelILBasicBlock( + block, binaryninja.lowlevelil.LowLevelILFunction(func.arch, core.BNGetBasicBlockLowLevelILFunction(block), func), + view + ) + elif core.BNIsMediumLevelILBasicBlock(block): + mlil_func = binaryninja.mediumlevelil.MediumLevelILFunction( + func.arch, core.BNGetBasicBlockMediumLevelILFunction(block), func + ) + return binaryninja.mediumlevelil.MediumLevelILBasicBlock(block, mlil_func, view) + elif core.BNIsHighLevelILBasicBlock(block): + hlil_func = binaryninja.highlevelil.HighLevelILFunction(func.arch, core.BNGetBasicBlockHighLevelILFunction(block), func) + return binaryninja.highlevelil.HighLevelILBasicBlock(block, hlil_func, view) + else: + return BasicBlock(block, view) + def __repr__(self): arch = self.arch if arch: @@ -211,6 +239,78 @@ class BasicBlock: return self._func @property + def il_function(self) -> Optional['_function.ILFunctionType']: + """IL Function of which this block is a part, if the block is part of an IL Function.""" + func = self.function + if func is None: + return None + il_type = self.function_graph_type + if il_type == _function.FunctionGraphType.NormalFunctionGraph: + return None + elif il_type == _function.FunctionGraphType.LowLevelILFunctionGraph: + return func.low_level_il + elif il_type == _function.FunctionGraphType.LiftedILFunctionGraph: + return func.lifted_il + elif il_type == _function.FunctionGraphType.LowLevelILSSAFormFunctionGraph: + return func.low_level_il.ssa_form + elif il_type == _function.FunctionGraphType.MediumLevelILFunctionGraph: + return func.medium_level_il + elif il_type == _function.FunctionGraphType.MediumLevelILSSAFormFunctionGraph: + return func.medium_level_il.ssa_form + elif il_type == _function.FunctionGraphType.MappedMediumLevelILFunctionGraph: + return func.mapped_medium_level_il + elif il_type == _function.FunctionGraphType.MappedMediumLevelILSSAFormFunctionGraph: + return func.mapped_medium_level_il.ssa_form + elif il_type == _function.FunctionGraphType.HighLevelILFunctionGraph: + return func.high_level_il + elif il_type == _function.FunctionGraphType.HighLevelILSSAFormFunctionGraph: + return func.high_level_il.ssa_form + elif il_type == _function.FunctionGraphType.HighLevelLanguageRepresentationFunctionGraph: + return func.high_level_il + else: + return None + + @property + def il_function_if_available(self) -> Optional['_function.ILFunctionType']: + """IL Function of which this block is a part, if the block is part of an IL Function, and if the function has generated IL already.""" + func = self.function + if func is None: + return None + il_type = self.function_graph_type + if il_type == _function.FunctionGraphType.NormalFunctionGraph: + return None + elif il_type == _function.FunctionGraphType.LowLevelILFunctionGraph: + return func.llil_if_available + elif il_type == _function.FunctionGraphType.LiftedILFunctionGraph: + return func.lifted_il_if_available + elif il_type == _function.FunctionGraphType.LowLevelILSSAFormFunctionGraph: + if func.llil_if_available is None: + return None + return func.llil_if_available.ssa_form + elif il_type == _function.FunctionGraphType.MediumLevelILFunctionGraph: + return func.mlil_if_available + elif il_type == _function.FunctionGraphType.MediumLevelILSSAFormFunctionGraph: + if func.mlil_if_available is None: + return None + return func.mlil_if_available.ssa_form + elif il_type == _function.FunctionGraphType.MappedMediumLevelILFunctionGraph: + return func.mmlil_if_available + elif il_type == _function.FunctionGraphType.MappedMediumLevelILSSAFormFunctionGraph: + if func.mmlil_if_available is None: + return None + return func.mmlil_if_available.ssa_form + elif il_type == _function.FunctionGraphType.HighLevelILFunctionGraph: + return func.hlil_if_available + elif il_type == _function.FunctionGraphType.HighLevelILSSAFormFunctionGraph: + if func.hlil_if_available is None: + return None + return func.hlil_if_available.ssa_form + elif il_type == _function.FunctionGraphType.HighLevelLanguageRepresentationFunctionGraph: + return func.hlil_if_available + else: + return None + + @property def view(self) -> Optional['binaryview.BinaryView']: """BinaryView that contains the basic block (read-only)""" if self._view is not None: @@ -426,6 +526,11 @@ class BasicBlock: self.set_user_highlight(value) @property + def function_graph_type(self) -> '_function.FunctionGraphType': + """Type of function graph from which this block represents instructions""" + return _function.FunctionGraphType(core.BNGetBasicBlockFunctionGraphType(self.handle)) + + @property def is_il(self) -> bool: """Whether the basic block contains IL""" return core.BNIsILBasicBlock(self.handle) |
