def prepare(self): """Prepare the environment for attachment with a jitter""" # Disassembler self.mdis = self.machine.dis_engine(bin_stream_vm(self.jitter.vm), lines_wd=1, loc_db=self.loc_db) # Symbexec engine ## Prepare symbexec engines self.symb = self.SYMB_ENGINE(self.jitter.cpu, self.jitter.vm, self.ir_arch, {}) self.symb.enable_emulated_simplifications() self.symb_concrete = ESENoVMSideEffects(self.jitter.cpu, self.jitter.vm, self.ir_arch, {}) ## Update registers value self.symb.symbols[self.ir_arch.IRDst] = ExprInt( getattr(self.jitter.cpu, self.ir_arch.pc.name), self.ir_arch.IRDst.size) # Activate callback on each instr self.jitter.jit.set_options(max_exec_per_call=1, jit_maxline=1) self.jitter.exec_cb = self.callback # Clean jit cache to avoid multi-line basic blocks already jitted self.jitter.jit.clear_jitted_blocks()
def prepare(self): """Prepare the environment for attachment with a jitter""" # Disassembler self.mdis = self.machine.dis_engine(bin_stream_vm(self.jitter.vm), lines_wd=1, loc_db=self.loc_db) # Symbexec engine ## Prepare symbexec engines self.symb = self.SYMB_ENGINE(self.jitter.cpu, self.jitter.vm, self.ir_arch, {}) self.symb.enable_emulated_simplifications() self.symb_concrete = ESENoVMSideEffects( self.jitter.cpu, self.jitter.vm, self.ir_arch, {} ) ## Update registers value self.symb.symbols[self.ir_arch.IRDst] = ExprInt( getattr(self.jitter.cpu, self.ir_arch.pc.name), self.ir_arch.IRDst.size ) # Activate callback on each instr self.jitter.jit.set_options(max_exec_per_call=1, jit_maxline=1) self.jitter.exec_cb = self.callback # Clean jit cache to avoid multi-line basic blocks already jitted self.jitter.jit.clear_jitted_blocks()
def __init__(self, lifter, jit_type="gcc"): """Init an instance of jitter. @lifter: Lifter instance for this architecture @jit_type: JiT backend to use. Available options are: - "gcc" - "llvm" - "python" """ self.arch = lifter.arch self.attrib = lifter.attrib arch_name = lifter.arch.name # (lifter.arch.name, lifter.attrib) try: if arch_name == "x86": from miasm.jitter.arch import JitCore_x86 as jcore elif arch_name == "arm": from miasm.jitter.arch import JitCore_arm as jcore elif arch_name == "armt": from miasm.jitter.arch import JitCore_arm as jcore lifter.arch.name = 'arm' elif arch_name == "aarch64": from miasm.jitter.arch import JitCore_aarch64 as jcore elif arch_name == "msp430": from miasm.jitter.arch import JitCore_msp430 as jcore elif arch_name == "mips32": from miasm.jitter.arch import JitCore_mips32 as jcore elif arch_name == "ppc32": from miasm.jitter.arch import JitCore_ppc32 as jcore elif arch_name == "mep": from miasm.jitter.arch import JitCore_mep as jcore else: raise ValueError("unknown jit arch: %s" % arch_name) except ImportError: raise RuntimeError('Unsupported jit arch: %s' % arch_name) self.vm = VmMngr.Vm() self.cpu = jcore.JitCpu() self.lifter = lifter self.bs = bin_stream_vm(self.vm) self.ircfg = self.lifter.new_ircfg() self.symbexec = EmulatedSymbExec( self.cpu, self.vm, self.lifter, {} ) self.symbexec.reset_regs() try: if jit_type == "llvm": from miasm.jitter.jitcore_llvm import JitCore_LLVM as JitCore elif jit_type == "python": from miasm.jitter.jitcore_python import JitCore_Python as JitCore elif jit_type == "gcc": from miasm.jitter.jitcore_gcc import JitCore_Gcc as JitCore else: raise ValueError("Unknown jitter %s" % jit_type) except ImportError: raise RuntimeError('Unsupported jitter: %s' % jit_type) self.jit = JitCore(self.lifter, self.bs) if isinstance(self.jit, JitCore_Cc_Base): self.jit.init_codegen(self.C_Gen(self.lifter)) elif jit_type == "python": self.jit.set_cpu_vm(self.cpu, self.vm) self.cpu.init_regs() self.vm.init_memory_page_pool() self.vm.init_code_bloc_pool() self.vm.init_memory_breakpoint() self.jit.load() self.cpu.vmmngr = self.vm self.cpu.jitter = self.jit self.stack_size = 0x10000 self.stack_base = 0x1230000 # Init callback handler self.breakpoints_handler = CallbackHandler() self.exceptions_handler = CallbackHandlerBitflag() self.init_exceptions_handler() self.exec_cb = None
def __init__(self, ir_arch, jit_type="gcc"): """Init an instance of jitter. @ir_arch: ir instance for this architecture @jit_type: JiT backend to use. Available options are: - "gcc" - "llvm" - "python" """ self.arch = ir_arch.arch self.attrib = ir_arch.attrib arch_name = ir_arch.arch.name # (ir_arch.arch.name, ir_arch.attrib) try: if arch_name == "x86": from miasm.jitter.arch import JitCore_x86 as jcore elif arch_name == "arm": from miasm.jitter.arch import JitCore_arm as jcore elif arch_name == "armt": from miasm.jitter.arch import JitCore_arm as jcore ir_arch.arch.name = 'arm' elif arch_name == "aarch64": from miasm.jitter.arch import JitCore_aarch64 as jcore elif arch_name == "msp430": from miasm.jitter.arch import JitCore_msp430 as jcore elif arch_name == "mips32": from miasm.jitter.arch import JitCore_mips32 as jcore elif arch_name == "ppc32": from miasm.jitter.arch import JitCore_ppc32 as jcore elif arch_name == "mep": from miasm.jitter.arch import JitCore_mep as jcore else: raise ValueError("unknown jit arch: %s" % arch_name) except ImportError: raise RuntimeError('Unsupported jit arch: %s' % arch_name) self.vm = VmMngr.Vm() self.cpu = jcore.JitCpu() self.ir_arch = ir_arch self.bs = bin_stream_vm(self.vm) self.ircfg = self.ir_arch.new_ircfg() self.symbexec = EmulatedSymbExec( self.cpu, self.vm, self.ir_arch, {} ) self.symbexec.reset_regs() try: if jit_type == "llvm": from miasm.jitter.jitcore_llvm import JitCore_LLVM as JitCore elif jit_type == "python": from miasm.jitter.jitcore_python import JitCore_Python as JitCore elif jit_type == "gcc": from miasm.jitter.jitcore_gcc import JitCore_Gcc as JitCore else: raise ValueError("Unknown jitter %s" % jit_type) except ImportError: raise RuntimeError('Unsupported jitter: %s' % jit_type) self.jit = JitCore(self.ir_arch, self.bs) if isinstance(self.jit, JitCore_Cc_Base): self.jit.init_codegen(self.C_Gen(self.ir_arch)) elif jit_type == "python": self.jit.set_cpu_vm(self.cpu, self.vm) self.cpu.init_regs() self.vm.init_memory_page_pool() self.vm.init_code_bloc_pool() self.vm.init_memory_breakpoint() self.jit.load() self.cpu.vmmngr = self.vm self.cpu.jitter = self.jit self.stack_size = 0x10000 self.stack_base = 0x1230000 # Init callback handler self.breakpoints_handler = CallbackHandler() self.exceptions_handler = CallbackHandlerBitflag() self.init_exceptions_handler() self.exec_cb = None