about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2016-03-21 13:11:21 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2016-03-21 15:09:23 +0100
commit7ab305601b1f274967187bb8182ce47e94ee0dd8 (patch)
tree7802deb6bf51eb68bab438c08213b523682c3bd2
parent3c1360202b6da4c32f8db350fb4b75060df88dcb (diff)
downloadmiasm-7ab305601b1f274967187bb8182ce47e94ee0dd8.tar.gz
miasm-7ab305601b1f274967187bb8182ce47e94ee0dd8.zip
Example/Depgraph: add JSON output
-rw-r--r--example/symbol_exec/depgraph.py39
1 files changed, 31 insertions, 8 deletions
diff --git a/example/symbol_exec/depgraph.py b/example/symbol_exec/depgraph.py
index d30b1ef0..48758ad0 100644
--- a/example/symbol_exec/depgraph.py
+++ b/example/symbol_exec/depgraph.py
@@ -1,5 +1,6 @@
 from argparse import ArgumentParser
 from pdb import pm
+import json
 
 from miasm2.analysis.machine import Machine
 from miasm2.analysis.binary import Container
@@ -24,6 +25,9 @@ parser.add_argument("--do-not-simplify", help="Do not simplify expressions",
 parser.add_argument("--rename-args",
                     help="Rename common arguments (@32[ESP_init] -> Arg1)",
                     action="store_true")
+parser.add_argument("--json",
+                    help="Output solution in JSON",
+                    action="store_true")
 args = parser.parse_args()
 
 # Get architecture
@@ -76,24 +80,43 @@ for line_nb, line in enumerate(current_block.lines):
         break
 
 # Enumerate solutions
+json_solutions = []
 for sol_nb, sol in enumerate(dg.get(current_block.label, elements, line_nb, set())):
     fname = "sol_%d.dot" % sol_nb
     with open(fname, "w") as fdesc:
             fdesc.write(sol.graph.dot())
-    result = ", ".join("%s: %s" % (k, v)
-                       for k, v in sol.emul(ctx=init_ctx).iteritems())
-    print "Solution %d: %s -> %s" % (sol_nb,
-                                     result,
-                                     fname)
+
+    results = sol.emul(ctx=init_ctx)
+    tokens = {str(k): str(v) for k, v in results.iteritems()}
+    if not args.json:
+        result = ", ".join("=".join(x) for x in tokens.iteritems())
+        print "Solution %d: %s -> %s" % (sol_nb,
+                                         result,
+                                         fname)
+        if sol.has_loop:
+            print '\tLoop involved'
+
     if args.implicit:
         sat = sol.is_satisfiable
-        constraints = ""
+        constraints = {}
         if sat:
-            constraints = {}
             for element in sol.constraints:
                 try:
                     result = hex(sol.constraints[element].as_long())
                 except AttributeError:
                     result = str(sol.constraints[element])
                 constraints[element] = result
-        print "\tSatisfiability: %s %s" % (sat, constraints)
+        if args.json:
+            tokens["satisfiability"] = sat
+            tokens["constraints"] = {str(k): str(v)
+                                     for k, v in constraints.iteritems()}
+        else:
+            print "\tSatisfiability: %s %s" % (sat, constraints)
+
+    if args.json:
+        tokens["has_loop"] = sol.has_loop
+        json_solutions.append(tokens)
+
+
+if args.json:
+    print json.dumps(json_solutions)