Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
self.bytes = self.bits // self.byte_width
if endness not in (Endness.LE, Endness.BE, Endness.ME):
raise ArchError('Must pass a valid endness: Endness.LE, Endness.BE, or Endness.ME')
if instruction_endness is not None:
self.instruction_endness = instruction_endness
if self.vex_support and _pyvex:
self.vex_archinfo = _pyvex.default_vex_archinfo()
if endness == Endness.BE:
if self.vex_archinfo:
self.vex_archinfo['endness'] = _pyvex.vex_endness_from_string('VexEndnessBE')
self.memory_endness = Endness.BE
self.register_endness = Endness.BE
if _capstone and self.cs_mode is not None:
self.cs_mode -= _capstone.CS_MODE_LITTLE_ENDIAN
self.cs_mode += _capstone.CS_MODE_BIG_ENDIAN
if _keystone and self.ks_mode is not None:
self.ks_mode -= _keystone.KS_MODE_LITTLE_ENDIAN
self.ks_mode += _keystone.KS_MODE_BIG_ENDIAN
self.ret_instruction = reverse_ends(self.ret_instruction)
self.nop_instruction = reverse_ends(self.nop_instruction)
if self.register_list and _pyvex is not None:
(_, _), max_offset = max(_pyvex.vex_ffi.guest_offsets.items(), key=lambda x: x[1])
max_offset += self.bits
# Register collections
if type(self.vex_arch) is str:
va = self.vex_arch[7:].lower() # pylint: disable=unsubscriptable-object
for r in self.register_list:
self.bytes = self.bits // self.byte_width
if endness not in (Endness.LE, Endness.BE, Endness.ME):
raise ArchError('Must pass a valid endness: Endness.LE, Endness.BE, or Endness.ME')
if instruction_endness is not None:
self.instruction_endness = instruction_endness
if self.vex_support and _pyvex:
self.vex_archinfo = _pyvex.default_vex_archinfo()
if endness == Endness.BE:
if self.vex_archinfo:
self.vex_archinfo['endness'] = _pyvex.vex_endness_from_string('VexEndnessBE')
self.memory_endness = Endness.BE
self.register_endness = Endness.BE
if _capstone and self.cs_mode is not None:
self.cs_mode -= _capstone.CS_MODE_LITTLE_ENDIAN
self.cs_mode += _capstone.CS_MODE_BIG_ENDIAN
if _keystone and self.ks_mode is not None:
self.ks_mode -= _keystone.KS_MODE_LITTLE_ENDIAN
self.ks_mode += _keystone.KS_MODE_BIG_ENDIAN
self.ret_instruction = reverse_ends(self.ret_instruction)
self.nop_instruction = reverse_ends(self.nop_instruction)
if self.register_list and _pyvex is not None:
(_, _), max_offset = max(_pyvex.vex_ffi.guest_offsets.items(), key=lambda x: x[1])
max_offset += self.bits
# Register collections
if type(self.vex_arch) is str:
va = self.vex_arch[7:].lower() # pylint: disable=unsubscriptable-object
def __init__(self, endness=Endness.LE):
super(ArchPPC32, self).__init__(endness)
if endness == Endness.BE:
self.function_prologs = {
# stwu r1, -off(r1); mflr r0
br"\x94\x21[\x00-\xff]{2}\x7c\x08\x02\xa6"
}
self.function_epilogs = {
# mtlr reg; ... ; blr
br"[\x00-\xff]{2}\x03\xa6([\x00-\xff]{4}){0,6}\x4e\x80\x00\x20"
}
self.argument_register_positions = {
self.registers['r3'][0]: 0,
self.registers['r4'][0]: 1,
self.registers['r5'][0]: 2,
self.registers['r6'][0]: 3,
self.registers['r7'][0]: 4,
self.registers['r8'][0]: 5,
@property
def keystone_thumb(self):
return self.keystone
def __init__(self, *args, **kwargs):
super(ArchARMCortexM, self).__init__(*args, **kwargs)
# TODO: Make arm_spotter use these
# TODO: Make SimOS use these.
# TODO: Add.... the NVIC? to SimOS
register_arch([r'.*cortexm|.*cortex\-m.*|.*v7\-m.*'], 32, 'any', ArchARMCortexM)
register_arch([r'.*armhf.*'], 32, 'any', ArchARMHF)
register_arch([r'.*armeb|.*armbe'], 32, Endness.BE, ArchARM)
register_arch([r'.*armel|arm.*'], 32, Endness.LE, ArchARMEL)
register_arch([r'.*arm.*|.*thumb.*'], 32, 'any', ArchARM)
def __init__(self, endness=Endness.BE):
super(ArchS390X, self).__init__(endness)
if endness != Endness.BE:
raise ArchError('Arch s390x must be big endian')
self.argument_register_positions = {
self.registers['r2'][0]: 0,
self.registers['r3'][0]: 1,
self.registers['r4'][0]: 2,
self.registers['r5'][0]: 3,
self.registers['r6'][0]: 4,
# fp registers
self.registers['f0'][0]: 0,
self.registers['f2'][0]: 1,
self.registers['f4'][0]: 2,
self.registers['f6'][0]: 3,
} if _pyvex is not None else None
raise ArchError('Must pass a valid endness: Endness.LE, Endness.BE, or Endness.ME')
if instruction_endness is not None:
self.instruction_endness = instruction_endness
if self.vex_support:
if _pyvex:
self.vex_archinfo = _pyvex.default_vex_archinfo()
else:
self._vex_archinfo = None
if endness == Endness.BE:
if self.vex_archinfo:
self.vex_archinfo['endness'] = _pyvex.vex_endness_from_string('VexEndnessBE')
self.memory_endness = Endness.BE
self.register_endness = Endness.BE
if _capstone and self.cs_mode is not None:
self.cs_mode -= _capstone.CS_MODE_LITTLE_ENDIAN
self.cs_mode += _capstone.CS_MODE_BIG_ENDIAN
if _keystone and self.ks_mode is not None:
self.ks_mode -= _keystone.KS_MODE_LITTLE_ENDIAN
self.ks_mode += _keystone.KS_MODE_BIG_ENDIAN
self.ret_instruction = reverse_ends(self.ret_instruction)
self.nop_instruction = reverse_ends(self.nop_instruction)
# Register collections
if self.register_list:
if self.vex_arch is not None and _pyvex is not None:
va = self.vex_arch[7:].lower()
for r in self.register_list:
if r.vex_offset is None:
for name in (r.vex_name, r.name) + r.alias_names:
def __init__(self, endness=Endness.BE):
super(ArchMIPS64, self).__init__(endness)
if endness == Endness.BE:
self.function_prologs = set((
# TODO
))
self.function_epilogs = set((
# TODO
))
self.triplet = 'mips64-linux-gnu'
self.linux_name = 'mips64'
self.ida_name = 'mips64b'
if endness not in (Endness.LE, Endness.BE, Endness.ME):
raise ArchError('Must pass a valid endness: Endness.LE, Endness.BE, or Endness.ME')
if instruction_endness is not None:
self.instruction_endness = instruction_endness
if self.vex_support:
if _pyvex:
self.vex_archinfo = _pyvex.default_vex_archinfo()
else:
self._vex_archinfo = None
if endness == Endness.BE:
if self.vex_archinfo:
self.vex_archinfo['endness'] = _pyvex.vex_endness_from_string('VexEndnessBE')
self.memory_endness = Endness.BE
self.register_endness = Endness.BE
if _capstone and self.cs_mode is not None:
self.cs_mode -= _capstone.CS_MODE_LITTLE_ENDIAN
self.cs_mode += _capstone.CS_MODE_BIG_ENDIAN
if _keystone and self.ks_mode is not None:
self.ks_mode -= _keystone.KS_MODE_LITTLE_ENDIAN
self.ks_mode += _keystone.KS_MODE_BIG_ENDIAN
self.ret_instruction = reverse_ends(self.ret_instruction)
self.nop_instruction = reverse_ends(self.nop_instruction)
# Register collections
if self.register_list:
if self.vex_arch is not None and _pyvex is not None:
va = self.vex_arch[7:].lower()
for r in self.register_list:
if r.vex_offset is None:
elif isinstance(bits,str) and '32' in bits:
bits = 32
elif not bits and '64' in ident:
bits = 64
elif not bits and '32' in ident:
bits = 32
endness = endness.lower()
if 'lit' in endness:
endness = Endness.LE
elif 'big' in endness:
endness = Endness.BE
elif 'lsb' in endness:
endness = Endness.LE
elif 'msb' in endness:
endness = Endness.BE
elif 'le' in endness:
endness = Endness.LE
elif 'be' in endness:
endness = Endness.BE
elif 'l' in endness:
endness = 'unsure'
elif 'b' in endness:
endness = 'unsure'
else:
endness = 'unsure'
ident = ident.lower()
cls = None
aendness = ""
for arxs, abits, aendness, acls in arch_id_map:
found_it = False
for rx in arxs:
def __init__(self, endness=Endness.BE):
super(ArchMIPS32, self).__init__(endness)
if endness == Endness.BE:
self.function_prologs = {
br"\x27\xbd\xff[\x00-\xff]" # addiu $sp, xxx
br"\x3c\x1c[\x00-\xff][\x00-\xff]\x9c\x27[\x00-\xff][\x00-\xff]" # lui $gp, xxx; addiu $gp, $gp, xxxx
}
self.function_epilogs = {
br"\x8f\xbf[\x00-\xff]{2}([\x00-\xff]{4}){0,4}\x03\xe0\x00\x08" # lw ra, off(sp); ... ; jr ra
}
self.qemu_name = 'mips'
self.triplet = 'mips-linux-gnu'
self.linux_name = 'mips'