about summary refs log tree commit diff stats
path: root/test/jitter/jit_options.py
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2017-01-06 14:19:49 +0100
committerGitHub <noreply@github.com>2017-01-06 14:19:49 +0100
commitc5d47bd8cdb510c78501adae460b35d122042563 (patch)
treebf79f51e70c2ad851c94a3af4920570cce73a88d /test/jitter/jit_options.py
parentf89a4638923b89c4e17fa6811a62a7d01bccbdee (diff)
parente653d822b5a2efc5531c8e153305769a6ab17713 (diff)
downloadmiasm-c5d47bd8cdb510c78501adae460b35d122042563.tar.gz
miasm-c5d47bd8cdb510c78501adae460b35d122042563.zip
Merge pull request #471 from commial/feature/llvm-cache
Feature/llvm cache
Diffstat (limited to '')
-rw-r--r--test/jitter/jit_options.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/test/jitter/jit_options.py b/test/jitter/jit_options.py
new file mode 100644
index 00000000..cc955c64
--- /dev/null
+++ b/test/jitter/jit_options.py
@@ -0,0 +1,97 @@
+import os
+import sys
+from miasm2.jitter.csts import PAGE_READ, PAGE_WRITE
+from miasm2.analysis.machine import Machine
+from pdb import pm
+
+# Shellcode
+
+# main:
+#       MOV EAX, 0x1
+# loop_main:
+#       CMP EAX, 0x10
+#       JZ loop_end
+# loop_inc:
+#       INC EAX
+#       JMP loop_main
+# loop_end:
+#       RET
+data = "b80100000083f810740340ebf8c3".decode("hex")
+run_addr = 0x40000000
+
+def code_sentinelle(jitter):
+    jitter.run = False
+    jitter.pc = 0
+    return True
+
+def init_jitter():
+    global data, run_addr
+    # Create jitter
+    myjit = Machine("x86_32").jitter(sys.argv[1])
+
+    myjit.vm.add_memory_page(run_addr, PAGE_READ | PAGE_WRITE, data)
+
+    # Init jitter
+    myjit.init_stack()
+    myjit.jit.log_regs = True
+    myjit.jit.log_mn = True
+    myjit.push_uint32_t(0x1337beef)
+
+    myjit.add_breakpoint(0x1337beef, code_sentinelle)
+    return myjit
+
+# Test 'max_exec_per_call'
+print "[+] First run, to jit blocks"
+myjit = init_jitter()
+myjit.init_run(run_addr)
+myjit.continue_run()
+
+assert myjit.run is False
+assert myjit.cpu.EAX  == 0x10
+
+## Let's specify a max_exec_per_call
+## 5: main, loop_main, loop_inc, loop_main, loop_inc
+myjit.jit.options["max_exec_per_call"] = 5
+
+first_call = True
+def cb(jitter):
+    global first_call
+    if first_call:
+        # Avoid breaking on the first pass (before any execution)
+        first_call = False
+        return True
+    return False
+
+## Second run
+print "[+] Second run"
+myjit.push_uint32_t(0x1337beef)
+myjit.cpu.EAX = 0
+myjit.init_run(run_addr)
+myjit.exec_cb = cb
+myjit.continue_run()
+
+assert myjit.run is True
+# Use a '<=' because it's a 'max_...'
+assert myjit.cpu.EAX <= 3
+
+# Test 'jit_maxline'
+print "[+] Run instr one by one"
+myjit = init_jitter()
+myjit.jit.options["jit_maxline"] = 1
+myjit.jit.options["max_exec_per_call"] = 1
+
+counter = 0
+def cb(jitter):
+    global counter
+    counter += 1
+    return True
+
+myjit.init_run(run_addr)
+myjit.exec_cb = cb
+myjit.continue_run()
+
+assert myjit.run is False
+assert myjit.cpu.EAX  == 0x10
+## dry(1) + main(1) + (loop_main(2) + loop_inc(2))*(0x10 - 1) + loop_main(2) +
+## loop_end(1) = 65
+assert counter == 65