diff options
Diffstat (limited to '')
| -rw-r--r-- | miasm/arch/ia32_sem.py | 11 | ||||
| -rw-r--r-- | miasm/expression/expression.py | 7 | ||||
| -rw-r--r-- | miasm/expression/expression_eval_abstract.py | 2 | ||||
| -rwxr-xr-x | miasm/tools/emul_helper.py | 27 | ||||
| -rw-r--r-- | miasm/tools/pe_helper.py | 21 |
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, |