about summary refs log tree commit diff stats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--miasm/arch/ia32_sem.py11
-rw-r--r--miasm/expression/expression.py7
-rw-r--r--miasm/expression/expression_eval_abstract.py2
-rwxr-xr-xmiasm/tools/emul_helper.py27
-rw-r--r--miasm/tools/pe_helper.py21
5 files changed, 47 insertions, 21 deletions
diff --git a/miasm/arch/ia32_sem.py b/miasm/arch/ia32_sem.py
index 3ae64478..4abcbe51 100644
--- a/miasm/arch/ia32_sem.py
+++ b/miasm/arch/ia32_sem.py
@@ -1576,6 +1576,9 @@ def faddp(a, b = None):
         e+=float_pop(a)
     return e
 
+def fninit():
+    return []
+
 
 def fsub(a, b = None):
     if b == None:
@@ -1818,6 +1821,12 @@ def l_sysenter():
     return e
 
 #XXX
+def l_out(a, b):
+    e= []
+    e.append(ExprAff(ExprId('vmcpu.vm_exception_flags'), ExprInt(uint32(EXCEPT_PRIV_INSN))))
+    return e
+
+#XXX
 def l_outs():
     e= []
     e.append(ExprAff(ExprId('vmcpu.vm_exception_flags'), ExprInt(uint32(EXCEPT_PRIV_INSN)))) #SOFT BP
@@ -2025,6 +2034,7 @@ mnemo_func = {'mov': mov,
               'fldl2e':fldl2e,
               'fild':fild,
               'fadd':fadd,
+              'fninit':fninit,
               'faddp':faddp,
               'fsub':fsub,
               'fmul':fmul,
@@ -2061,6 +2071,7 @@ mnemo_func = {'mov': mov,
               'into':into,
               'in':l_in,
               'outs':l_outs,
+              'out':l_out,
               "sysenter":l_sysenter,
               "cmpxchg":cmpxchg,
               }
diff --git a/miasm/expression/expression.py b/miasm/expression/expression.py
index 49dc1a50..5108deab 100644
--- a/miasm/expression/expression.py
+++ b/miasm/expression/expression.py
@@ -300,6 +300,8 @@ class ExprCond(Expr):
     def get_size(self):
         return self.src1.get_size()
     def reload_expr(self, g = {}):
+        if self in g:
+            return g[self]
         src1 = self.src1
         if isinstance(src1, Expr):
             src1 = self.src1.reload_expr(g)
@@ -396,13 +398,14 @@ class ExprOp(Expr):
                 a = self.args[1].get_size()
         return a
     def reload_expr(self, g = {}):
+        if self in g:
+            return g[self]
         args = []
         for a in self.args:
             if isinstance(a, Expr):
                 args.append(a.reload_expr(g))
             else:
-                args.append(a)    
-        
+                args.append(a)
         return ExprOp(self.op, *args )
     def __contains__(self, e):
         if self == e:
diff --git a/miasm/expression/expression_eval_abstract.py b/miasm/expression/expression_eval_abstract.py
index 7140da1d..8263d930 100644
--- a/miasm/expression/expression_eval_abstract.py
+++ b/miasm/expression/expression_eval_abstract.py
@@ -589,7 +589,7 @@ class eval_abs:
         
         types_tab = [type(a) for a  in args]
         if types_tab.count(types_tab[0]) != len(args) and not e.op in self.op_size_no_check:
-            raise 'invalid cast %s %s'%(str(types_tab), str(args))
+            raise ValueError('invalid cast %r %r'%(types_tab, args))
         
         cast_int = types_tab[0]
         op_size = tab_int_size[types_tab[0]]
diff --git a/miasm/tools/emul_helper.py b/miasm/tools/emul_helper.py
index f452cc79..d4bd8c25 100755
--- a/miasm/tools/emul_helper.py
+++ b/miasm/tools/emul_helper.py
@@ -130,11 +130,7 @@ def mem_write(evaluator, env, mem_size, dst_address, src_val, pool_out = None):
         dump_pool(evaluator.pool)
         raise' write bug'
 
-  
-        
-    
- 
-###XXX for eval int 
+###XXX for eval int
 def get_instr_expr_args(name, modifs, mnemo_mode, args, my_eip):
     for a in args:
         if type(a) in [int, long]:
@@ -143,14 +139,25 @@ def get_instr_expr_args(name, modifs, mnemo_mode, args, my_eip):
 
     if name in ['jmp']:
         if isinstance(args[0], ExprInt):
-            e = mnemo_func[name](ExprOp('+', my_eip, args[0]))
+            print "X"*0x10, args[0]
+            arga = args[0].arg
+            if isinstance(arga, uint8):
+                arga = int8(arga)
+            e = mnemo_func[name](ExprOp('+', my_eip, ExprInt(uint32(arga))))
         else:
             e = mnemo_func[name](*args)
     elif name in jcc:
-        e = mnemo_func[name](my_eip, ExprOp('+', my_eip, args[0]))
+        arga = args[0].arg
+        if isinstance(arga, uint8):
+            arga = int8(arga)
+        e = mnemo_func[name](my_eip, ExprOp('+', my_eip, ExprInt(uint32(arga))))
     elif name in ['call']:
         if isinstance(args[0], ExprInt):# or is_imm(args[0]):
-            e = mnemo_func[name](my_eip, ExprOp('+', my_eip, args[0]))
+            arga = args[0].arg
+            if isinstance(arga, uint8):
+                arga = int8(arga)
+
+            e = mnemo_func[name](my_eip, ExprOp('+', my_eip, ExprInt(uint32(arga))))
         else:
             e = mnemo_func[name](my_eip, args[0])
     else:
@@ -166,7 +173,7 @@ def get_instr_expr(l, my_eip, args = None):
     return get_instr_expr_args(l.m.name, l.m.modifs, l.mnemo_mode, args, my_eip)
 
 
-
+"""
 ###XXX for eval abs
 def get_instr_expr_args(name, modifs, mnemo_mode, args, my_eip):
     for a in args:
@@ -186,7 +193,7 @@ def get_instr_expr_args(name, modifs, mnemo_mode, args, my_eip):
     else:
         e = mnemo_func[name](*args)
     return e
-
+"""
 ###XXX for eval abs
 def get_instr_expr(l, my_eip, args = None):
     if args==None:args = []
diff --git a/miasm/tools/pe_helper.py b/miasm/tools/pe_helper.py
index 34b2302d..8d912e24 100644
--- a/miasm/tools/pe_helper.py
+++ b/miasm/tools/pe_helper.py
@@ -381,21 +381,26 @@ class libimp:
         self.lib_imp2ad = {}
         self.lib_imp2dstad = {}
         self.fad2cname = {}
-        
+
     def lib_get_add_base(self, name):
         name = name.lower()
+        if not name.lower().endswith('.dll'):
+            print 'warning adding .dll to modulename'
+            name += '.dll'
+            print name
+
         if name in self.name2off:
             ad = self.name2off[name]
         else:
-            print 'new lib', name
             ad = self.libbase_ad
+            print 'new lib', name, hex(ad)
             self.name2off[name] = ad
             self.libbase2lastad[ad] = ad+0x1
             self.lib_imp2ad[ad] = {}
             self.lib_imp2dstad[ad] = {}
             self.libbase_ad += 0x1000
         return ad
-    
+
     def lib_get_add_func(self, libad, imp_ord_or_name, dst_ad = None):
         if not libad in self.name2off.values():
             raise ValueError('unknown lib base!', hex(libad))
@@ -416,7 +421,7 @@ class libimp:
             return self.lib_imp2ad[libad][imp_ord_or_name]
         #print 'new imp', imp_ord_or_name, dst_ad
         ad = self.libbase2lastad[libad]
-        self.libbase2lastad[libad] += 0x1
+        self.libbase2lastad[libad] += 0x11 # arbitrary
         self.lib_imp2ad[libad][imp_ord_or_name] = ad
 
         name_inv = dict([(x[1], x[0]) for x in self.name2off.items()])
@@ -493,6 +498,10 @@ class libimp:
     def gen_new_lib(self, e):
         new_lib = []
         for n, ad in self.name2off.items():
+            out_ads = dict()
+            for k, vs in self.lib_imp2dstad[ad].items():
+                for v in vs:
+                    out_ads[v] = k
             all_ads = self.lib_imp2dstad[ad].values()
             all_ads = reduce(lambda x,y:x+list(y), all_ads, [])
             all_ads.sort()
@@ -508,10 +517,6 @@ class libimp:
                 i = 0
                 while i+1 < len(all_ads) and all_ads[i]+4 == all_ads[i+1]:
                     i+=1
-                out_ads = dict()
-                for k, vs in self.lib_imp2dstad[ad].items():
-                    for v in vs:
-                        out_ads[v] = k
                 funcs = [out_ads[x] for x in all_ads[:i+1]]
                 if e.is_in_virt_address(othunk):
                     new_lib.append(({"name":n,