diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2017-01-06 14:19:49 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-01-06 14:19:49 +0100 |
| commit | c5d47bd8cdb510c78501adae460b35d122042563 (patch) | |
| tree | bf79f51e70c2ad851c94a3af4920570cce73a88d /test/jitter/jit_options.py | |
| parent | f89a4638923b89c4e17fa6811a62a7d01bccbdee (diff) | |
| parent | e653d822b5a2efc5531c8e153305769a6ab17713 (diff) | |
| download | miasm-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.py | 97 |
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 |