about summary refs log tree commit diff stats
path: root/miasm2/analysis/data_analysis.py
diff options
context:
space:
mode:
Diffstat (limited to 'miasm2/analysis/data_analysis.py')
-rw-r--r--miasm2/analysis/data_analysis.py39
1 files changed, 22 insertions, 17 deletions
diff --git a/miasm2/analysis/data_analysis.py b/miasm2/analysis/data_analysis.py
index 30346e63..bd073fcb 100644
--- a/miasm2/analysis/data_analysis.py
+++ b/miasm2/analysis/data_analysis.py
@@ -1,5 +1,12 @@
+from __future__ import print_function
+
+from future.utils import viewitems
+
+from builtins import object
+from functools import cmp_to_key
 from miasm2.expression.expression \
-    import get_expr_mem, get_list_rw, ExprId, ExprInt
+    import get_expr_mem, get_list_rw, ExprId, ExprInt, \
+    compare_exprs
 from miasm2.ir.symbexec import SymbolicExecutionEngine
 
 
@@ -19,7 +26,7 @@ def intra_block_flow_raw(ir_arch, ircfg, flow_graph, irb, in_nodes, out_nodes):
 
         # gen mem arg to mem node links
         all_mems = set()
-        for node_w, nodes_r in dict_rw.iteritems():
+        for node_w, nodes_r in viewitems(dict_rw):
             for n in nodes_r.union([node_w]):
                 all_mems.update(get_expr_mem(n))
             if not all_mems:
@@ -40,7 +47,7 @@ def intra_block_flow_raw(ir_arch, ircfg, flow_graph, irb, in_nodes, out_nodes):
                     flow_graph.add_uniq_edge(node_n_r, node_n_w)
 
         # gen data flow links
-        for node_w, nodes_r in dict_rw.iteritems():
+        for node_w, nodes_r in viewitems(dict_rw):
             for n_r in nodes_r:
                 if n_r in current_nodes:
                     node_n_r = current_nodes[n_r]
@@ -65,11 +72,11 @@ def inter_block_flow_link(ir_arch, ircfg, flow_graph, irb_in_nodes, irb_out_node
 
     # link current nodes to bloc in_nodes
     if not lbl in ircfg.blocks:
-        print "cannot find bloc!!", lbl
+        print("cannot find bloc!!", lbl)
         return set()
     irb = ircfg.blocks[lbl]
     to_del = set()
-    for n_r, node_n_r in irb_in_nodes[irb.loc_key].items():
+    for n_r, node_n_r in viewitems(irb_in_nodes[irb.loc_key]):
         if not n_r in current_nodes:
             continue
         flow_graph.add_uniq_edge(current_nodes[n_r], node_n_r)
@@ -78,7 +85,7 @@ def inter_block_flow_link(ir_arch, ircfg, flow_graph, irb_in_nodes, irb_out_node
     # if link exec to data, all nodes depends on exec nodes
     if link_exec_to_data:
         for n_x_r in exec_nodes:
-            for n_r, node_n_r in irb_in_nodes[irb.loc_key].items():
+            for n_r, node_n_r in viewitems(irb_in_nodes[irb.loc_key]):
                 if not n_x_r in current_nodes:
                     continue
                 if isinstance(n_r, ExprInt):
@@ -86,15 +93,15 @@ def inter_block_flow_link(ir_arch, ircfg, flow_graph, irb_in_nodes, irb_out_node
                 flow_graph.add_uniq_edge(current_nodes[n_x_r], node_n_r)
 
     # update current nodes using bloc out_nodes
-    for n_w, node_n_w in irb_out_nodes[irb.loc_key].items():
+    for n_w, node_n_w in viewitems(irb_out_nodes[irb.loc_key]):
         current_nodes[n_w] = node_n_w
 
     # get nodes involved in exec flow
-    x_nodes = tuple(sorted(list(irb.dst.get_r())))
+    x_nodes = tuple(sorted(irb.dst.get_r(), key=cmp_to_key(compare_exprs)))
 
     todo = set()
     for lbl_dst in ircfg.successors(irb.loc_key):
-        todo.add((lbl_dst, tuple(current_nodes.items()), x_nodes))
+        todo.add((lbl_dst, tuple(viewitems(current_nodes)), x_nodes))
 
     return todo
 
@@ -109,7 +116,7 @@ def create_implicit_flow(ir_arch, flow_graph, irb_in_nodes, irb_out_ndes):
         irb = ir_arch.blocks[lbl]
         for lbl_son in ir_arch.graph.successors(irb.loc_key):
             if not lbl_son in ir_arch.blocks:
-                print "cannot find bloc!!", lbl
+                print("cannot find bloc!!", lbl)
                 continue
             irb_son = ir_arch.blocks[lbl_son]
             for n_r in irb_in_nodes[irb_son.loc_key]:
@@ -144,7 +151,7 @@ def inter_block_flow(ir_arch, ircfg, flow_graph, irb_0, irb_in_nodes, irb_out_no
         todo.update(out)
 
 
-class symb_exec_func:
+class symb_exec_func(object):
 
     """
     This algorithm will do symbolic execution on a function, trying to propagate
@@ -164,15 +171,13 @@ class symb_exec_func:
         self.ir_arch = ir_arch
 
     def add_state(self, parent, ad, state):
-        variables = dict(state.symbols.items())
+        variables = dict(state.symbols)
 
         # get bloc dead, and remove from state
         b = self.ir_arch.get_block(ad)
         if b is None:
             raise ValueError("unknown bloc! %s" % ad)
-        variables = variables.items()
-
-        s = parent, ad, tuple(sorted(variables))
+        s = parent, ad, tuple(sorted(viewitems(variables)))
         self.todo.add(s)
 
     def get_next_state(self):
@@ -183,10 +188,10 @@ class symb_exec_func:
         if len(self.todo) == 0:
             return None
         if self.total_done > 600:
-            print "symbexec watchdog!"
+            print("symbexec watchdog!")
             return None
         self.total_done += 1
-        print 'CPT', self.total_done
+        print('CPT', self.total_done)
         while self.todo:
             state = self.get_next_state()
             parent, ad, s = state