diff options
Diffstat (limited to 'miasm2/ir/symbexec.py')
| -rw-r--r-- | miasm2/ir/symbexec.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py index 76bb65b6..5bdcac2f 100644 --- a/miasm2/ir/symbexec.py +++ b/miasm2/ir/symbexec.py @@ -79,7 +79,7 @@ class symbols(): return s -class symbexec: +class symbexec(object): def __init__(self, ir_arch, known_symbols, func_read=None, @@ -99,6 +99,8 @@ class symbexec: return None def eval_ExprId(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} if isinstance(e.name, asmbloc.asm_label) and e.name.offset is not None: return ExprInt_from(e, e.name.offset) if not e in self.symbols: @@ -110,6 +112,8 @@ class symbexec: return e def eval_ExprMem(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} a_val = self.expr_simp(self.eval_expr(e.arg, eval_cache)) if a_val != e.arg: a = self.expr_simp(ExprMem(a_val, size=e.size)) @@ -198,9 +202,13 @@ class symbexec: return tmp def eval_expr_visit(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} # print 'visit', e, e.is_term if e.is_term: return e + if e in eval_cache: + return eval_cache[e] c = e.__class__ deal_class = {ExprId: self.eval_ExprId, ExprInt: self.eval_ExprInt, @@ -215,6 +223,8 @@ class symbexec: return e def eval_expr(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} r = e.visit(lambda x: self.eval_expr_visit(x, eval_cache)) return r @@ -319,6 +329,8 @@ class symbexec: # give mem stored overlapping requested mem ptr def get_mem_overlapping(self, e, eval_cache=None): + if eval_cache is None: + eval_cache = {} if not isinstance(e, ExprMem): raise ValueError('mem overlap bad arg') ov = [] @@ -346,7 +358,7 @@ class symbexec: def eval_ir_expr(self, exprs): pool_out = {} - eval_cache = {} + eval_cache = dict(self.symbols.items()) for e in exprs: if not isinstance(e, ExprAff): @@ -377,10 +389,10 @@ class symbexec: mem_dst = [] # src_dst = [(x.src, x.dst) for x in ir] src_dst = self.eval_ir_expr(ir) - + eval_cache = dict(self.symbols.items()) for dst, src in src_dst: if isinstance(dst, ExprMem): - mem_overlap = self.get_mem_overlapping(dst) + mem_overlap = self.get_mem_overlapping(dst, eval_cache) for _, base in mem_overlap: diff_mem = self.substract_mems(base, dst) del(self.symbols[base]) @@ -401,7 +413,8 @@ class symbexec: if step: print '_' * 80 self.dump_id() - return self.eval_expr(self.ir_arch.IRDst) + eval_cache = dict(self.symbols.items()) + return self.eval_expr(self.ir_arch.IRDst, eval_cache) def emul_ir_bloc(self, myir, ad, step = False): b = myir.get_bloc(ad) |