diff options
| author | KyleMiles <krm504@nyu.edu> | 2022-01-27 22:43:28 -0500 |
|---|---|---|
| committer | KyleMiles <krm504@nyu.edu> | 2022-01-28 00:24:06 -0500 |
| commit | 6812c973c9fa9b4ad642ab81856c05f87bd6fcc4 (patch) | |
| tree | dace4156d03148bcaf02df138ab4e0d93e61bc6f /python/types.py | |
| parent | 519c9db22367f2659d1a54599fab47e6313be06e (diff) | |
Format All Files
Diffstat (limited to 'python/types.py')
| -rw-r--r-- | python/types.py | 900 |
1 files changed, 532 insertions, 368 deletions
diff --git a/python/types.py b/python/types.py index 944f03d0..e4392434 100644 --- a/python/types.py +++ b/python/types.py @@ -26,8 +26,10 @@ from abc import abstractmethod # Binary Ninja components from . import _binaryninjacore as core -from .enums import (StructureVariant, SymbolType, SymbolBinding, TypeClass, - NamedTypeReferenceClass, ReferenceType, VariableSourceType, TypeReferenceType, MemberAccess, MemberScope) +from .enums import ( + StructureVariant, SymbolType, SymbolBinding, TypeClass, NamedTypeReferenceClass, ReferenceType, VariableSourceType, + TypeReferenceType, MemberAccess, MemberScope +) from . import callingconvention from . import function as _function from . import variable @@ -41,7 +43,7 @@ BoolWithConfidenceType = Union[bool, 'BoolWithConfidence'] OffsetWithConfidenceType = Union[int, 'OffsetWithConfidence'] ParamsType = Union[List['Type'], List['FunctionParameter'], List[Tuple['Type', str]]] MembersType = Union[List['StructureMember'], List['Type'], List[Tuple['Type', str]]] -EnumMembersType = Union[List[Tuple[str,int]], List[str], List['EnumerationMember']] +EnumMembersType = Union[List[Tuple[str, int]], List[str], List['EnumerationMember']] SomeType = Union['TypeBuilder', 'Type'] TypeContainer = Union['binaryview.BinaryView', 'typelibrary.TypeLibrary'] NameSpaceType = Optional[Union[str, List[str], 'NameSpace']] @@ -53,9 +55,10 @@ MemberName = str MemberIndex = int MemberOffset = int + class QualifiedName: - def __init__(self, name:Optional[QualifiedNameType]=None): - self._name:List[str] = [] + def __init__(self, name: Optional[QualifiedNameType] = None): + self._name: List[str] = [] if isinstance(name, str): self._name = [name] elif isinstance(name, bytes): @@ -146,15 +149,15 @@ class QualifiedName: return self._name @name.setter - def name(self, value:List[str]) -> None: + def name(self, value: List[str]) -> None: self._name = value @dataclass(frozen=True) class TypeReferenceSource: - name:QualifiedName - offset:int - ref_type:TypeReferenceType + name: QualifiedName + offset: int + ref_type: TypeReferenceType def __repr__(self): if self.ref_type == TypeReferenceType.DirectTypeReferenceType: @@ -180,14 +183,14 @@ class NameSpace(QualifiedName): return result @staticmethod - def _from_core_struct(name:core.BNNameSpace) -> 'NameSpace': + def _from_core_struct(name: core.BNNameSpace) -> 'NameSpace': result = [] for i in range(0, name.nameCount): result.append(name.name[i].decode("utf-8")) return NameSpace(result) @staticmethod - def get_core_struct(name:Optional[Union[str, List[str], 'NameSpace']]) -> Optional[core.BNNameSpace]: + def get_core_struct(name: Optional[Union[str, List[str], 'NameSpace']]) -> Optional[core.BNNameSpace]: if name is None: return None if isinstance(name, NameSpace): @@ -197,7 +200,7 @@ class NameSpace(QualifiedName): class CoreSymbol: - def __init__(self, handle:core.BNSymbolHandle): + def __init__(self, handle: core.BNSymbolHandle): self._handle = handle def __del__(self): @@ -307,7 +310,9 @@ class Symbol(CoreSymbol): LibraryFunctionSymbol Symbols for external functions outside the library =========================== ============================================================== """ - def __init__(self, sym_type, addr, short_name, full_name=None, raw_name=None, binding=None, namespace=None, ordinal=0): + def __init__( + self, sym_type, addr, short_name, full_name=None, raw_name=None, binding=None, namespace=None, ordinal=0 + ): if isinstance(sym_type, str): sym_type = SymbolType[sym_type] if full_name is None: @@ -324,9 +329,9 @@ class Symbol(CoreSymbol): @dataclass class FunctionParameter: - type:SomeType - name:str = "" - location:Optional['variable.VariableNameAndType'] = None + type: SomeType + name: str = "" + location: Optional['variable.VariableNameAndType'] = None def __repr__(self): if (self.location is not None) and (self.location.name != self.name): @@ -342,8 +347,8 @@ class FunctionParameter: @dataclass(frozen=True) class OffsetWithConfidence: - value:int - confidence:int=core.max_confidence + value: int + confidence: int = core.max_confidence def __int__(self): return self.value @@ -376,11 +381,11 @@ class OffsetWithConfidence: return result @classmethod - def from_core_struct(cls, core_struct:core.BNOffsetWithConfidence) -> 'OffsetWithConfidence': + def from_core_struct(cls, core_struct: core.BNOffsetWithConfidence) -> 'OffsetWithConfidence': return cls(core_struct.value, core_struct.confidence) @staticmethod - def get_core_struct(value:OffsetWithConfidenceType) -> core.BNOffsetWithConfidence: + def get_core_struct(value: OffsetWithConfidenceType) -> core.BNOffsetWithConfidence: if isinstance(value, OffsetWithConfidence): return value._to_core_struct() else: @@ -389,8 +394,8 @@ class OffsetWithConfidence: @dataclass(frozen=True) class BoolWithConfidence: - value:bool - confidence:int=core.max_confidence + value: bool + confidence: int = core.max_confidence def __eq__(self, other): if not isinstance(other, self.__class__): @@ -411,11 +416,11 @@ class BoolWithConfidence: return result @classmethod - def from_core_struct(cls, core_struct:core.BNBoolWithConfidence) -> 'BoolWithConfidence': + def from_core_struct(cls, core_struct: core.BNBoolWithConfidence) -> 'BoolWithConfidence': return cls(core_struct.value, core_struct.confidence) @staticmethod - def get_core_struct(value:BoolWithConfidenceType) -> core.BNBoolWithConfidence: + def get_core_struct(value: BoolWithConfidenceType) -> core.BNBoolWithConfidence: if isinstance(value, BoolWithConfidence): return value._to_core_struct() else: @@ -424,12 +429,12 @@ class BoolWithConfidence: @dataclass class MutableTypeBuilder: - type:'TypeBuilder' - container:TypeContainer - name:QualifiedName - platform:Optional['_platform.Platform'] - confidence:int - user:bool = True + type: 'TypeBuilder' + container: TypeContainer + name: QualifiedName + platform: Optional['_platform.Platform'] + confidence: int + user: bool = True def __enter__(self): return self.type @@ -446,7 +451,10 @@ class MutableTypeBuilder: class TypeBuilder: - def __init__(self, handle:core.BNTypeBuilderHandle, platform:'_platform.Platform'=None, confidence:int=core.max_confidence): + def __init__( + self, handle: core.BNTypeBuilderHandle, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ): assert isinstance(handle, core.BNTypeBuilderHandle), "handle isn't an instance of BNTypeBuilderHandle" self._handle = handle self.platform = platform @@ -456,12 +464,12 @@ class TypeBuilder: if core is not None: core.BNFreeTypeBuilder(self._handle) - def __eq__(self, other:'TypeBuilder') -> bool: + def __eq__(self, other: 'TypeBuilder') -> bool: if not isinstance(other, TypeBuilder): raise ValueError(f"Unable compare equality of TypeBuilder and {type(other)}") return self.immutable_copy() == other.immutable_copy() - def __ne__(self, other:'TypeBuilder') -> bool: + def __ne__(self, other: 'TypeBuilder') -> bool: return not self.__eq__(other) def __repr__(self): @@ -482,17 +490,13 @@ class TypeBuilder: def immutable_copy(self): Types = { - TypeClass.VoidTypeClass:VoidType, - TypeClass.BoolTypeClass:BoolType, - TypeClass.IntegerTypeClass:IntegerType, - TypeClass.FloatTypeClass:FloatType, - TypeClass.PointerTypeClass:PointerType, - TypeClass.ArrayTypeClass:ArrayType, - TypeClass.FunctionTypeClass:FunctionType, - TypeClass.WideCharTypeClass:WideCharType, - # TypeClass.StructureTypeClass:StructureType, - # TypeClass.EnumerationTypeClass:EnumerationType, - # TypeClass.NamedTypeReferenceClass:NamedTypeReferenceType, + TypeClass.VoidTypeClass: VoidType, TypeClass.BoolTypeClass: BoolType, + TypeClass.IntegerTypeClass: IntegerType, TypeClass.FloatTypeClass: FloatType, + TypeClass.PointerTypeClass: PointerType, TypeClass.ArrayTypeClass: ArrayType, + TypeClass.FunctionTypeClass: FunctionType, TypeClass.WideCharTypeClass: WideCharType, + # TypeClass.StructureTypeClass:StructureType, + # TypeClass.EnumerationTypeClass:EnumerationType, + # TypeClass.NamedTypeReferenceClass:NamedTypeReferenceType, } return Types[self.type_class](self.finalized, self.platform, self.confidence) @@ -505,8 +509,10 @@ class TypeBuilder: return NotImplemented @classmethod - def builder(cls, container:TypeContainer, name:'QualifiedName', user:bool=True, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'MutableTypeBuilder': + def builder( + cls, container: TypeContainer, name: 'QualifiedName', user: bool = True, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'MutableTypeBuilder': return MutableTypeBuilder(cls.create(), container, name, platform, confidence, user) @staticmethod @@ -518,11 +524,13 @@ class TypeBuilder: return BoolBuilder.create() @staticmethod - def char(alternate_name:str="") -> 'CharBuilder': + def char(alternate_name: str = "") -> 'CharBuilder': return CharBuilder.create(alternate_name) @staticmethod - def int(width:_int, sign:BoolWithConfidenceType=BoolWithConfidence(True), altname:str="") -> 'IntegerBuilder': + def int( + width: _int, sign: BoolWithConfidenceType = BoolWithConfidence(True), altname: str = "" + ) -> 'IntegerBuilder': """ ``int`` class method for creating an int Type. :param int width: width of the integer in bytes @@ -532,7 +540,7 @@ class TypeBuilder: return IntegerBuilder.create(width, sign, altname) @staticmethod - def float(width:_int, altname:str="") -> 'FloatBuilder': + def float(width: _int, altname: str = "") -> 'FloatBuilder': """ ``float`` class method for creating floating point Types. :param int width: width of the floating point number in bytes @@ -541,7 +549,7 @@ class TypeBuilder: return FloatBuilder.create(width, altname) @staticmethod - def wide_char(width:_int, altname:str="") -> 'WideCharBuilder': + def wide_char(width: _int, altname: str = "") -> 'WideCharBuilder': """ ``wide_char`` class method for creating wide char Types. :param int width: width of the wide character in bytes @@ -550,39 +558,50 @@ class TypeBuilder: return WideCharBuilder.create(width, altname) @staticmethod - def named_type_from_type(name:QualifiedName, type_class:Optional[NamedTypeReferenceClass]=None) -> 'NamedTypeReferenceBuilder': + def named_type_from_type( + name: QualifiedName, type_class: Optional[NamedTypeReferenceClass] = None + ) -> 'NamedTypeReferenceBuilder': return NamedTypeReferenceBuilder.named_type_from_type(name, type_class) @staticmethod - def named_type_from_type_and_id(type_id:str, name:QualifiedName, type:Optional['Type']=None) -> 'NamedTypeReferenceBuilder': + def named_type_from_type_and_id( + type_id: str, name: QualifiedName, type: Optional['Type'] = None + ) -> 'NamedTypeReferenceBuilder': return NamedTypeReferenceBuilder.named_type_from_type_and_id(type_id, name, type) @staticmethod - def named_type_from_registered_type(view:'binaryview.BinaryView', name:QualifiedName) -> 'NamedTypeReferenceBuilder': + def named_type_from_registered_type( + view: 'binaryview.BinaryView', name: QualifiedName + ) -> 'NamedTypeReferenceBuilder': return NamedTypeReferenceBuilder.named_type_from_registered_type(view, name) @staticmethod - def pointer(arch:'architecture.Architecture', type:'Type', - const:BoolWithConfidenceType=BoolWithConfidence(False), - volatile:BoolWithConfidenceType=BoolWithConfidence(False), - ref_type:ReferenceType=ReferenceType.PointerReferenceType) -> 'PointerBuilder': + def pointer( + arch: 'architecture.Architecture', type: 'Type', const: BoolWithConfidenceType = BoolWithConfidence(False), + volatile: BoolWithConfidenceType = BoolWithConfidence(False), + ref_type: ReferenceType = ReferenceType.PointerReferenceType + ) -> 'PointerBuilder': return PointerBuilder.create(type, arch.address_size, arch, const, volatile, ref_type) @staticmethod - def pointer_of_width(width:_int, type:'Type', - const:BoolWithConfidenceType=BoolWithConfidence(False), - volatile:BoolWithConfidenceType=BoolWithConfidence(False), - ref_type:ReferenceType=ReferenceType.PointerReferenceType) -> 'PointerBuilder': + def pointer_of_width( + width: _int, type: 'Type', const: BoolWithConfidenceType = BoolWithConfidence(False), + volatile: BoolWithConfidenceType = BoolWithConfidence(False), + ref_type: ReferenceType = ReferenceType.PointerReferenceType + ) -> 'PointerBuilder': return PointerBuilder.create(type, width, None, const, volatile, ref_type) @staticmethod - def array(type:'Type', count:_int) -> 'ArrayBuilder': + def array(type: 'Type', count: _int) -> 'ArrayBuilder': return ArrayBuilder.create(type, count) @staticmethod - def function(ret:Optional['Type']=None, params:Optional[ParamsType]=None, calling_convention:'callingconvention.CallingConvention'=None, - variable_arguments:BoolWithConfidenceType=BoolWithConfidence(False), - stack_adjust:OffsetWithConfidenceType=0) -> 'FunctionBuilder': + def function( + ret: Optional['Type'] = None, params: Optional[ParamsType] = None, + calling_convention: 'callingconvention.CallingConvention' = None, + variable_arguments: BoolWithConfidenceType = BoolWithConfidence(False), + stack_adjust: OffsetWithConfidenceType = 0 + ) -> 'FunctionBuilder': """ ``function`` class method for creating an function Type. :param Type ret: return Type of the function @@ -594,29 +613,36 @@ class TypeBuilder: return FunctionBuilder.create(ret, calling_convention, params, variable_arguments, stack_adjust) @staticmethod - def structure(members:Optional[MembersType]=None, packed:_bool=False, type:StructureVariant=StructureVariant.StructStructureType) -> 'StructureBuilder': + def structure( + members: Optional[MembersType] = None, packed: _bool = False, + type: StructureVariant = StructureVariant.StructStructureType + ) -> 'StructureBuilder': return StructureBuilder.create(members, type=type, packed=packed) - + @staticmethod - def union(members:Optional[MembersType]=None, packed:_bool=False) -> 'StructureBuilder': + def union(members: Optional[MembersType] = None, packed: _bool = False) -> 'StructureBuilder': return StructureBuilder.create(members, type=StructureVariant.UnionStructureType, packed=packed) - + @staticmethod - def class_type(members:Optional[MembersType]=None, packed:_bool=False) -> 'StructureBuilder': + def class_type(members: Optional[MembersType] = None, packed: _bool = False) -> 'StructureBuilder': return StructureBuilder.create(members, type=StructureVariant.ClassStructureType, packed=packed) @staticmethod - def enumeration(arch:Optional['architecture.Architecture']=None, members:Optional[List[EnumMembersType]]=None, - width:Optional[_int]=None, sign:BoolWithConfidenceType=BoolWithConfidence(False)) -> 'EnumerationBuilder': + def enumeration( + arch: Optional['architecture.Architecture'] = None, members: Optional[List[EnumMembersType]] = None, + width: Optional[_int] = None, sign: BoolWithConfidenceType = BoolWithConfidence(False) + ) -> 'EnumerationBuilder': return EnumerationBuilder.create(members, width, arch, sign) @staticmethod - def named_type_reference(type_class:NamedTypeReferenceClass, name:QualifiedName, - type_id:Optional[str]=None, alignment:_int=1, width:_int=0, - const:BoolWithConfidenceType=BoolWithConfidence(False), - volatile:BoolWithConfidenceType=BoolWithConfidence(False)) -> 'NamedTypeReferenceBuilder': - return NamedTypeReferenceBuilder.create(type_class, type_id, name, width, alignment, - None, core.max_confidence, const, volatile) + def named_type_reference( + type_class: NamedTypeReferenceClass, name: QualifiedName, type_id: Optional[str] = None, alignment: _int = 1, + width: _int = 0, const: BoolWithConfidenceType = BoolWithConfidence(False), + volatile: BoolWithConfidenceType = BoolWithConfidence(False) + ) -> 'NamedTypeReferenceBuilder': + return NamedTypeReferenceBuilder.create( + type_class, type_id, name, width, alignment, None, core.max_confidence, const, volatile + ) @property def width(self) -> _int: @@ -637,20 +663,24 @@ class TypeBuilder: def const(self) -> BoolWithConfidence: """Whether type is const (read/write)""" result = core.BNIsTypeBuilderConst(self._handle) - return BoolWithConfidence(result.value, confidence = result.confidence) + return BoolWithConfidence(result.value, confidence=result.confidence) @const.setter - def const(self, value:BoolWithConfidenceType) -> None: # type: ignore # We explicitly allow 'set' type to be different than 'get' type + def const( + self, value: BoolWithConfidenceType + ) -> None: # type: ignore # We explicitly allow 'set' type to be different than 'get' type core.BNTypeBuilderSetConst(self._handle, BoolWithConfidence.get_core_struct(value)) @property def volatile(self) -> BoolWithConfidence: """Whether type is volatile (read/write)""" result = core.BNIsTypeBuilderVolatile(self._handle) - return BoolWithConfidence(result.value, confidence = result.confidence) + return BoolWithConfidence(result.value, confidence=result.confidence) @volatile.setter - def volatile(self, value:BoolWithConfidenceType) -> None: # type: ignore # We explicitly allow 'set' type to be different than 'get' type + def volatile( + self, value: BoolWithConfidenceType + ) -> None: # type: ignore # We explicitly allow 'set' type to be different than 'get' type core.BNTypeBuilderSetVolatile(self._handle, BoolWithConfidence.get_core_struct(value)) @property @@ -666,7 +696,7 @@ class TypeBuilder: return Type.create(handle, self.platform, type_conf.confidence) @child.setter - def child(self, value:SomeType) -> None: # type: ignore + def child(self, value: SomeType) -> None: # type: ignore core.BNTypeBuilderSetChildType(self._handle, value.immutable_copy()._to_core_struct()) @property @@ -674,7 +704,7 @@ class TypeBuilder: return core.BNGetTypeBuilderAlternateName(self._handle) @alternate_name.setter - def alternate_name(self, name:str) -> None: + def alternate_name(self, name: str) -> None: core.BNTypeBuilderSetAlternateName(self._handle, name) @property @@ -685,7 +715,7 @@ class TypeBuilder: return core.BNTypeBuilderGetSystemCallNumber(self._handle) @system_call_number.setter - def system_call_number(self, value:int) -> None: + def system_call_number(self, value: int) -> None: core.BNTypeBuilderSetSystemCallNumber(self._handle, True, value) def clear_system_call(self) -> None: @@ -700,13 +730,14 @@ class TypeBuilder: return BoolWithConfidence.from_core_struct(core.BNIsTypeBuilderSigned(self._handle)) @signed.setter - def signed(self, value:BoolWithConfidenceType) -> None: # type: ignore + def signed(self, value: BoolWithConfidenceType) -> None: # type: ignore _value = BoolWithConfidence.get_core_struct(value) core.BNTypeBuilderSetSigned(self._handle, _value) + class VoidBuilder(TypeBuilder): @classmethod - def create(cls, platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'VoidBuilder': + def create(cls, platform: '_platform.Platform' = None, confidence: int = core.max_confidence) -> 'VoidBuilder': handle = core.BNCreateVoidTypeBuilder() assert handle is not None, "core.BNCreateVoidTypeBuilder returned None" return cls(handle, platform, confidence) @@ -714,7 +745,7 @@ class VoidBuilder(TypeBuilder): class BoolBuilder(TypeBuilder): @classmethod - def create(cls, platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'BoolBuilder': + def create(cls, platform: '_platform.Platform' = None, confidence: int = core.max_confidence) -> 'BoolBuilder': handle = core.BNCreateBoolTypeBuilder() assert handle is not None, "core.BNCreateBoolTypeBuilder returned None" return cls(handle, platform, confidence) @@ -722,8 +753,10 @@ class BoolBuilder(TypeBuilder): class IntegerBuilder(TypeBuilder): @classmethod - def create(cls, width:int, sign:BoolWithConfidenceType=True, alternate_name:str="", - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'IntegerBuilder': + def create( + cls, width: int, sign: BoolWithConfidenceType = True, alternate_name: str = "", + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'IntegerBuilder': _sign = BoolWithConfidence.get_core_struct(sign) handle = core.BNCreateIntegerTypeBuilder(width, _sign, alternate_name) assert handle is not None, "core.BNCreateIntegerTypeBuilder returned None" @@ -732,8 +765,9 @@ class IntegerBuilder(TypeBuilder): class CharBuilder(IntegerBuilder): @classmethod - def create(cls, alternate_name:str="", - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'CharBuilder': + def create( + cls, alternate_name: str = "", platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'CharBuilder': handle = core.BNCreateIntegerTypeBuilder(1, BoolWithConfidence.get_core_struct(False), alternate_name) assert handle is not None, "BNCreateIntegerTypeBuilder returned None" return cls(handle, platform, confidence) @@ -741,8 +775,10 @@ class CharBuilder(IntegerBuilder): class FloatBuilder(TypeBuilder): @classmethod - def create(cls, width:int, alternate_name:str="", - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'FloatBuilder': + def create( + cls, width: int, alternate_name: str = "", platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'FloatBuilder': handle = core.BNCreateFloatTypeBuilder(width, alternate_name) assert handle is not None, "core.BNCreateFloatTypeBuilder returned None" return cls(handle, platform, confidence) @@ -750,8 +786,10 @@ class FloatBuilder(TypeBuilder): class WideCharBuilder(TypeBuilder): @classmethod - def create(cls, width:int, alternate_name:str="", - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'WideCharBuilder': + def create( + cls, width: int, alternate_name: str = "", platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'WideCharBuilder': handle = core.BNCreateWideCharTypeBuilder(width, alternate_name) assert handle is not None, "core.BNCreateWideCharTypeBuilder returned None" return cls(handle, platform, confidence) @@ -759,10 +797,12 @@ class WideCharBuilder(TypeBuilder): class PointerBuilder(TypeBuilder): @classmethod - def create(cls, type:'Type', width:int=4, arch:Optional['architecture.Architecture']=None, - const:BoolWithConfidenceType=False, volatile:BoolWithConfidenceType=False, - ref_type:ReferenceType=ReferenceType.PointerReferenceType, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'PointerBuilder': + def create( + cls, type: 'Type', width: int = 4, arch: Optional['architecture.Architecture'] = None, + const: BoolWithConfidenceType = False, volatile: BoolWithConfidenceType = False, + ref_type: ReferenceType = ReferenceType.PointerReferenceType, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'PointerBuilder': assert width is not None or arch is not None, "Must specify either a width or architecture when creating a pointer" _width = width if arch is not None: @@ -770,8 +810,7 @@ class PointerBuilder(TypeBuilder): _const = BoolWithConfidence.get_core_struct(const) _volatile = BoolWithConfidence.get_core_struct(volatile) - handle = core.BNCreatePointerTypeBuilderOfWidth(_width, type._to_core_struct(), _const, - _volatile, ref_type) + handle = core.BNCreatePointerTypeBuilderOfWidth(_width, type._to_core_struct(), _const, _volatile, ref_type) assert handle is not None, "BNCreatePointerTypeBuilderOfWidth returned None" return cls(handle, platform, confidence) @@ -786,8 +825,10 @@ class PointerBuilder(TypeBuilder): class ArrayBuilder(TypeBuilder): @classmethod - def create(cls, type:SomeType, element_count:int, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'ArrayBuilder': + def create( + cls, type: SomeType, element_count: int, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'ArrayBuilder': handle = core.BNCreateArrayTypeBuilder(type._to_core_struct(), element_count) assert handle is not None, "BNCreateArrayTypeBuilder returned None" return cls(handle, platform, confidence) @@ -803,10 +844,12 @@ class ArrayBuilder(TypeBuilder): class FunctionBuilder(TypeBuilder): @classmethod - def create(cls, return_type:Optional[SomeType]=None, calling_convention:Optional['callingconvention.CallingConvention']=None, - params:Optional[ParamsType]=None, var_args:BoolWithConfidenceType=False, - stack_adjust:OffsetWithConfidenceType=0, platform:'_platform.Platform'=None, - confidence:int=core.max_confidence) -> 'FunctionBuilder': + def create( + cls, return_type: Optional[SomeType] = None, + calling_convention: Optional['callingconvention.CallingConvention'] = None, params: Optional[ParamsType] = None, + var_args: BoolWithConfidenceType = False, stack_adjust: OffsetWithConfidenceType = 0, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'FunctionBuilder': param_buf = FunctionBuilder._to_core_struct(params) if return_type is None: ret_conf = Type.void()._to_core_struct() @@ -825,8 +868,9 @@ class FunctionBuilder(TypeBuilder): stack_adjust_conf = OffsetWithConfidence.get_core_struct(stack_adjust) if params is None: params = [] - handle = core.BNCreateFunctionTypeBuilder(ret_conf, conv_conf, param_buf, len(params), - vararg_conf, stack_adjust_conf) + handle = core.BNCreateFunctionTypeBuilder( + ret_conf, conv_conf, param_buf, len(params), vararg_conf, stack_adjust_conf + ) assert handle is not None, "BNCreateFunctionTypeBuilder returned None" return cls(handle, platform, confidence) @@ -839,10 +883,10 @@ class FunctionBuilder(TypeBuilder): return self.child.mutable_copy() @return_value.setter - def return_value(self, value:SomeType) -> None: # type: ignore + def return_value(self, value: SomeType) -> None: # type: ignore self.child = value - def append(self, type:Union[SomeType, FunctionParameter], name:str=""): + def append(self, type: Union[SomeType, FunctionParameter], name: str = ""): if isinstance(type, FunctionParameter): self.parameters = [*self.parameters, type] else: @@ -858,7 +902,7 @@ class FunctionBuilder(TypeBuilder): return BoolWithConfidence.from_core_struct(core.BNFunctionTypeBuilderCanReturn(self._handle)) @can_return.setter - def can_return(self, value:BoolWithConfidenceType) -> None: # type: ignore + def can_return(self, value: BoolWithConfidenceType) -> None: # type: ignore core.BNSetFunctionTypeBuilderCanReturn(self._handle, BoolWithConfidence.get_core_struct(value)) @property @@ -873,17 +917,21 @@ class FunctionBuilder(TypeBuilder): assert params is not None, "core.BNGetTypeBuilderParameters returned None" result = [] for i in range(0, count.value): - param_type = Type.create(core.BNNewTypeReference(params[i].type), platform = self.platform, confidence = params[i].typeConfidence) + param_type = Type.create( + core.BNNewTypeReference(params[i].type), platform=self.platform, confidence=params[i].typeConfidence + ) if params[i].defaultLocation: param_location = None else: name = params[i].name - if (params[i].location.type == VariableSourceType.RegisterVariableSourceType) and (self.platform is not None): + if (params[i].location.type + == VariableSourceType.RegisterVariableSourceType) and (self.platform is not None): name = self.platform.arch.get_reg_name(params[i].location.storage) elif params[i].location.type == VariableSourceType.StackVariableSourceType: name = "arg_%x" % params[i].location.storage - param_location = variable.VariableNameAndType(params[i].location.type, params[i].location.index, - params[i].location.storage, name, param_type) + param_location = variable.VariableNameAndType( + params[i].location.type, params[i].location.index, params[i].location.storage, name, param_type + ) result.append(FunctionParameter(param_type, params[i].name, param_location)) core.BNFreeTypeParameterList(params, count.value) return result @@ -893,7 +941,7 @@ class FunctionBuilder(TypeBuilder): return BoolWithConfidence.from_core_struct(core.BNTypeBuilderHasVariableArguments(self._handle)) @staticmethod - def _to_core_struct(params:Optional[ParamsType]=None): + def _to_core_struct(params: Optional[ParamsType] = None): if params is None: params = [] param_buf = (core.BNFunctionParameter * len(params))() @@ -920,7 +968,9 @@ class FunctionBuilder(TypeBuilder): elif isinstance(param, tuple): name, _type = param assert isinstance(name, str), f"Conversion from unsupported function parameter type {type(param)}" - assert isinstance(_type, (Type, TypeBuilder)), f"Conversion from unsupported function parameter type {type(param)}" + assert isinstance( + _type, (Type, TypeBuilder) + ), f"Conversion from unsupported function parameter type {type(param)}" core_param.name = name core_param.type = _type.handle core_param.typeConfidence = _type.confidence @@ -930,31 +980,32 @@ class FunctionBuilder(TypeBuilder): return param_buf @parameters.setter - def parameters(self, params:List[FunctionParameter]) -> None: + def parameters(self, params: List[FunctionParameter]) -> None: core.BNSetFunctionTypeBuilderParameters(self._handle, FunctionBuilder._to_core_struct(params), len(params)) @dataclass class StructureMember: - type:'Type' - name:str - offset:int - access:MemberAccess = MemberAccess.NoAccess - scope:MemberScope = MemberScope.NoScope + type: 'Type' + name: str + offset: int + access: MemberAccess = MemberAccess.NoAccess + scope: MemberScope = MemberScope.NoScope def __repr__(self): if len(self.name) == 0: return f"<member: {self.type}, offset {self.offset:#x}>" - return f"<{self.type.get_string_before_name()} {self.name}{self.type.get_string_after_name()}" + \ - f", offset {self.offset:#x}>" + return f"<{self.type.get_string_before_name()} {self.name}{self.type.get_string_after_name()}, offset {self.offset:#x}>" def __len__(self): return len(self.type) class StructureBuilder(TypeBuilder): - def __init__(self, handle:core.BNTypeBuilderHandle, builder_handle:core.BNStructureBuilderHandle, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence): + def __init__( + self, handle: core.BNTypeBuilderHandle, builder_handle: core.BNStructureBuilderHandle, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ): super(StructureBuilder, self).__init__(handle, platform, confidence) assert builder_handle is not None, "Can't instantiate Structure with builder_handle set to None" self.builder_handle = builder_handle @@ -966,12 +1017,18 @@ class StructureBuilder(TypeBuilder): for member in members: if isinstance(member, Tuple): _type, _name = member - core.BNAddStructureBuilderMember(structure_builder_handle, _type._to_core_struct(), _name, MemberAccess.NoAccess, MemberScope.NoScope) + core.BNAddStructureBuilderMember( + structure_builder_handle, _type._to_core_struct(), _name, MemberAccess.NoAccess, MemberScope.NoScope + ) elif isinstance(member, StructureMember): - core.BNAddStructureBuilderMemberAtOffset(structure_builder_handle, member.type._to_core_struct(), - member.name, member.offset, False, member.access, member.scope) + core.BNAddStructureBuilderMemberAtOffset( + structure_builder_handle, member.type._to_core_struct(), member.name, member.offset, False, + member.access, member.scope + ) elif isinstance(member, (TypeBuilder, Type)): - core.BNAddStructureBuilderMember(structure_builder_handle, member._to_core_struct(), "", MemberAccess.NoAccess, MemberScope.NoScope) + core.BNAddStructureBuilderMember( + structure_builder_handle, member._to_core_struct(), "", MemberAccess.NoAccess, MemberScope.NoScope + ) else: raise ValueError(f"Structure member type {member} not supported") @@ -979,11 +1036,11 @@ class StructureBuilder(TypeBuilder): StructureBuilder._add_members_to_builder(self.builder_handle, members) @classmethod - def create(cls, members:MembersType=None, - type:StructureVariant=StructureVariant.StructStructureType, - packed:bool=False, - width:Optional[int]=None, platform:'_platform.Platform'=None, - confidence:int=core.max_confidence) -> 'StructureBuilder': + def create( + cls, members: MembersType = None, type: StructureVariant = StructureVariant.StructStructureType, + packed: bool = False, width: Optional[int] = None, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'StructureBuilder': structure_builder_handle = core.BNCreateStructureBuilderWithOptions(type, packed) assert structure_builder_handle is not None, "core.BNCreateStructureBuilderWithOptions returned None" if width is not None: @@ -1011,14 +1068,18 @@ class StructureBuilder(TypeBuilder): result = [] for i in range(0, count.value): t = Type.create(core.BNNewTypeReference(members[i].type), confidence=members[i].typeConfidence) - result.append(StructureMember(t, members[i].name, members[i].offset, - MemberAccess(members[i].access), MemberScope(members[i].scope))) + result.append( + StructureMember( + t, members[i].name, members[i].offset, MemberAccess(members[i].access), + MemberScope(members[i].scope) + ) + ) return result finally: core.BNFreeStructureMemberList(members, count.value) @members.setter - def members(self, members:MembersType=None) -> None: + def members(self, members: MembersType = None) -> None: count = len(self.members) # remove members in reverse order for i in reversed(range(count)): @@ -1030,7 +1091,7 @@ class StructureBuilder(TypeBuilder): return core.BNIsStructureBuilderPacked(self.builder_handle) @packed.setter - def packed(self, value:bool) -> None: + def packed(self, value: bool) -> None: core.BNSetStructureBuilderPacked(self.builder_handle, value) @property @@ -1038,7 +1099,7 @@ class StructureBuilder(TypeBuilder): return core.BNGetStructureBuilderAlignment(self.builder_handle) @alignment.setter - def alignment(self, value:int) -> None: + def alignment(self, value: int) -> None: core.BNSetStructureBuilderAlignment(self.builder_handle, value) @property @@ -1046,7 +1107,7 @@ class StructureBuilder(TypeBuilder): return core.BNGetStructureBuilderWidth(self.builder_handle) @width.setter - def width(self, value:int) -> None: + def width(self, value: int) -> None: core.BNSetStructureBuilderWidth(self.builder_handle, value) @property @@ -1058,17 +1119,19 @@ class StructureBuilder(TypeBuilder): return StructureVariant(core.BNGetStructureBuilderType(self.builder_handle)) @type.setter - def type(self, value:StructureVariant) -> None: + def type(self, value: StructureVariant) -> None: core.BNSetStructureBuilderType(self.builder_handle, value) - def __getitem__(self, name:str) -> Optional[StructureMember]: + def __getitem__(self, name: str) -> Optional[StructureMember]: member = core.BNGetStructureBuilderMemberByName(self.builder_handle, name) if member is None: return None try: - return StructureMember(Type(core.BNNewTypeReference(member.contents.type), - confidence=member.contents.typeConfidence), member.contents.name, member.contents.offset, - MemberAccess(member.contents.access), MemberScope(member.contents.scope)) + return StructureMember( + Type(core.BNNewTypeReference(member.contents.type), confidence=member.contents.typeConfidence), + member.contents.name, member.contents.offset, MemberAccess(member.contents.access), + MemberScope(member.contents.scope) + ) finally: core.BNFreeStructureMember(member) @@ -1079,55 +1142,63 @@ class StructureBuilder(TypeBuilder): def __len__(self) -> int: return self.width - def member_at_offset(self, offset:int) -> Optional[StructureMember]: + def member_at_offset(self, offset: int) -> Optional[StructureMember]: for member in self.members: if member.offset == offset: return member return None - def index_by_name(self, name:MemberName) -> Optional[MemberIndex]: + def index_by_name(self, name: MemberName) -> Optional[MemberIndex]: for i, member in enumerate(self.members): if member.name == name: return i return None - def index_by_offset(self, offset:MemberOffset) -> Optional[MemberIndex]: + def index_by_offset(self, offset: MemberOffset) -> Optional[MemberIndex]: for i, member in enumerate(self.members): if member.offset == offset: return i return None - def replace(self, index:int, type:SomeType, name:str="", overwrite_existing:bool=True): - core.BNReplaceStructureBuilderMember(self.builder_handle, index, - type._to_core_struct(), name, overwrite_existing) + def replace(self, index: int, type: SomeType, name: str = "", overwrite_existing: bool = True): + core.BNReplaceStructureBuilderMember( + self.builder_handle, index, type._to_core_struct(), name, overwrite_existing + ) - def remove(self, index:int): + def remove(self, index: int): core.BNRemoveStructureBuilderMember(self.builder_handle, index) - def insert(self, offset:int, type:SomeType, name:str="", overwrite_existing:bool=True, - access:MemberAccess=MemberAccess.NoAccess, scope:MemberScope=MemberScope.NoScope): - core.BNAddStructureBuilderMemberAtOffset(self.builder_handle, - type._to_core_struct(), name, offset, overwrite_existing, access, scope) + def insert( + self, offset: int, type: SomeType, name: str = "", overwrite_existing: bool = True, + access: MemberAccess = MemberAccess.NoAccess, scope: MemberScope = MemberScope.NoScope + ): + core.BNAddStructureBuilderMemberAtOffset( + self.builder_handle, type._to_core_struct(), name, offset, overwrite_existing, access, scope + ) - def append(self, type:SomeType, name:MemberName="", access:MemberAccess=MemberAccess.NoAccess, - scope:MemberScope=MemberScope.NoScope) -> 'StructureBuilder': + def append( + self, type: SomeType, name: MemberName = "", access: MemberAccess = MemberAccess.NoAccess, + scope: MemberScope = MemberScope.NoScope + ) -> 'StructureBuilder': # appends a member at the end of the structure growing the structure - core.BNAddStructureBuilderMember(self.builder_handle, - type._to_core_struct(), name, access, scope) + core.BNAddStructureBuilderMember(self.builder_handle, type._to_core_struct(), name, access, scope) return self - def add_member_at_offset(self, name:MemberName, type:SomeType, offset:MemberOffset, overwrite_existing:bool=True, - access:MemberAccess=MemberAccess.NoAccess, scope:MemberScope=MemberScope.NoScope) -> 'StructureBuilder': + def add_member_at_offset( + self, name: MemberName, type: SomeType, offset: MemberOffset, overwrite_existing: bool = True, + access: MemberAccess = MemberAccess.NoAccess, scope: MemberScope = MemberScope.NoScope + ) -> 'StructureBuilder': # Adds structure member to the given offset optionally clearing any members within the range offset-offset+len(type) - core.BNAddStructureBuilderMemberAtOffset(self.builder_handle, type._to_core_struct(), name, - offset, overwrite_existing, access, scope) + core.BNAddStructureBuilderMemberAtOffset( + self.builder_handle, type._to_core_struct(), name, offset, overwrite_existing, access, scope + ) return self @dataclass(frozen=True) class EnumerationMember: - name:str - value:Optional[int] = None + name: str + value: Optional[int] = None def __repr__(self): value = f"{self.value:#x}" if self.value is not None else "auto()" @@ -1138,16 +1209,20 @@ class EnumerationMember: class EnumerationBuilder(TypeBuilder): - def __init__(self, handle:core.BNTypeBuilderHandle, enum_builder_handle:core.BNEnumerationBuilderHandle, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence): + def __init__( + self, handle: core.BNTypeBuilderHandle, enum_builder_handle: core.BNEnumerationBuilderHandle, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ): super(EnumerationBuilder, self).__init__(handle, platform, confidence) assert isinstance(enum_builder_handle, core.BNEnumerationBuilderHandle) self.enum_builder_handle = enum_builder_handle @classmethod - def create(cls, members:Optional[List[EnumMembersType]]=None, width:Optional[int]=None, - arch:Optional['architecture.Architecture']=None, sign:BoolWithConfidenceType=False, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'EnumerationBuilder': + def create( + cls, members: Optional[List[EnumMembersType]] = None, width: Optional[int] = None, + arch: Optional['architecture.Architecture'] = None, sign: BoolWithConfidenceType = False, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'EnumerationBuilder': if members is None: members = [] @@ -1182,19 +1257,21 @@ class EnumerationBuilder(TypeBuilder): result = [] try: for i in range(count.value): - result.append(EnumerationMember(members[i].name, members[i].value if not members[i].isDefault else None)) + result.append( + EnumerationMember(members[i].name, members[i].value if not members[i].isDefault else None) + ) return result finally: core.BNFreeEnumerationMemberList(members, count.value) @members.setter - def members(self, members:List[EnumMembersType]) -> None: # type: ignore + def members(self, members: List[EnumMembersType]) -> None: # type: ignore for i in reversed(range(len(self.members))): self.remove(i) EnumerationBuilder._add_members(self.enum_builder_handle, members) @staticmethod - def _add_members(enum_builder_handle, members:List[EnumMembersType]): + def _add_members(enum_builder_handle, members: List[EnumMembersType]): for i, member in enumerate(members): value = None if isinstance(member, Tuple): @@ -1210,16 +1287,15 @@ class EnumerationBuilder(TypeBuilder): else: core.BNAddEnumerationBuilderMemberWithValue(enum_builder_handle, name, value) - - def append(self, name:str, value:Optional[int]=None) -> 'EnumerationBuilder': + def append(self, name: str, value: Optional[int] = None) -> 'EnumerationBuilder': EnumerationBuilder._add_members(self.enum_builder_handle, [EnumerationMember(name, value)]) return self - def remove(self, i:int) -> 'EnumerationBuilder': + def remove(self, i: int) -> 'EnumerationBuilder': core.BNRemoveEnumerationBuilderMember(self.enum_builder_handle, i) return self - def replace(self, i:int, name:str, value:Optional[int]=None) -> 'EnumerationBuilder': + def replace(self, i: int, name: str, value: Optional[int] = None) -> 'EnumerationBuilder': core.BNReplaceEnumerationBuilderMember(self.enum_builder_handle, i, name, value) return self @@ -1227,7 +1303,7 @@ class EnumerationBuilder(TypeBuilder): for member in self.members: yield member - def __getitem__(self, value:Union[str, int, slice]): + def __getitem__(self, value: Union[str, int, slice]): if isinstance(value, str): for member in self.members: if member.name == value: @@ -1240,7 +1316,7 @@ class EnumerationBuilder(TypeBuilder): else: raise ValueError(f"Incompatible type {type(value)} for __getitem__") - def __setitem__(self, item:Union[str, int], value:Union[Optional[int], EnumerationMember]): + def __setitem__(self, item: Union[str, int], value: Union[Optional[int], EnumerationMember]): if isinstance(item, str): for i, member in enumerate(self.members): if member.name == item: @@ -1252,25 +1328,33 @@ class EnumerationBuilder(TypeBuilder): class NamedTypeReferenceBuilder(TypeBuilder): - def __init__(self, handle:core.BNTypeBuilderHandle, ntr_builder_handle:core.BNNamedTypeReferenceBuilderHandle, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence): + def __init__( + self, handle: core.BNTypeBuilderHandle, ntr_builder_handle: core.BNNamedTypeReferenceBuilderHandle, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ): assert ntr_builder_handle is not None, "Failed to construct NameTypeReference" assert handle is not None, "Failed to construct NameTypeReference" - assert isinstance(ntr_builder_handle, core.BNNamedTypeReferenceBuilderHandle), "Failed to construct NameTypeReference" + assert isinstance( + ntr_builder_handle, core.BNNamedTypeReferenceBuilderHandle + ), "Failed to construct NameTypeReference" super(NamedTypeReferenceBuilder, self).__init__(handle, platform, confidence) self.ntr_builder_handle = ntr_builder_handle @classmethod - def create(cls, type_class:NamedTypeReferenceClass=NamedTypeReferenceClass.UnknownNamedTypeClass, - type_id:Optional[str]=None, name:QualifiedName=QualifiedName(""), width:int=0, align:int=1, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence, - const:BoolWithConfidenceType=False, volatile:BoolWithConfidenceType=False) -> 'NamedTypeReferenceBuilder': + def create( + cls, type_class: NamedTypeReferenceClass = NamedTypeReferenceClass.UnknownNamedTypeClass, + type_id: Optional[str] = None, name: QualifiedName = QualifiedName(""), width: int = 0, align: int = 1, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence, + const: BoolWithConfidenceType = False, volatile: BoolWithConfidenceType = False + ) -> 'NamedTypeReferenceBuilder': ntr_builder_handle = core.BNCreateNamedTypeBuilder(type_class, type_id, QualifiedName(name)._to_core_struct()) assert ntr_builder_handle is not None, "core.BNCreateNamedTypeBuilder returned None" _const = BoolWithConfidence.get_core_struct(const) _volatile = BoolWithConfidence.get_core_struct(volatile) - type_builder_handle = core.BNCreateNamedTypeReferenceBuilderWithBuilder(ntr_builder_handle, width, align, _const, _volatile) + type_builder_handle = core.BNCreateNamedTypeReferenceBuilderWithBuilder( + ntr_builder_handle, width, align, _const, _volatile + ) assert type_builder_handle is not None, "core.BNCreateNamedTypeReferenceBuilderWithBuilder returned None" return cls(type_builder_handle, ntr_builder_handle, platform, confidence) @@ -1302,14 +1386,20 @@ class NamedTypeReferenceBuilder(TypeBuilder): return NamedTypeReferenceClass(core.BNGetTypeReferenceBuilderClass(self.ntr_builder_handle)) @staticmethod - def named_type(named_type:'NamedTypeReferenceBuilder', width:int=0, align:int=1, - const:BoolWithConfidenceType=BoolWithConfidence(False), - volatile:BoolWithConfidenceType=BoolWithConfidence(False)) -> 'NamedTypeReferenceBuilder': - return NamedTypeReferenceBuilder.create(named_type.named_type_class, named_type.id, - named_type.name, width, align, None, core.max_confidence, const, volatile) + def named_type( + named_type: 'NamedTypeReferenceBuilder', width: int = 0, align: int = 1, + const: BoolWithConfidenceType = BoolWithConfidence(False), + volatile: BoolWithConfidenceType = BoolWithConfidence(False) + ) -> 'NamedTypeReferenceBuilder': + return NamedTypeReferenceBuilder.create( + named_type.named_type_class, named_type.id, named_type.name, width, align, None, core.max_confidence, const, + volatile + ) @staticmethod - def named_type_from_type_and_id(type_id:str, name:QualifiedName, type:Optional['Type']=None) -> 'NamedTypeReferenceBuilder': + def named_type_from_type_and_id( + type_id: str, name: QualifiedName, type: Optional['Type'] = None + ) -> 'NamedTypeReferenceBuilder': if type is None: return NamedTypeReferenceBuilder.create(NamedTypeReferenceClass.UnknownNamedTypeClass, type_id, name) elif type.type_class == TypeClass.StructureTypeClass: @@ -1325,14 +1415,20 @@ class NamedTypeReferenceBuilder(TypeBuilder): return NamedTypeReferenceBuilder.create(NamedTypeReferenceClass.TypedefNamedTypeClass, type_id, name) @staticmethod - def named_type_from_type(name:QualifiedName, type_class:Optional[NamedTypeReferenceClass]=None) -> 'NamedTypeReferenceBuilder': + def named_type_from_type( + name: QualifiedName, type_class: Optional[NamedTypeReferenceClass] = None + ) -> 'NamedTypeReferenceBuilder': if type_class is None: - return NamedTypeReferenceBuilder.create(NamedTypeReferenceClass.UnknownNamedTypeClass, str(uuid.uuid4()), name) + return NamedTypeReferenceBuilder.create( + NamedTypeReferenceClass.UnknownNamedTypeClass, str(uuid.uuid4()), name + ) else: return NamedTypeReferenceBuilder.create(type_class, str(uuid.uuid4()), name) @staticmethod - def named_type_from_registered_type(view:'binaryview.BinaryView', name:QualifiedName) -> 'NamedTypeReferenceBuilder': + def named_type_from_registered_type( + view: 'binaryview.BinaryView', name: QualifiedName + ) -> 'NamedTypeReferenceBuilder': type = view.get_type_by_name(name) if type is None: raise ValueError(f"Unable to find type named {name}") @@ -1365,14 +1461,16 @@ class Type: :py:meth:`parse_types_from_source_file <platform.Platform.parse_types_from_source_file>` """ - def __init__(self, handle, platform:'_platform.Platform'=None, confidence:int=core.max_confidence): + def __init__(self, handle, platform: '_platform.Platform' = None, confidence: int = core.max_confidence): assert isinstance(handle.contents, core.BNType), "Attempting to create mutable Type" self._handle = handle self._confidence = confidence self._platform = platform @classmethod - def create(cls, handle=core.BNTypeHandle, platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'Type': + def create( + cls, handle=core.BNTypeHandle, platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'Type': assert handle is not None, "Passed a handle which is None" assert isinstance(handle, core.BNTypeHandle) type_class = TypeClass(core.BNGetTypeClass(handle)) @@ -1458,7 +1556,7 @@ class Type: """Type string as a list of tokens (read-only)""" return self.get_tokens() - def get_tokens(self, base_confidence = core.max_confidence) -> List['_function.InstructionTextToken']: + def get_tokens(self, base_confidence=core.max_confidence) -> List['_function.InstructionTextToken']: count = ctypes.c_ulonglong() platform = None if self._platform is not None: @@ -1470,7 +1568,7 @@ class Type: core.BNFreeInstructionText(tokens, count.value) return result - def get_tokens_before_name(self, base_confidence = core.max_confidence) -> List['_function.InstructionTextToken']: + def get_tokens_before_name(self, base_confidence=core.max_confidence) -> List['_function.InstructionTextToken']: count = ctypes.c_ulonglong() platform = None if self._platform is not None: @@ -1481,7 +1579,7 @@ class Type: core.BNFreeInstructionText(tokens, count.value) return result - def get_tokens_after_name(self, base_confidence = core.max_confidence) -> List['_function.InstructionTextToken']: + def get_tokens_after_name(self, base_confidence=core.max_confidence) -> List['_function.InstructionTextToken']: count = ctypes.c_ulonglong() platform = None if self._platform is not None: @@ -1493,14 +1591,14 @@ class Type: return result def with_confidence(self, confidence) -> 'Type': - return Type.create(handle = core.BNNewTypeReference(self._handle), platform = self._platform, confidence = confidence) + return Type.create(handle=core.BNNewTypeReference(self._handle), platform=self._platform, confidence=confidence) @property def confidence(self) -> _int: return self._confidence @confidence.setter - def confidence(self, value:_int) -> None: + def confidence(self, value: _int) -> None: self._confidence = value @property @@ -1508,22 +1606,18 @@ class Type: return self._platform @platform.setter - def platform(self, value:'_platform.Platform') -> None: + def platform(self, value: '_platform.Platform') -> None: self._platform = value def mutable_copy(self) -> 'TypeBuilder': TypeBuilders = { - TypeClass.VoidTypeClass:VoidBuilder, - TypeClass.BoolTypeClass:BoolBuilder, - TypeClass.IntegerTypeClass:IntegerBuilder, - TypeClass.FloatTypeClass:FloatBuilder, - TypeClass.PointerTypeClass:PointerBuilder, - TypeClass.ArrayTypeClass:ArrayBuilder, - TypeClass.FunctionTypeClass:FunctionBuilder, - TypeClass.WideCharTypeClass:WideCharBuilder, - # TypeClass.StructureTypeClass:Structure, - # TypeClass.EnumerationTypeClass:Enumeration, - # TypeClass.NamedTypeReferenceClass:NamedTypeReference, + TypeClass.VoidTypeClass: VoidBuilder, TypeClass.BoolTypeClass: BoolBuilder, + TypeClass.IntegerTypeClass: IntegerBuilder, TypeClass.FloatTypeClass: FloatBuilder, + TypeClass.PointerTypeClass: PointerBuilder, TypeClass.ArrayTypeClass: ArrayBuilder, + TypeClass.FunctionTypeClass: FunctionBuilder, TypeClass.WideCharTypeClass: WideCharBuilder, + # TypeClass.StructureTypeClass:Structure, + # TypeClass.EnumerationTypeClass:Enumeration, + # TypeClass.NamedTypeReferenceClass:NamedTypeReference, } builder_handle = core.BNCreateTypeBuilderFromType(self._handle) assert builder_handle is not None, "core.BNCreateTypeBuilderFromType returned None" @@ -1532,12 +1626,14 @@ class Type: def immutable_copy(self) -> 'Type': return self - def get_builder(self, bv:'binaryview.BinaryView') -> 'MutableTypeBuilder': + def get_builder(self, bv: 'binaryview.BinaryView') -> 'MutableTypeBuilder': return MutableTypeBuilder(self.mutable_copy(), bv, self.registered_name, self.platform, self._confidence) @staticmethod - def builder(bv:'binaryview.BinaryView', name:Optional[QualifiedName]=None, id:Optional[str]=None, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'MutableTypeBuilder': + def builder( + bv: 'binaryview.BinaryView', name: Optional[QualifiedName] = None, id: Optional[str] = None, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'MutableTypeBuilder': type = None if name is None and id is None: raise ValueError("Must specify either a name or id to create a builder object") @@ -1560,13 +1656,15 @@ class Type: return MutableTypeBuilder(type.mutable_copy(), bv, name, platform, confidence) def with_replaced_structure(self, from_struct, to_struct): - return Type.create(handle = core.BNTypeWithReplacedStructure(self._handle, from_struct.handle, to_struct.handle)) + return Type.create(handle=core.BNTypeWithReplacedStructure(self._handle, from_struct.handle, to_struct.handle)) def with_replaced_enumeration(self, from_enum, to_enum): - return Type.create(handle = core.BNTypeWithReplacedEnumeration(self._handle, from_enum.handle, to_enum.handle)) + return Type.create(handle=core.BNTypeWithReplacedEnumeration(self._handle, from_enum.handle, to_enum.handle)) def with_replaced_named_type_reference(self, from_ref, to_ref): - return Type.create(handle = core.BNTypeWithReplacedNamedTypeReference(self._handle, from_ref.handle, to_ref.handle)) + return Type.create( + handle=core.BNTypeWithReplacedNamedTypeReference(self._handle, from_ref.handle, to_ref.handle) + ) @staticmethod def void() -> 'VoidType': @@ -1577,11 +1675,11 @@ class Type: return BoolType.create() @staticmethod - def char(alternate_name:str="") -> 'CharType': + def char(alternate_name: str = "") -> 'CharType': return CharType.create(alternate_name) @staticmethod - def int(width:_int, sign:BoolWithConfidenceType=True, alternate_name:str="") -> 'IntegerType': + def int(width: _int, sign: BoolWithConfidenceType = True, alternate_name: str = "") -> 'IntegerType': """ ``int`` class method for creating an int Type. :param int width: width of the integer in bytes @@ -1591,7 +1689,7 @@ class Type: return IntegerType.create(width, sign, alternate_name) @staticmethod - def float(width:_int, alternate_name:str="") -> 'FloatType': + def float(width: _int, alternate_name: str = "") -> 'FloatType': """ ``float`` class method for creating floating point Types. :param int width: width of the floating point number in bytes @@ -1600,7 +1698,7 @@ class Type: return FloatType.create(width, alternate_name) @staticmethod - def wide_char(width:_int, alternate_name:str="") -> 'WideCharType': + def wide_char(width: _int, alternate_name: str = "") -> 'WideCharType': """ ``wide_char`` class method for creating wide char Types. :param int width: width of the wide character in bytes @@ -1609,42 +1707,47 @@ class Type: return WideCharType.create(width=width, alternate_name=alternate_name) @staticmethod - def structure_type(structure:'StructureBuilder') -> 'StructureType': + def structure_type(structure: 'StructureBuilder') -> 'StructureType': result = structure.immutable_copy() assert isinstance(result, StructureType) return result @staticmethod - def named_type(named_type:'NamedTypeReferenceBuilder') -> 'NamedTypeReferenceType': + def named_type(named_type: 'NamedTypeReferenceBuilder') -> 'NamedTypeReferenceType': result = named_type.immutable_copy() assert isinstance(result, NamedTypeReferenceType) return result @staticmethod - def named_type_from_type(name:QualifiedName, type:'Type') -> 'NamedTypeReferenceType': + def named_type_from_type(name: QualifiedName, type: 'Type') -> 'NamedTypeReferenceType': return NamedTypeReferenceType.create_from_type(name, type) @staticmethod - def named_type_from_type_and_id(type_id:str, name:QualifiedName, type:Optional['Type']=None) -> 'NamedTypeReferenceType': + def named_type_from_type_and_id( + type_id: str, name: QualifiedName, type: Optional['Type'] = None + ) -> 'NamedTypeReferenceType': return NamedTypeReferenceType.create_from_type(name, type, type_id) @staticmethod - def generate_named_type_reference(guid:str, name:QualifiedName) -> 'NamedTypeReferenceType': + def generate_named_type_reference(guid: str, name: QualifiedName) -> 'NamedTypeReferenceType': return NamedTypeReferenceType.create(NamedTypeReferenceClass.TypedefNamedTypeClass, guid, name) @staticmethod - def named_type_from_registered_type(view:'binaryview.BinaryView', name:QualifiedName) -> 'NamedTypeReferenceType': + def named_type_from_registered_type(view: 'binaryview.BinaryView', name: QualifiedName) -> 'NamedTypeReferenceType': return NamedTypeReferenceType.create_from_registered_type(view, name) @staticmethod - def enumeration_type(arch, enum:'EnumerationBuilder', width:_int=None, sign:_bool=False) -> 'EnumerationType': + def enumeration_type( + arch, enum: 'EnumerationBuilder', width: _int = None, sign: _bool = False + ) -> 'EnumerationType': return EnumerationType.create(enum.members, enum.width, arch, enum.signed) @staticmethod - def pointer(arch:'architecture.Architecture', type:'Type', - const:BoolWithConfidenceType=BoolWithConfidence(False), - volatile:BoolWithConfidenceType=BoolWithConfidence(False), - ref_type:ReferenceType=ReferenceType.PointerReferenceType, width:_int=None) -> 'PointerType': + def pointer( + arch: 'architecture.Architecture', type: 'Type', const: BoolWithConfidenceType = BoolWithConfidence(False), + volatile: BoolWithConfidenceType = BoolWithConfidence(False), + ref_type: ReferenceType = ReferenceType.PointerReferenceType, width: _int = None + ) -> 'PointerType': if arch is not None: width = arch.address_size @@ -1654,20 +1757,23 @@ class Type: return PointerType.create_with_width(width, type, const, volatile, ref_type) @staticmethod - def pointer_of_width(width:_int, type:'Type', - const:BoolWithConfidenceType=False, - volatile:BoolWithConfidenceType=False, - ref_type:ReferenceType=ReferenceType.PointerReferenceType) -> 'PointerType': + def pointer_of_width( + width: _int, type: 'Type', const: BoolWithConfidenceType = False, volatile: BoolWithConfidenceType = False, + ref_type: ReferenceType = ReferenceType.PointerReferenceType + ) -> 'PointerType': return PointerType.create_with_width(width, type, const, volatile, ref_type) @staticmethod - def array(type:'Type', count:_int) -> 'ArrayType': + def array(type: 'Type', count: _int) -> 'ArrayType': return ArrayType.create(type, count) @staticmethod - def function(ret:Optional['Type']=None, params:Optional[ParamsType]=None, calling_convention:'callingconvention.CallingConvention'=None, - variable_arguments:BoolWithConfidenceType=False, - stack_adjust:OffsetWithConfidence=OffsetWithConfidence(0)) -> 'FunctionType': + def function( + ret: Optional['Type'] = None, params: Optional[ParamsType] = None, + calling_convention: 'callingconvention.CallingConvention' = None, + variable_arguments: BoolWithConfidenceType = False, + stack_adjust: OffsetWithConfidence = OffsetWithConfidence(0) + ) -> 'FunctionType': """ ``function`` class method for creating an function Type. :param Type ret: return Type of the function @@ -1679,35 +1785,42 @@ class Type: return FunctionType.create(ret, params, calling_convention, variable_arguments, stack_adjust) @staticmethod - def from_core_struct(core_type:core.BNType): + def from_core_struct(core_type: core.BNType): return Type.create(core.BNNewTypeReference(core_type)) @staticmethod - def structure(members:MembersType=None, packed:_bool=False, type:StructureVariant=StructureVariant.StructStructureType) -> 'StructureType': + def structure( + members: MembersType = None, packed: _bool = False, + type: StructureVariant = StructureVariant.StructStructureType + ) -> 'StructureType': return StructureType.create(members, packed, type) - + @staticmethod - def union(members:Optional[MembersType]=None, packed:_bool=False) -> 'StructureType': + def union(members: Optional[MembersType] = None, packed: _bool = False) -> 'StructureType': return StructureType.create(members, type=StructureVariant.UnionStructureType, packed=packed) - + @staticmethod - def class_type(members:Optional[MembersType]=None, packed:_bool=False) -> 'StructureType': + def class_type(members: Optional[MembersType] = None, packed: _bool = False) -> 'StructureType': return StructureType.create(members, type=StructureVariant.ClassStructureType, packed=packed) @staticmethod - def enumeration(arch:Optional['architecture.Architecture']=None, members:Optional[List[EnumMembersType]]=None, - width:Optional[_int]=None, sign:BoolWithConfidenceType=False) -> 'EnumerationType': + def enumeration( + arch: Optional['architecture.Architecture'] = None, members: Optional[List[EnumMembersType]] = None, + width: Optional[_int] = None, sign: BoolWithConfidenceType = False + ) -> 'EnumerationType': if members is None: members = [] return EnumerationType.create(members, width, arch, sign) @staticmethod - def named_type_reference(type_class:NamedTypeReferenceClass, name:QualifiedName, - type_id:Optional[str]=None, alignment:_int=1, width:_int=0, - const:BoolWithConfidenceType=BoolWithConfidence(False), - volatile:BoolWithConfidenceType=BoolWithConfidence(False)): - return NamedTypeReferenceType.create(type_class, type_id, name, alignment, width, - None, core.max_confidence, const, volatile) + def named_type_reference( + type_class: NamedTypeReferenceClass, name: QualifiedName, type_id: Optional[str] = None, alignment: _int = 1, + width: _int = 0, const: BoolWithConfidenceType = BoolWithConfidence(False), + volatile: BoolWithConfidenceType = BoolWithConfidence(False) + ): + return NamedTypeReferenceType.create( + type_class, type_id, name, alignment, width, None, core.max_confidence, const, volatile + ) @property @abstractmethod @@ -1715,12 +1828,12 @@ class Type: raise NotImplementedError("Name not implemented for this type") @staticmethod - def generate_auto_type_id(source:str, name:str) -> str: + def generate_auto_type_id(source: str, name: str) -> str: _name = QualifiedName(name)._to_core_struct() return core.BNGenerateAutoTypeId(source, _name) @staticmethod - def generate_auto_demangled_type_id(name:str) -> str: + def generate_auto_demangled_type_id(name: str) -> str: _name = QualifiedName(name)._to_core_struct() return core.BNGenerateAutoDemangledTypeId(_name) @@ -1740,13 +1853,13 @@ class Type: def const(self): """Whether type is const (read/write)""" result = core.BNIsTypeConst(self._handle) - return BoolWithConfidence(result.value, confidence = result.confidence) + return BoolWithConfidence(result.value, confidence=result.confidence) @property def volatile(self): """Whether type is volatile (read/write)""" result = core.BNIsTypeVolatile(self._handle) - return BoolWithConfidence(result.value, confidence = result.confidence) + return BoolWithConfidence(result.value, confidence=result.confidence) @property def system_call_number(self) -> Optional[_int]: @@ -1758,8 +1871,8 @@ class Type: @dataclass(frozen=True) class RegisterStackAdjustmentWithConfidence: - value:int - confidence:int=core.max_confidence + value: int + confidence: int = core.max_confidence def __int__(self): return self.value @@ -1767,7 +1880,7 @@ class RegisterStackAdjustmentWithConfidence: class VoidType(Type): @classmethod - def create(cls, platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'VoidType': + def create(cls, platform: '_platform.Platform' = None, confidence: int = core.max_confidence) -> 'VoidType': core_void = core.BNCreateVoidType() assert core_void is not None, "core.BNCreateVoidType returned None" return cls(core.BNNewTypeReference(core_void), platform, confidence) @@ -1775,19 +1888,21 @@ class VoidType(Type): class BoolType(Type): @classmethod - def create(cls, platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'BoolType': + def create(cls, platform: '_platform.Platform' = None, confidence: int = core.max_confidence) -> 'BoolType': handle = core.BNCreateBoolType() assert handle is not None, "core.BNCreateBoolType returned None" return cls(core.BNNewTypeReference(handle), platform, confidence) class IntegerType(Type): - def __init__(self, handle, platform:'_platform.Platform'=None, confidence:int=core.max_confidence): + def __init__(self, handle, platform: '_platform.Platform' = None, confidence: int = core.max_confidence): super(IntegerType, self).__init__(handle, platform, confidence) @classmethod - def create(cls, width:int, sign:BoolWithConfidenceType=True, alternate_name:str="", - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'IntegerType': + def create( + cls, width: int, sign: BoolWithConfidenceType = True, alternate_name: str = "", + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'IntegerType': _sign = BoolWithConfidence.get_core_struct(sign) handle = core.BNCreateIntegerType(width, _sign, alternate_name) assert handle is not None, "core.BNCreateIntegerType returned None" @@ -1801,14 +1916,17 @@ class IntegerType(Type): class CharType(IntegerType): @classmethod - def create(cls, altname:str="char", platform:'_platform.Platform'=None, - confidence:int=core.max_confidence) -> 'CharType': + def create( + cls, altname: str = "char", platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'CharType': return cls(IntegerType.create(1, True, altname).handle, platform, confidence) class FloatType(Type): @classmethod - def create(cls, width:int, altname:str="", platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'FloatType': + def create( + cls, width: int, altname: str = "", platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'FloatType': """ ``float`` class method for creating floating point Types. @@ -1821,7 +1939,7 @@ class FloatType(Type): class StructureType(Type): - def __init__(self, handle, platform:'_platform.Platform'=None, confidence:int=core.max_confidence): + def __init__(self, handle, platform: '_platform.Platform' = None, confidence: int = core.max_confidence): assert handle is not None, "Attempted to create EnumerationType with handle which is None" super(StructureType, self).__init__(handle, platform, confidence) struct_handle = core.BNGetTypeStructure(handle) @@ -1829,8 +1947,11 @@ class StructureType(Type): self.struct_handle = struct_handle @classmethod - def create(cls, members:MembersType=None, packed:bool=False, type:StructureVariant=StructureVariant.StructStructureType, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'StructureType': + def create( + cls, members: MembersType = None, packed: bool = False, + type: StructureVariant = StructureVariant.StructStructureType, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'StructureType': builder = core.BNCreateStructureBuilderWithOptions(type, packed) assert builder is not None, "core.BNCreateStructureBuilder returned None" StructureBuilder._add_members_to_builder(builder, members) @@ -1850,7 +1971,7 @@ class StructureType(Type): return StructureBuilder(type_builder_handle, structure_builder_handle, self.platform, self.confidence) @classmethod - def from_core_struct(cls, structure:core.BNStructure) -> 'StructureType': + def from_core_struct(cls, structure: core.BNStructure) -> 'StructureType': return cls(core.BNNewTypeReference(core.BNCreateStructureType(structure))) def __del__(self): @@ -1860,28 +1981,32 @@ class StructureType(Type): def __hash__(self): return hash(ctypes.addressof(self.struct_handle.contents)) - def __getitem__(self, name:str) -> StructureMember: + def __getitem__(self, name: str) -> StructureMember: member = None try: member = core.BNGetStructureMemberByName(self.struct_handle, name) if member is None: raise ValueError(f"Member {name} is not part of structure") - return StructureMember(Type.create(core.BNNewTypeReference(member.contents.type), confidence=member.contents.typeConfidence), - member.contents.name, member.contents.offset, MemberAccess(member.contents.access), - MemberScope(member.contents.scope)) + return StructureMember( + Type.create(core.BNNewTypeReference(member.contents.type), confidence=member.contents.typeConfidence), + member.contents.name, member.contents.offset, MemberAccess(member.contents.access), + MemberScope(member.contents.scope) + ) finally: if member is not None: core.BNFreeStructureMember(member) - def member_at_offset(self, offset:int) -> StructureMember: + def member_at_offset(self, offset: int) -> StructureMember: member = None try: member = core.BNGetStructureMemberAtOffset(self.struct_handle, offset, None) if member is None: raise ValueError(f"No member exists a offset {offset}") - return StructureMember(Type.create(core.BNNewTypeReference(member.contents.type), confidence=member.contents.typeConfidence), - member.contents.name, member.contents.offset, MemberAccess(member.contents.access), - MemberScope(member.contents.scope)) + return StructureMember( + Type.create(core.BNNewTypeReference(member.contents.type), confidence=member.contents.typeConfidence), + member.contents.name, member.contents.offset, MemberAccess(member.contents.access), + MemberScope(member.contents.scope) + ) finally: core.BNFreeStructureMember(member) @@ -1894,9 +2019,13 @@ class StructureType(Type): try: result = [] for i in range(0, count.value): - result.append(StructureMember(Type.create(core.BNNewTypeReference(members[i].type), confidence=members[i].typeConfidence), - members[i].name, members[i].offset, MemberAccess(members[i].access), - MemberScope(members[i].scope))) + result.append( + StructureMember( + Type.create(core.BNNewTypeReference(members[i].type), confidence=members[i].typeConfidence), + members[i].name, members[i].offset, MemberAccess(members[i].access), + MemberScope(members[i].scope) + ) + ) finally: core.BNFreeStructureMemberList(members, count.value) return result @@ -1920,27 +2049,34 @@ class StructureType(Type): return StructureVariant(core.BNGetStructureType(self.struct_handle)) def with_replaced_structure(self, from_struct, to_struct) -> 'StructureType': - return StructureType(core.BNStructureWithReplacedStructure(self.struct_handle, from_struct.handle, to_struct.handle)) + return StructureType( + core.BNStructureWithReplacedStructure(self.struct_handle, from_struct.handle, to_struct.handle) + ) def with_replaced_enumeration(self, from_enum, to_enum) -> 'StructureType': - return StructureType(core.BNStructureWithReplacedEnumeration(self.struct_handle, from_enum.handle, to_enum.handle)) + return StructureType( + core.BNStructureWithReplacedEnumeration(self.struct_handle, from_enum.handle, to_enum.handle) + ) def with_replaced_named_type_reference(self, from_ref, to_ref) -> 'StructureType': - return StructureType(core.BNStructureWithReplacedNamedTypeReference(self.struct_handle, from_ref.handle, to_ref.handle)) + return StructureType( + core.BNStructureWithReplacedNamedTypeReference(self.struct_handle, from_ref.handle, to_ref.handle) + ) - def generate_named_type_reference(self, guid:str, name:QualifiedName): + def generate_named_type_reference(self, guid: str, name: QualifiedName): if self.type == StructureVariant.StructStructureType: ntr_type = NamedTypeReferenceClass.StructNamedTypeClass elif self.type == StructureVariant.UnionStructureType: ntr_type = NamedTypeReferenceClass.UnionNamedTypeClass else: ntr_type = NamedTypeReferenceClass.ClassNamedTypeClass - return NamedTypeReferenceType.create(ntr_type, guid, name, self.alignment, - self.width, self.platform, self.confidence) + return NamedTypeReferenceType.create( + ntr_type, guid, name, self.alignment, self.width, self.platform, self.confidence + ) class EnumerationType(IntegerType): - def __init__(self, handle, platform:'_platform.Platform'=None, confidence:int=core.max_confidence): + def __init__(self, handle, platform: '_platform.Platform' = None, confidence: int = core.max_confidence): assert handle is not None, "Attempted to create EnumerationType without handle" super(EnumerationType, self).__init__(handle, platform, confidence) enum_handle = core.BNGetTypeEnumeration(handle) @@ -1968,9 +2104,11 @@ class EnumerationType(IntegerType): return result @classmethod - def create(cls, members=List[EnumMembersType], width:Optional[int]=None, - arch:Optional['architecture.Architecture']=None, sign:BoolWithConfidenceType=False, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'EnumerationType': + def create( + cls, members=List[EnumMembersType], width: Optional[int] = None, + arch: Optional['architecture.Architecture'] = None, sign: BoolWithConfidenceType = False, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'EnumerationType': if width is None: if arch is None: raise ValueError("One of the following parameters must not be None: (arch, width)") @@ -1998,10 +2136,9 @@ class EnumerationType(IntegerType): assert enumeration_builder_handle is not None, "core.BNCreateEnumerationBuilderFromEnumeration returned None" return EnumerationBuilder(type_builder_handle, enumeration_builder_handle, self.platform, self.confidence) - def generate_named_type_reference(self, guid:str, name:QualifiedName): + def generate_named_type_reference(self, guid: str, name: QualifiedName): ntr_type = NamedTypeReferenceClass.EnumNamedTypeClass - return NamedTypeReferenceType.create(ntr_type, guid, name, - platform=self.platform, confidence=self.confidence) + return NamedTypeReferenceType.create(ntr_type, guid, name, platform=self.platform, confidence=self.confidence) class PointerType(Type): @@ -2010,16 +2147,19 @@ class PointerType(Type): return ReferenceType(core.BNTypeGetReferenceType(self._handle)) @classmethod - def create(cls, arch:'architecture.Architecture', type:SomeType, const:BoolWithConfidenceType=False, - volatile:BoolWithConfidenceType=False, ref_type:ReferenceType=ReferenceType.PointerReferenceType, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'PointerType': + def create( + cls, arch: 'architecture.Architecture', type: SomeType, const: BoolWithConfidenceType = False, + volatile: BoolWithConfidenceType = False, ref_type: ReferenceType = ReferenceType.PointerReferenceType, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'PointerType': return cls.create_with_width(arch.address_size, type, const, volatile, ref_type, platform, confidence) @staticmethod - def from_bools(const:BoolWithConfidenceType, volatile:BoolWithConfidenceType) -> Tuple[BoolWithConfidence, BoolWithConfidence]: + def from_bools(const: BoolWithConfidenceType, + volatile: BoolWithConfidenceType) -> Tuple[BoolWithConfidence, BoolWithConfidence]: _const = const if const is None: - _const = BoolWithConfidence(False, confidence = 0) + _const = BoolWithConfidence(False, confidence=0) elif isinstance(const, bool): _const = BoolWithConfidence(const) if not isinstance(_const, BoolWithConfidence): @@ -2027,7 +2167,7 @@ class PointerType(Type): _volatile = volatile if volatile is None: - _volatile = BoolWithConfidence(False, confidence = 0) + _volatile = BoolWithConfidence(False, confidence=0) elif isinstance(volatile, bool): _volatile = BoolWithConfidence(volatile) if not isinstance(_volatile, BoolWithConfidence): @@ -2036,17 +2176,20 @@ class PointerType(Type): return (_const, _volatile) @classmethod - def create_with_width(cls, width:int, type:SomeType, const:BoolWithConfidenceType=False, - volatile:BoolWithConfidenceType=False, ref_type:ReferenceType=None, platform:'_platform.Platform'=None, - confidence:int=core.max_confidence) -> 'PointerType': + def create_with_width( + cls, width: int, type: SomeType, const: BoolWithConfidenceType = False, + volatile: BoolWithConfidenceType = False, ref_type: ReferenceType = None, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'PointerType': _const, _volatile = PointerType.from_bools(const, volatile) type = type.immutable_copy() if ref_type is None: ref_type = ReferenceType.PointerReferenceType type_conf = type._to_core_struct() - core_type = core.BNCreatePointerTypeOfWidth(width, type_conf, _const._to_core_struct(), - _volatile._to_core_struct(), ref_type) + core_type = core.BNCreatePointerTypeOfWidth( + width, type_conf, _const._to_core_struct(), _volatile._to_core_struct(), ref_type + ) assert core_type is not None, "core.BNCreatePointerTypeOfWidth returned None" return cls(core.BNNewTypeReference(core_type), platform, confidence) @@ -2060,7 +2203,10 @@ class PointerType(Type): class ArrayType(Type): @classmethod - def create(cls, element_type:Type, count:int, platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'ArrayType': + def create( + cls, element_type: Type, count: int, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'ArrayType': type_conf = element_type._to_core_struct() core_array = core.BNCreateArrayType(type_conf, count) assert core_array is not None, "core.BNCreateArrayType returned None" @@ -2080,9 +2226,13 @@ class ArrayType(Type): class FunctionType(Type): @classmethod - def create(cls, ret:Optional[Type]=None, params:ParamsType=None, - calling_convention:'callingconvention.CallingConvention'=None, variable_arguments:BoolWithConfidenceType=BoolWithConfidence(False), - stack_adjust:OffsetWithConfidence=OffsetWithConfidence(0), platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'FunctionType': + def create( + cls, ret: Optional[Type] = None, params: ParamsType = None, + calling_convention: 'callingconvention.CallingConvention' = None, + variable_arguments: BoolWithConfidenceType = BoolWithConfidence(False), + stack_adjust: OffsetWithConfidence = OffsetWithConfidence(0), platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'FunctionType': if ret is None: ret = VoidType.create() if params is None: @@ -2100,8 +2250,9 @@ class FunctionType(Type): _variable_arguments = BoolWithConfidence.get_core_struct(variable_arguments) _stack_adjust = OffsetWithConfidence.get_core_struct(stack_adjust) - func_type = core.BNCreateFunctionType(ret_conf, conv_conf, param_buf, len(params), - _variable_arguments, _stack_adjust) + func_type = core.BNCreateFunctionType( + ret_conf, conv_conf, param_buf, len(params), _variable_arguments, _stack_adjust + ) assert func_type is not None, f"core.BNCreateFunctionType returned None {ret_conf} {conv_conf} {param_buf} {_variable_arguments} {_stack_adjust}" return cls(core.BNNewTypeReference(func_type), platform, confidence) @@ -2109,7 +2260,7 @@ class FunctionType(Type): def stack_adjustment(self) -> OffsetWithConfidence: """Stack adjustment for function (read-only)""" result = core.BNGetTypeStackAdjustment(self._handle) - return OffsetWithConfidence(result.value, confidence = result.confidence) + return OffsetWithConfidence(result.value, confidence=result.confidence) @property def return_value(self) -> Type: @@ -2117,7 +2268,7 @@ class FunctionType(Type): result = core.BNGetChildType(self._handle) if result is None: return Type.void() - return Type.create(core.BNNewTypeReference(result.type), platform = self._platform, confidence = result.confidence) + return Type.create(core.BNNewTypeReference(result.type), platform=self._platform, confidence=result.confidence) @property def calling_convention(self) -> Optional[callingconvention.CallingConvention]: @@ -2125,7 +2276,7 @@ class FunctionType(Type): result = core.BNGetTypeCallingConvention(self._handle) if not result.convention: return None - return callingconvention.CallingConvention(None, handle = result.convention, confidence = result.confidence) + return callingconvention.CallingConvention(None, handle=result.convention, confidence=result.confidence) @property def parameters(self) -> List[FunctionParameter]: @@ -2135,17 +2286,21 @@ class FunctionType(Type): assert params is not None, "core.BNGetTypeParameters returned None" result = [] for i in range(0, count.value): - param_type = Type.create(core.BNNewTypeReference(params[i].type), platform = self._platform, confidence = params[i].typeConfidence) + param_type = Type.create( + core.BNNewTypeReference(params[i].type), platform=self._platform, confidence=params[i].typeConfidence + ) if params[i].defaultLocation: param_location = None else: name = params[i].name - if (params[i].location.type == VariableSourceType.RegisterVariableSourceType) and (self._platform is not None): + if (params[i].location.type + == VariableSourceType.RegisterVariableSourceType) and (self._platform is not None): name = self._platform.arch.get_reg_name(params[i].location.storage) elif params[i].location.type == VariableSourceType.StackVariableSourceType: name = "arg_%x" % params[i].location.storage - param_location = variable.VariableNameAndType(params[i].location.type, params[i].location.index, - params[i].location.storage, name, param_type) + param_location = variable.VariableNameAndType( + params[i].location.type, params[i].location.index, params[i].location.storage, name, param_type + ) result.append(FunctionParameter(param_type, params[i].name, param_location)) core.BNFreeTypeParameterList(params, count.value) return result @@ -2154,17 +2309,19 @@ class FunctionType(Type): def has_variable_arguments(self) -> BoolWithConfidence: """Whether type has variable arguments (read-only)""" result = core.BNTypeHasVariableArguments(self._handle) - return BoolWithConfidence(result.value, confidence = result.confidence) + return BoolWithConfidence(result.value, confidence=result.confidence) @property def can_return(self) -> BoolWithConfidence: """Whether type can return""" result = core.BNFunctionTypeCanReturn(self._handle) - return BoolWithConfidence(result.value, confidence = result.confidence) + return BoolWithConfidence(result.value, confidence=result.confidence) class NamedTypeReferenceType(Type): - def __init__(self, handle, platform:'_platform.Platform'=None, confidence:int=core.max_confidence, ntr_handle=None): + def __init__( + self, handle, platform: '_platform.Platform' = None, confidence: int = core.max_confidence, ntr_handle=None + ): assert handle is not None, "Attempting to create NamedTypeReferenceType handle which is None" super(NamedTypeReferenceType, self).__init__(handle, platform, confidence) if ntr_handle is None: @@ -2175,14 +2332,18 @@ class NamedTypeReferenceType(Type): def mutable_copy(self): type_builder_handle = core.BNCreateTypeBuilderFromType(self._handle) assert type_builder_handle is not None, "core.BNCreateTypeBuilderFromType returned None" - ntr_builder_handle = core.BNCreateNamedTypeBuilder(self.named_type_class, self.type_id, self.name._to_core_struct()) + ntr_builder_handle = core.BNCreateNamedTypeBuilder( + self.named_type_class, self.type_id, self.name._to_core_struct() + ) assert ntr_builder_handle is not None, "core.BNCreateNamedTypeBuilder returned None" return NamedTypeReferenceBuilder(type_builder_handle, ntr_builder_handle, self.platform, self.confidence) @classmethod - def create(cls, named_type_class:NamedTypeReferenceClass, guid:Optional[str], - name:QualifiedName, alignment:int=0, width:int=0, platform:'_platform.Platform'=None, - confidence:int=core.max_confidence, const:BoolWithConfidenceType=False, volatile:BoolWithConfidenceType=False) -> 'NamedTypeReferenceType': + def create( + cls, named_type_class: NamedTypeReferenceClass, guid: Optional[str], name: QualifiedName, alignment: int = 0, + width: int = 0, platform: '_platform.Platform' = None, confidence: int = core.max_confidence, + const: BoolWithConfidenceType = False, volatile: BoolWithConfidenceType = False + ) -> 'NamedTypeReferenceType': _guid = guid if guid is None: _guid = str(uuid.uuid4()) @@ -2198,8 +2359,10 @@ class NamedTypeReferenceType(Type): return cls(core.BNNewTypeReference(core_type), platform, confidence) @classmethod - def create_from_type(cls, name:QualifiedName, type:Optional[Type], guid:Optional[str]=None, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'NamedTypeReferenceType': + def create_from_type( + cls, name: QualifiedName, type: Optional[Type], guid: Optional[str] = None, + platform: '_platform.Platform' = None, confidence: int = core.max_confidence + ) -> 'NamedTypeReferenceType': _guid = guid if _guid is None: _guid = str(uuid.uuid4()) @@ -2210,8 +2373,10 @@ class NamedTypeReferenceType(Type): return type.generate_named_type_reference(_guid, name) @classmethod - def create_from_registered_type(cls, view:'binaryview.BinaryView', name:QualifiedName, - platform:'_platform.Platform'=None, confidence:int=core.max_confidence) -> 'NamedTypeReferenceType': + def create_from_registered_type( + cls, view: 'binaryview.BinaryView', name: QualifiedName, platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'NamedTypeReferenceType': _name = QualifiedName(name)._to_core_struct() core_type = core.BNCreateNamedTypeReferenceFromType(view.handle, _name) assert core_type is not None, "core.BNCreateNamedTypeReferenceFromType returned None" @@ -2262,16 +2427,16 @@ class NamedTypeReferenceType(Type): return result @staticmethod - def generate_auto_type_ref(type_class:NamedTypeReferenceClass, source:str, name:QualifiedNameType): + def generate_auto_type_ref(type_class: NamedTypeReferenceClass, source: str, name: QualifiedNameType): type_id = Type.generate_auto_type_id(source, name) return NamedTypeReferenceType.create(type_class, type_id, name) @staticmethod - def generate_auto_demangled_type_ref(type_class:NamedTypeReferenceClass, name:QualifiedNameType): + def generate_auto_demangled_type_ref(type_class: NamedTypeReferenceClass, name: QualifiedNameType): type_id = Type.generate_auto_demangled_type_id(name) return NamedTypeReferenceType.create(type_class, type_id, name) - def _target_helper(self, bv:'binaryview.BinaryView', type_ids=None) -> Optional[Type]: + def _target_helper(self, bv: 'binaryview.BinaryView', type_ids=None) -> Optional[Type]: t = bv.get_type_by_id(self.type_id) if t is None: return None @@ -2285,7 +2450,7 @@ class NamedTypeReferenceType(Type): else: return t - def target(self, bv:'binaryview.BinaryView') -> Optional[Type]: + def target(self, bv: 'binaryview.BinaryView') -> Optional[Type]: """Returns the type pointed to by the current type :param bv: The BinaryView in which this type is defined. @@ -2298,8 +2463,10 @@ class NamedTypeReferenceType(Type): class WideCharType(Type): @classmethod - def create(cls, width:int, alternate_name:str="", platform:'_platform.Platform'=None, - confidence:int=core.max_confidence) -> 'WideCharType': + def create( + cls, width: int, alternate_name: str = "", platform: '_platform.Platform' = None, + confidence: int = core.max_confidence + ) -> 'WideCharType': """ ``wide_char`` class method for creating wide char Types. @@ -2310,24 +2477,20 @@ class WideCharType(Type): assert core_type is not None, "core.BNCreateWideCharType returned None" return cls(core.BNNewTypeReference(core_type), platform, confidence) + Types = { - TypeClass.VoidTypeClass:VoidType, - TypeClass.BoolTypeClass:BoolType, - TypeClass.IntegerTypeClass:IntegerType, - TypeClass.FloatTypeClass:FloatType, - TypeClass.StructureTypeClass:StructureType, - TypeClass.EnumerationTypeClass:EnumerationType, - TypeClass.PointerTypeClass:PointerType, - TypeClass.ArrayTypeClass:ArrayType, - TypeClass.FunctionTypeClass:FunctionType, - TypeClass.NamedTypeReferenceClass:NamedTypeReferenceType, - TypeClass.WideCharTypeClass:WideCharType, + TypeClass.VoidTypeClass: VoidType, TypeClass.BoolTypeClass: BoolType, TypeClass.IntegerTypeClass: IntegerType, + TypeClass.FloatTypeClass: FloatType, TypeClass.StructureTypeClass: StructureType, + TypeClass.EnumerationTypeClass: EnumerationType, TypeClass.PointerTypeClass: PointerType, + TypeClass.ArrayTypeClass: ArrayType, TypeClass.FunctionTypeClass: FunctionType, + TypeClass.NamedTypeReferenceClass: NamedTypeReferenceType, TypeClass.WideCharTypeClass: WideCharType, } + @dataclass(frozen=True) class RegisterSet: - regs:List['architecture.RegisterName'] - confidence:int=core.max_confidence + regs: List['architecture.RegisterName'] + confidence: int = core.max_confidence def __iter__(self) -> Generator['architecture.RegisterName', None, None]: for reg in self.regs: @@ -2345,15 +2508,16 @@ class RegisterSet: @dataclass(frozen=True) class TypeParserResult: - types:Mapping[QualifiedName, Type] - variables:Mapping[QualifiedName, Type] - functions:Mapping[QualifiedName, Type] + types: Mapping[QualifiedName, Type] + variables: Mapping[QualifiedName, Type] + functions: Mapping[QualifiedName, Type] def __repr__(self): return f"<types: {self.types}, variables: {self.variables}, functions: {self.functions}>" -def preprocess_source(source:str, filename:str=None, include_dirs:Optional[List[str]]=None) -> Tuple[Optional[str], str]: +def preprocess_source(source: str, filename: str = None, + include_dirs: Optional[List[str]] = None) -> Tuple[Optional[str], str]: """ ``preprocess_source`` run the C preprocessor on the given source or source filename. @@ -2393,11 +2557,11 @@ def preprocess_source(source:str, filename:str=None, include_dirs:Optional[List[ @dataclass(frozen=True) class TypeFieldReference: - func:Optional['_function.Function'] - arch:Optional['architecture.Architecture'] - address:int - size:int - incomingType:Optional[Type] + func: Optional['_function.Function'] + arch: Optional['architecture.Architecture'] + address: int + size: int + incomingType: Optional[Type] def __repr__(self): if self.arch: |
