diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-08-08 11:24:22 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2017-08-09 08:01:15 +0200 |
| commit | d2756cb85f4b06280fb38eb32f6322ffbd0e17ca (patch) | |
| tree | e506ea61f70740b79446f2400d8f6da36a7d4365 /example/expression | |
| parent | e6f2b1431e0364583385a44d03a78775d9578dd9 (diff) | |
| download | miasm-d2756cb85f4b06280fb38eb32f6322ffbd0e17ca.tar.gz miasm-d2756cb85f4b06280fb38eb32f6322ffbd0e17ca.zip | |
Example: add constant expression propagation
Diffstat (limited to 'example/expression')
| -rw-r--r-- | example/expression/constant_propagation.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/example/expression/constant_propagation.py b/example/expression/constant_propagation.py new file mode 100644 index 00000000..70394580 --- /dev/null +++ b/example/expression/constant_propagation.py @@ -0,0 +1,54 @@ +""" +Example of "constant expression" propagation. +A "constant expression" is an expression based on constants or init regs. + +""" + +from argparse import ArgumentParser + +from miasm2.arch.x86.disasm import dis_x86_32 as dis_engine +from miasm2.analysis.machine import Machine +from miasm2.analysis.binary import Container +from miasm2.analysis.cst_propag import propagate_cst_expr +from miasm2.analysis.data_flow import dead_simp +from miasm2.expression.simplifications import expr_simp + + +parser = ArgumentParser("Constant expression propagation") +parser.add_argument('filename', help="File to analyze") +parser.add_argument('address', help="Starting address for disassembly engine") +parser.add_argument('-s', "--simplify", action="store_true", + help="Apply simplifications rules (liveness, graph simplification, ...)") + +args = parser.parse_args() + + +machine = Machine("x86_32") + +cont = Container.from_stream(open(args.filename)) +ira, dis_engine = machine.ira, machine.dis_engine +mdis = dis_engine(cont.bin_stream) +ir_arch = ira(mdis.symbol_pool) +addr = int(args.address, 0) + + +blocks = mdis.dis_multiblock(addr) +for block in blocks: + ir_arch.add_block(block) + + +init_infos = ir_arch.arch.regs.regs_init +cst_propag_link = propagate_cst_expr(ir_arch, addr, init_infos) + +if args.simplify: + ir_arch.simplify(expr_simp) + modified = True + while modified: + modified = False + modified |= dead_simp(ir_arch) + modified |= ir_arch.remove_empty_assignblks() + modified |= ir_arch.remove_jmp_blocks() + modified |= ir_arch.merge_blocks() + + +open("%s.propag.dot" % args.filename, 'w').write(ir_arch.graph.dot()) |