about summary refs log tree commit diff stats
path: root/example/expression/constant_propagation.py
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2017-08-08 11:24:22 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2017-08-09 08:01:15 +0200
commitd2756cb85f4b06280fb38eb32f6322ffbd0e17ca (patch)
treee506ea61f70740b79446f2400d8f6da36a7d4365 /example/expression/constant_propagation.py
parente6f2b1431e0364583385a44d03a78775d9578dd9 (diff)
downloadmiasm-d2756cb85f4b06280fb38eb32f6322ffbd0e17ca.tar.gz
miasm-d2756cb85f4b06280fb38eb32f6322ffbd0e17ca.zip
Example: add constant expression propagation
Diffstat (limited to 'example/expression/constant_propagation.py')
-rw-r--r--example/expression/constant_propagation.py54
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())