diff options
Diffstat (limited to '')
| -rw-r--r-- | miasm2/ir/ir.py | 15 | ||||
| -rw-r--r-- | miasm2/ir/symbexec.py | 6 | ||||
| -rw-r--r-- | miasm2/ir/translators/C.py | 8 | ||||
| -rw-r--r-- | miasm2/ir/translators/miasm.py | 3 | ||||
| -rw-r--r-- | miasm2/ir/translators/python.py | 8 | ||||
| -rw-r--r-- | miasm2/ir/translators/smt2.py | 6 | ||||
| -rw-r--r-- | miasm2/ir/translators/z3_ir.py | 6 |
7 files changed, 22 insertions, 30 deletions
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py index 2c6300a9..d8cccc64 100644 --- a/miasm2/ir/ir.py +++ b/miasm2/ir/ir.py @@ -46,7 +46,6 @@ class AssignBlock(dict): * if dst is an ExprSlice, expand it to affect the full Expression * if dst already known, sources are merged """ - if dst.size != src.size: raise RuntimeError( "sanitycheck: args must have same size! %s" % @@ -75,6 +74,7 @@ class AssignBlock(dict): expr_list = [(new_dst, new_src), (new_dst, self[new_dst])] # Find collision + print 'FIND COLISION' e_colision = reduce(lambda x, y: x.union(y), (self.get_modified_slice(dst, src) for (dst, src) in expr_list), @@ -109,17 +109,16 @@ class AssignBlock(dict): def get_modified_slice(dst, src): """Return an Expr list of extra expressions needed during the object instanciation""" - if not isinstance(src, m2_expr.ExprCompose): raise ValueError("Get mod slice not on expraff slice", str(self)) modified_s = [] - for arg in src.args: - if (not isinstance(arg[0], m2_expr.ExprSlice) or - arg[0].arg != dst or - arg[1] != arg[0].start or - arg[2] != arg[0].stop): + for index, arg in src.iter_args(): + if not (isinstance(arg, m2_expr.ExprSlice) and + arg.arg == dst and + index == arg.start and + index+arg.size == arg.stop): # If x is not the initial expression - modified_s.append(arg) + modified_s.append((arg, index, index+arg.size)) return modified_s def get_w(self): diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py index 65515c64..db3eacdc 100644 --- a/miasm2/ir/symbexec.py +++ b/miasm2/ir/symbexec.py @@ -229,9 +229,8 @@ class symbexec(object): ret = m2_expr.ExprOp(expr.op, *args) elif isinstance(expr, m2_expr.ExprCompose): args = [] - for (arg, start, stop) in expr.args: - arg = self.apply_expr_on_state_visit_cache(arg, state, cache, level+1) - args.append(arg) + for arg in expr.args: + args.append(self.apply_expr_on_state_visit_cache(arg, state, cache, level+1)) ret = m2_expr.ExprCompose(*args) else: raise TypeError("Unknown expr type") @@ -378,7 +377,6 @@ class symbexec(object): """ pool_out = {} eval_cache = {} - for dst, src in assignblk.iteritems(): src = self.eval_expr(src, eval_cache) if isinstance(dst, m2_expr.ExprMem): diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 340fbfec..57859f9c 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -145,11 +145,11 @@ class TranslatorC(Translator): out = [] # XXX check mask for 64 bit & 32 bit compat dst_cast = "uint%d_t" % expr.size - for x in expr.args: + for index, arg in expr.iter_args(): out.append("(((%s)(%s & 0x%X)) << %d)" % (dst_cast, - self.from_expr(x[0]), - (1 << (x[2] - x[1])) - 1, - x[1])) + self.from_expr(arg), + (1 << arg.size) - 1, + index)) out = ' | '.join(out) return '(' + out + ')' diff --git a/miasm2/ir/translators/miasm.py b/miasm2/ir/translators/miasm.py index 515148ee..b390eb51 100644 --- a/miasm2/ir/translators/miasm.py +++ b/miasm2/ir/translators/miasm.py @@ -27,8 +27,7 @@ class TranslatorMiasm(Translator): ", ".join(map(self.from_expr, expr.args))) def from_ExprCompose(self, expr): - args = ["%s" % self.from_expr(arg) - for arg, _, _ in expr.args] + args = ["%s" % self.from_expr(arg) for arg in expr.args] return "ExprCompose(%s)" % ", ".join(args) def from_ExprAff(self, expr): diff --git a/miasm2/ir/translators/python.py b/miasm2/ir/translators/python.py index f745d2df..c06d865c 100644 --- a/miasm2/ir/translators/python.py +++ b/miasm2/ir/translators/python.py @@ -31,10 +31,10 @@ class TranslatorPython(Translator): def from_ExprCompose(self, expr): out = [] - for subexpr, start, stop in expr.args: - out.append("((%s & 0x%x) << %d)" % (self.from_expr(subexpr), - (1 << (stop - start)) - 1, - start)) + for index, arg in expr.iter_args(): + out.append("((%s & 0x%x) << %d)" % (self.from_expr(arg), + (1 << arg.size) - 1, + index)) return "(%s)" % ' | '.join(out) def from_ExprCond(self, expr): diff --git a/miasm2/ir/translators/smt2.py b/miasm2/ir/translators/smt2.py index 5bffd7f2..5d5fb26b 100644 --- a/miasm2/ir/translators/smt2.py +++ b/miasm2/ir/translators/smt2.py @@ -163,10 +163,8 @@ class TranslatorSMT2(Translator): def from_ExprCompose(self, expr): res = None - args = sorted(expr.args, key=operator.itemgetter(2)) # sort by start off - for subexpr, start, stop in args: - sube = self.from_expr(subexpr) - e = bv_extract(stop-start-1, 0, sube) + for arg in expr.args: + e = bv_extract(arg.size-1, 0, self.from_expr(arg)) if res: res = bv_concat(e, res) else: diff --git a/miasm2/ir/translators/z3_ir.py b/miasm2/ir/translators/z3_ir.py index e0460cc4..ccb14b4f 100644 --- a/miasm2/ir/translators/z3_ir.py +++ b/miasm2/ir/translators/z3_ir.py @@ -137,10 +137,8 @@ class TranslatorZ3(Translator): def from_ExprCompose(self, expr): res = None - args = sorted(expr.args, key=operator.itemgetter(2)) # sort by start off - for subexpr, start, stop in args: - sube = self.from_expr(subexpr) - e = z3.Extract(stop-start-1, 0, sube) + for arg in expr.args: + e = z3.Extract(arg.size-1, 0, self.from_expr(arg)) if res != None: res = z3.Concat(e, res) else: |