Skip to content

Commit

Permalink
Merge pull request #892 from crass/fix-restore-order
Browse files Browse the repository at this point in the history
Fix restore causing unicorn cpu exception
  • Loading branch information
xwings authored Aug 24, 2021
2 parents ed15759 + a97010c commit 6304b20
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 3 deletions.
6 changes: 3 additions & 3 deletions qiling/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -778,15 +778,15 @@ def restore(self, saved_states=None, snapshot=None):
with open(snapshot, "rb") as load_state:
saved_states = pickle.load(load_state)

if "mem" in saved_states:
self.mem.restore(saved_states["mem"])

if "cpu_context" in saved_states:
self.arch.context_restore(saved_states["cpu_context"])

if "reg" in saved_states:
self.reg.restore(saved_states["reg"])

if "mem" in saved_states:
self.mem.restore(saved_states["mem"])

if "fd" in saved_states:
self.os.fd.restore(saved_states["fd"])

Expand Down
42 changes: 42 additions & 0 deletions tests/test_elf.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,48 @@ def stop(ql, *args, **kw):

del ql

def _test_elf_linux_x86_snapshot_restore_common(self, reg=False, ctx=False):
rootfs = "../examples/rootfs/x86_linux"
cmdline = ["../examples/rootfs/x86_linux/bin/x86_hello"]
snapshot = os.path.join(rootfs, 'snapshot_restore_reg_ctx.snapshot')

ql = Qiling(cmdline, rootfs, verbose=QL_VERBOSE.DEBUG)

X86BASE = int(ql.profile.get("OS32", "load_address"), 16)
hook_address = X86BASE + 0x542 # call printf

def dump(ql):
nonlocal snapshot
nonlocal reg
nonlocal ctx
ql.save(reg=reg, cpu_context=ctx, os_context=True, loader=True, snapshot=snapshot)
ql.emu_stop()
ql.hook_address(dump, hook_address)

ql.run()

# make sure that the ending PC is the same as the hook address because dump stops the emulater
assert ql.reg.arch_pc == hook_address, f"0x{ql.reg.arch_pc:x} != 0x{hook_address:x}"
del ql

ql = Qiling(cmdline, rootfs, verbose=QL_VERBOSE.DEBUG)
ql.restore(snapshot=snapshot)

# ensure that the starting PC is same as the PC we stopped on when taking the snapshot
assert ql.reg.arch_pc == hook_address, f"0x{ql.reg.arch_pc:x} != 0x{hook_address:x}"

ql.run(begin=hook_address)
del ql

def test_elf_linux_x86_snapshot_restore_reg(self):
self._test_elf_linux_x86_snapshot_restore_common(reg=True, ctx=False)

def test_elf_linux_x86_snapshot_restore_ctx(self):
self._test_elf_linux_x86_snapshot_restore_common(reg=False, ctx=True)

def test_elf_linux_x86_snapshot_restore_reg_ctx(self):
self._test_elf_linux_x86_snapshot_restore_common(reg=True, ctx=True)

PARAMS_PUTS = {'s': STRING}

def test_elf_linux_x8664(self):
Expand Down

0 comments on commit 6304b20

Please sign in to comment.