diff options
Diffstat (limited to 'miasm2/ir')
| -rw-r--r-- | miasm2/ir/ir.py | 15 | ||||
| -rw-r--r-- | miasm2/ir/symbexec.py | 16 | ||||
| -rw-r--r-- | miasm2/ir/translators/C.py | 24 | ||||
| -rw-r--r-- | miasm2/ir/translators/z3_ir.py | 6 |
4 files changed, 52 insertions, 9 deletions
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py index 721101e2..38a24263 100644 --- a/miasm2/ir/ir.py +++ b/miasm2/ir/ir.py @@ -440,6 +440,21 @@ class IRBlock(object): return '\n'.join(out) + def simplify(self, simplifier): + """ + Simplify expressions in each assignblock + @simplifier: ExpressionSimplifier instance + """ + modified = False + assignblks = [] + for assignblk in self: + new_assignblk = assignblk.simplify(simplifier) + if assignblk != new_assignblk: + modified = True + assignblks.append(new_assignblk) + return modified, IRBlock(self.loc_key, assignblks) + + class irbloc(IRBlock): """ DEPRECATED object diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py index 9ab455da..1a077de5 100644 --- a/miasm2/ir/symbexec.py +++ b/miasm2/ir/symbexec.py @@ -4,7 +4,7 @@ from collections import MutableMapping from miasm2.expression.expression import ExprOp, ExprId, ExprLoc, ExprInt, \ ExprMem, ExprCompose, ExprSlice, ExprCond -from miasm2.expression.simplifications import expr_simp +from miasm2.expression.simplifications import expr_simp_explicit from miasm2.ir.ir import AssignBlock log = logging.getLogger("symbexec") @@ -138,7 +138,7 @@ class MemArray(MutableMapping): """ - def __init__(self, base, expr_simp=expr_simp): + def __init__(self, base, expr_simp=expr_simp_explicit): self._base = base self.expr_simp = expr_simp self._mask = int(base.mask) @@ -461,7 +461,7 @@ class MemSparse(object): """ - def __init__(self, addrsize, expr_simp=expr_simp): + def __init__(self, addrsize, expr_simp=expr_simp_explicit): """ @addrsize: size (in bits) of the addresses manipulated by the MemSparse @expr_simp: an ExpressionSimplifier instance @@ -604,7 +604,7 @@ class MemSparse(object): class SymbolMngr(object): """Symbolic store manager (IDs and MEMs)""" - def __init__(self, init=None, addrsize=None, expr_simp=expr_simp): + def __init__(self, init=None, addrsize=None, expr_simp=expr_simp_explicit): assert addrsize is not None if init is None: init = {} @@ -807,7 +807,7 @@ class SymbolicExecutionEngine(object): def __init__(self, ir_arch, state=None, func_read=None, func_write=None, - sb_expr_simp=expr_simp): + sb_expr_simp=expr_simp_explicit): self.expr_to_visitor = { ExprInt: self.eval_exprint, @@ -823,7 +823,7 @@ class SymbolicExecutionEngine(object): if state is None: state = {} - self.symbols = SymbolMngr(addrsize=ir_arch.addrsize, expr_simp=expr_simp) + self.symbols = SymbolMngr(addrsize=ir_arch.addrsize, expr_simp=sb_expr_simp) for dst, src in state.iteritems(): self.symbols.write(dst, src) @@ -1270,9 +1270,9 @@ class symbexec(SymbolicExecutionEngine): def __init__(self, ir_arch, known_symbols, func_read=None, func_write=None, - sb_expr_simp=expr_simp): + sb_expr_simp=expr_simp_explicit): warnings.warn("Deprecated API: use SymbolicExecutionEngine") super(symbexec, self).__init__(ir_arch, known_symbols, func_read, func_write, - sb_expr_simp=expr_simp) + sb_expr_simp=sb_expr_simp) diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 11ccf137..33c21049 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -1,7 +1,7 @@ from miasm2.ir.translators.translator import Translator from miasm2.core import asmblock from miasm2.expression.modint import size2mask - +from miasm2.expression.expression import ExprInt, ExprCond, ExprCompose def int_size_to_bn(value, size): if size < 32: @@ -125,6 +125,28 @@ class TranslatorC(Translator): out = 'parity(%s)' % out return out + elif expr.op.startswith("zeroExt_"): + arg = expr.args[0] + if expr.size == arg.size: + return arg + return self.from_expr(ExprCompose(arg, ExprInt(0, expr.size - arg.size))) + + elif expr.op.startswith("signExt_"): + arg = expr.args[0] + if expr.size == arg.size: + return arg + add_size = expr.size - arg.size + new_expr = ExprCompose( + arg, + ExprCond( + arg.msb(), + ExprInt(size2mask(add_size), add_size), + ExprInt(0, add_size) + ) + ) + return self.from_expr(new_expr) + + elif expr.op in ['cntleadzeros', 'cnttrailzeros']: arg = expr.args[0] out = self.from_expr(arg) diff --git a/miasm2/ir/translators/z3_ir.py b/miasm2/ir/translators/z3_ir.py index 887c68d0..1b0578b7 100644 --- a/miasm2/ir/translators/z3_ir.py +++ b/miasm2/ir/translators/z3_ir.py @@ -229,6 +229,12 @@ class TranslatorZ3(Translator): index = - i % size out = size - (index + 1) res = z3.If((src & (1 << index)) != 0, out, res) + elif expr.op.startswith("zeroExt"): + arg, = expr.args + res = z3.ZeroExt(expr.size - arg.size, self.from_expr(arg)) + elif expr.op.startswith("signExt"): + arg, = expr.args + res = z3.SignExt(expr.size - arg.size, self.from_expr(arg)) else: raise NotImplementedError("Unsupported OP yet: %s" % expr.op) |