about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm/arch/ia32_sem.py12
-rw-r--r--miasm/expression/expression.py3
-rw-r--r--miasm/expression/expression_eval_abstract.py20
-rw-r--r--miasm/expression/expression_helper.py12
-rwxr-xr-xmiasm/tools/emul_helper.py6
5 files changed, 32 insertions, 21 deletions
diff --git a/miasm/arch/ia32_sem.py b/miasm/arch/ia32_sem.py
index 74237139..ac1f9b23 100644
--- a/miasm/arch/ia32_sem.py
+++ b/miasm/arch/ia32_sem.py
@@ -981,11 +981,21 @@ def seta(info, a):
     e.append(ExprAff(a, ExprCond(ExprOp('&', ExprOp('==', cf, ExprInt(uint32(0))), ExprOp('==', zf, ExprInt(uint32(0)))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0)))))
     return e
 
+def setae(info, a):
+    e = []
+    e.append(ExprAff(a, ExprCond(ExprOp('==', cf, ExprInt(uint32(0))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0)))))
+    return e
+
 def setb(info, a):
     e = []
     e.append(ExprAff(a, ExprCond(ExprOp('==', cf, ExprInt(uint32(1))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0)))))
     return e
 
+def setbe(info, a):
+    e = []
+    e.append(ExprAff(a, ExprCond(ExprOp('&', ExprOp('==', cf, ExprInt(uint32(1))), ExprOp('==', zf, ExprInt(uint32(1)))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0)))))
+    return e
+
 def setns(info, a):
     e = []
     e.append(ExprAff(a, ExprCond(ExprOp('==', nf, ExprInt(uint32(0))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0)))))
@@ -2056,7 +2066,9 @@ mnemo_func = {'mov': mov,
               'setg':setg,
               'setge':setge,
               'seta':seta,
+              'setae':setae,
               'setb':setb,
+              'setbe':setbe,
               'setns':setns,
               'sets':sets,
               'seto':seto,
diff --git a/miasm/expression/expression.py b/miasm/expression/expression.py
index fd560c54..ae8b415b 100644
--- a/miasm/expression/expression.py
+++ b/miasm/expression/expression.py
@@ -115,6 +115,7 @@ class Expr:
         
 class ExprTop(Expr):
     def __init__(self, e=None):
+        fdqs
         self.e = e
         pass
     def __str__(self):
@@ -680,6 +681,8 @@ class ExprCompose(Expr):
     def get_size(self):
         return max([x.stop for x in self.args]) - min([x.start for x in self.args])
     def reload_expr(self, g = {}):
+        if self in g:
+            return g[self]
         args = []
         for a in self.args:
             if isinstance(a, Expr):
diff --git a/miasm/expression/expression_eval_abstract.py b/miasm/expression/expression_eval_abstract.py
index 8263d930..3f1a1d19 100644
--- a/miasm/expression/expression_eval_abstract.py
+++ b/miasm/expression/expression_eval_abstract.py
@@ -473,12 +473,12 @@ class eval_abs:
 
     def eval_ExprId(self, e, eval_cache = {}):
         if not e in self.pool:
-            return ExprTop(e)
+            return e
         return self.pool[e]
 
     def eval_ExprInt(self, e, eval_cache = {}):
         return e
-    
+
     def eval_ExprMem(self, e, eval_cache = {}):
         a_val = expr_simp(self.eval_expr(e.arg, eval_cache))
         if isinstance(a_val, ExprTop):
@@ -486,12 +486,9 @@ class eval_abs:
             ee =   ExprMem(e.arg, e.size)
             ee.is_term = True
             return ee
-        
-        
         a = expr_simp(ExprMem(a_val, size = e.size))
         if a in self.pool:
             return self.pool[a]
-        
         tmp = None
         #test if mem lookup is known
         for k in self.pool:
@@ -532,11 +529,9 @@ class eval_abs:
                 #XXX hack test
                 a.is_term = True
                 return a
-        
         #eq lookup
         if a.size == k.size:
             return self.pool[tmp]
-        
         #bigger lookup
         if a.size > k.size:
             rest = a.size
@@ -547,28 +542,23 @@ class eval_abs:
                 v = self.find_mem_by_addr(ptr)
                 if v == None:
                     raise ValueError("cannot find %s in mem"%str(ptr))
-
-                if (rest-v.size) >=0:
+                if rest >= v.size:
                     val = self.pool[v]
                     diff_size = v.size
                 else:
-                    diff_size = v.size-rest
+                    diff_size = rest
                     val = self.pool[v][0:diff_size]
-                    
                 val = ExprSliceTo(val, ptr_index, ptr_index+diff_size)
-                
                 out.append(val)
                 ptr_index+=diff_size
                 rest -= diff_size
                 ptr = expr_simp(self.eval_expr(ExprOp('+', ptr, ExprInt(uint32(v.size/8))), eval_cache))
             e = expr_simp(ExprCompose(out))
             return e
-        
         #part lookup
         tmp = expr_simp(ExprSlice(self.pool[tmp], 0, a.size))
-        
         return tmp
-    
+
     def eval_ExprOp(self, e, eval_cache = {}):
         args = []
         for a in e.args:
diff --git a/miasm/expression/expression_helper.py b/miasm/expression/expression_helper.py
index 99f8331e..912250c3 100644
--- a/miasm/expression/expression_helper.py
+++ b/miasm/expression/expression_helper.py
@@ -26,7 +26,7 @@ tab_size_int = {8:uint8,
 tab_max_uint = {8:uint8(0xFF), 16:uint16(0xFFFF), 32:uint32(0xFFFFFFFF), 64:uint64(0xFFFFFFFFFFFFFFFFL)}
 
 
-def parity(self, a):
+def parity(a):
     tmp = (a)&0xFFL
     cpt = 1
     while tmp!=0:
@@ -40,7 +40,10 @@ def merge_sliceto_slice(args):
     sources_int = {}
     for a in args:
         if isinstance(a.arg, ExprInt):
-            sources_int[a.start] = a
+            #sources_int[a.start] = a
+            # copy ExprInt because we will inplace modify arg just below
+            # /!\ TODO XXX never ever modify inplace args...
+            sources_int[a.start] = ExprSliceTo(ExprInt(a.arg.arg.__class__(a.arg.arg)), a.start, a.stop)
         elif isinstance(a.arg, ExprSlice):
             if not a.arg.arg in sources:
                 sources[a.arg.arg] = []
@@ -161,8 +164,10 @@ def expr_simp_w(e):
         return ExprMem(expr_simp(e.arg), size = e.size)
     elif isinstance(e, ExprOp):
         op, args = e.op, list(e.args)
+        """
         if ExprTop() in args:
             return ExprTop()
+        """
         #int OP int => int
         if e.op in ['+', '-', '*', '|', '&', '^', '>>', '<<'] and isinstance(args[0], ExprInt) and isinstance(args[1], ExprInt) :
             if args[0].get_size() != args[1].get_size():
@@ -489,7 +494,6 @@ def expr_simp_w(e):
                                      
 
         if op == 'parity' and isinstance(args[0], ExprInt):
-            fsdfsdf
             return ExprInt(tab_size_int[args[0].get_size()](parity(args[0].arg)))
         
         new_e = ExprOp(op, *[expr_simp(x) for x in args])
@@ -597,8 +601,10 @@ def expr_simp_w(e):
                 break
         if all_top:
             return ExprTop()
+        """
         if ExprTop() in e.args:
             return ExprTop()
+        """
         
         args = merge_sliceto_slice(e.args)
         if len(args) == 1:
diff --git a/miasm/tools/emul_helper.py b/miasm/tools/emul_helper.py
index a36cba85..66521bf3 100755
--- a/miasm/tools/emul_helper.py
+++ b/miasm/tools/emul_helper.py
@@ -659,7 +659,7 @@ def digest_allbloc_instr(all_bloc, segm_to_do = {}):
     return instrs
 
 
-def x86_machine():
+def x86_machine(mem_read_wrap = None, mem_write_wrap = None):
     machine = eval_abs({esp:init_esp, ebp:init_ebp, eax:init_eax, ebx:init_ebx, ecx:init_ecx, edx:init_edx, esi:init_esi, edi:init_edi,
                         cs:ExprInt(uint32(9)),
                         zf :  init_zf,  nf :  init_nf, pf : init_pf,
@@ -674,8 +674,8 @@ def x86_machine():
                         #my_ret_addr:my_ret_addri
                         
                         },
-                       #mem_read_wrap,
-                       #mem_write_wrap,
+                       mem_read_wrap,
+                       mem_write_wrap,
                        
                        )
     return machine