summaryrefslogtreecommitdiff
path: root/python/basicblock.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/basicblock.py')
-rw-r--r--python/basicblock.py105
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)