diff options
| -rw-r--r-- | miasm/expression/expression_eval_abstract.py | 2 | ||||
| -rw-r--r-- | miasm/expression/expression_helper.py | 7 | ||||
| -rwxr-xr-x | miasm/tools/emul_helper.py | 14 | ||||
| -rw-r--r-- | miasm/tools/modint.py | 2 |
4 files changed, 22 insertions, 3 deletions
diff --git a/miasm/expression/expression_eval_abstract.py b/miasm/expression/expression_eval_abstract.py index 9fc20c4f..27f13e3b 100644 --- a/miasm/expression/expression_eval_abstract.py +++ b/miasm/expression/expression_eval_abstract.py @@ -783,7 +783,7 @@ class eval_abs: a = xx.arg mask = (1<<(stop-start))-1 a&=mask - a<<=e.args[i][1] + a<<=start#e.args[i][1] total_bit+=stop-start rez|=a if total_bit in tab_uintsize: diff --git a/miasm/expression/expression_helper.py b/miasm/expression/expression_helper.py index 39f643f1..d2c239c1 100644 --- a/miasm/expression/expression_helper.py +++ b/miasm/expression/expression_helper.py @@ -218,6 +218,12 @@ def _expr_simp(e): args[i] = ExprInt(tab_size_int[args[i].get_size()](0)) del(args[j]) continue + # (- A) + A => 0 + if op == '+' and isinstance(args[i], ExprOp) and args[i].op == "-": + if len(args[i].args) == 1 and args[j] == args[i].args[0]: + args[i] = ExprInt(tab_size_int[args[i].get_size()](0)) + del(args[j]) + continue # A | A => A if op == '|' and args[i] == args[j]: del(args[j]) @@ -289,6 +295,7 @@ def _expr_simp(e): if total_bit in tab_size_int: return ExprInt(tab_size_int[total_bit]((uint64((e.arg.arg)>>e.start)) & mask)) else: + # XXX TODO fix correct size fds return ExprInt(type(e.arg.arg)((uint64((e.arg.arg)>>e.start)) & mask)) # Slice(Slice(A, x), y) => Slice(A, z) diff --git a/miasm/tools/emul_helper.py b/miasm/tools/emul_helper.py index 2c0a7364..0987c37c 100755 --- a/miasm/tools/emul_helper.py +++ b/miasm/tools/emul_helper.py @@ -74,7 +74,17 @@ def dump_reg(p): return out - +def cmp_ptr(x, y): + r = expr_simp(x.arg-y.arg) + if not isinstance(r, ExprInt): + return 1 + if r.arg == 0: + return 0 + r = expr_simp(get_op_msb(r)) + if r == ExprInt(uint1(0)): + return 1 + else: + return -1 def dump_mem(p): out = [] todo = [] @@ -83,7 +93,7 @@ def dump_mem(p): for x in kk: if isinstance(x, ExprMem): todo.append(x) - todo.sort() + todo.sort(cmp=lambda x,y:cmp_ptr(x, y)) for x in todo: out.append('%s %s'%(str(x), str(p[x]))) diff --git a/miasm/tools/modint.py b/miasm/tools/modint.py index 75664597..3bd3ea3e 100644 --- a/miasm/tools/modint.py +++ b/miasm/tools/modint.py @@ -2,6 +2,8 @@ import os class moduint(object): def __init__(self, arg): + if isinstance(arg, moduint): + arg = arg.arg self.arg = arg%self.__class__.limit assert(self.arg >= 0 and self.arg < self.__class__.limit) def __repr__(self): |