diff options
| -rw-r--r-- | miasm2/ir/symbexec.py | 14 | ||||
| -rw-r--r-- | test/ir/symbexec.py | 6 |
2 files changed, 18 insertions, 2 deletions
diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py index 9ac79b1f..ba19ccf7 100644 --- a/miasm2/ir/symbexec.py +++ b/miasm2/ir/symbexec.py @@ -336,7 +336,6 @@ class symbexec(object): val = self.symbols[a][ptr_diff * 8 + b.size:a.size] out.append((m2_expr.ExprMem(ex, val.size), val)) return out - # give mem stored overlapping requested mem ptr def get_mem_overlapping(self, e, eval_cache=None): if eval_cache is None: @@ -452,3 +451,16 @@ class symbexec(object): if m.arg == 1: del self.symbols[mem] + def apply_expr(self, expr): + """Evaluate @expr and apply side effect if needed (ie. if expr is an + assignment). Return the evaluated value""" + + # Eval expression + to_eval = expr.src if isinstance(expr, m2_expr.ExprAff) else expr + ret = self.expr_simp(self.eval_expr(to_eval)) + + # Update value if needed + if isinstance(expr, m2_expr.ExprAff): + self.eval_ir([m2_expr.ExprAff(expr.dst, ret)]) + + return ret diff --git a/test/ir/symbexec.py b/test/ir/symbexec.py index 1d87b470..9165fccb 100644 --- a/test/ir/symbexec.py +++ b/test/ir/symbexec.py @@ -7,7 +7,8 @@ import unittest class TestSymbExec(unittest.TestCase): def test_ClassDef(self): - from miasm2.expression.expression import ExprInt32, ExprId, ExprMem, ExprCompose + from miasm2.expression.expression import ExprInt32, ExprId, ExprMem, \ + ExprCompose, ExprAff from miasm2.arch.x86.sem import ir_x86_32 from miasm2.ir.symbexec import symbexec @@ -52,6 +53,9 @@ class TestSymbExec(unittest.TestCase): self.assertEqual(set(e.modified()), set(e.symbols)) self.assertRaises( KeyError, e.symbols.__getitem__, ExprMem(ExprInt32(100))) + self.assertEqual(e.apply_expr(id_eax), addr0) + self.assertEqual(e.apply_expr(ExprAff(id_eax, addr9)), addr9) + self.assertEqual(e.apply_expr(id_eax), addr9) if __name__ == '__main__': testsuite = unittest.TestLoader().loadTestsFromTestCase(TestSymbExec) |