from unicorn import * from unicorn.x86_const import * import pickle
print("Save/restore CPU context in opaque blob") address = 0 code = b'\x40'# inc eax try: # Initialize emulator mu = Uc(UC_ARCH_X86, UC_MODE_32)
# map 8KB memory for this emulation mu.mem_map(address, 8 * 1024, UC_PROT_ALL)
# write machine code to be emulated to memory mu.mem_write(address, code)
# set eax to 1 mu.reg_write(UC_X86_REG_EAX, 1)
print(">>> Running emulation for the first time") mu.emu_start(address, address+1)
print(">>> Emulation done. Below is the CPU context") print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX))) print(">>> Saving CPU context") saved_context = mu.context_save()
print(">>> Pickling CPU context") pickled_saved_context = pickle.dumps(saved_context)
print(">>> Running emulation for the second time") mu.emu_start(address, address+1) print(">>> Emulation done. Below is the CPU context") print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX)))
print(">>> Unpickling CPU context") saved_context = pickle.loads(pickled_saved_context)
print(">>> Modifying some register.") saved_context.reg_write(UC_X86_REG_EAX, 0xc8c8)
print(">>> CPU context restored. Below is the CPU context") mu.context_restore(saved_context) print(">>> EAX = 0x%x" %(mu.reg_read(UC_X86_REG_EAX)))