diff options
| -rw-r--r-- | miasm/arch/ia32_sem.py | 12 | ||||
| -rw-r--r-- | miasm/expression/expression.py | 3 | ||||
| -rw-r--r-- | miasm/expression/expression_eval_abstract.py | 20 | ||||
| -rw-r--r-- | miasm/expression/expression_helper.py | 12 | ||||
| -rwxr-xr-x | miasm/tools/emul_helper.py | 6 |
5 files changed, 32 insertions, 21 deletions
diff --git a/miasm/arch/ia32_sem.py b/miasm/arch/ia32_sem.py index 74237139..ac1f9b23 100644 --- a/miasm/arch/ia32_sem.py +++ b/miasm/arch/ia32_sem.py @@ -981,11 +981,21 @@ def seta(info, a): e.append(ExprAff(a, ExprCond(ExprOp('&', ExprOp('==', cf, ExprInt(uint32(0))), ExprOp('==', zf, ExprInt(uint32(0)))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0))))) return e +def setae(info, a): + e = [] + e.append(ExprAff(a, ExprCond(ExprOp('==', cf, ExprInt(uint32(0))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0))))) + return e + def setb(info, a): e = [] e.append(ExprAff(a, ExprCond(ExprOp('==', cf, ExprInt(uint32(1))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0))))) return e +def setbe(info, a): + e = [] + e.append(ExprAff(a, ExprCond(ExprOp('&', ExprOp('==', cf, ExprInt(uint32(1))), ExprOp('==', zf, ExprInt(uint32(1)))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0))))) + return e + def setns(info, a): e = [] e.append(ExprAff(a, ExprCond(ExprOp('==', nf, ExprInt(uint32(0))), ExprInt(tab_uintsize[a.get_size()](1)), ExprInt(tab_uintsize[a.get_size()](0))))) @@ -2056,7 +2066,9 @@ mnemo_func = {'mov': mov, 'setg':setg, 'setge':setge, 'seta':seta, + 'setae':setae, 'setb':setb, + 'setbe':setbe, 'setns':setns, 'sets':sets, 'seto':seto, diff --git a/miasm/expression/expression.py b/miasm/expression/expression.py index fd560c54..ae8b415b 100644 --- a/miasm/expression/expression.py +++ b/miasm/expression/expression.py @@ -115,6 +115,7 @@ class Expr: class ExprTop(Expr): def __init__(self, e=None): + fdqs self.e = e pass def __str__(self): @@ -680,6 +681,8 @@ class ExprCompose(Expr): def get_size(self): return max([x.stop for x in self.args]) - min([x.start for x in self.args]) def reload_expr(self, g = {}): + if self in g: + return g[self] args = [] for a in self.args: if isinstance(a, Expr): diff --git a/miasm/expression/expression_eval_abstract.py b/miasm/expression/expression_eval_abstract.py index 8263d930..3f1a1d19 100644 --- a/miasm/expression/expression_eval_abstract.py +++ b/miasm/expression/expression_eval_abstract.py @@ -473,12 +473,12 @@ class eval_abs: def eval_ExprId(self, e, eval_cache = {}): if not e in self.pool: - return ExprTop(e) + return e return self.pool[e] def eval_ExprInt(self, e, eval_cache = {}): return e - + def eval_ExprMem(self, e, eval_cache = {}): a_val = expr_simp(self.eval_expr(e.arg, eval_cache)) if isinstance(a_val, ExprTop): @@ -486,12 +486,9 @@ class eval_abs: ee = ExprMem(e.arg, e.size) ee.is_term = True return ee - - a = expr_simp(ExprMem(a_val, size = e.size)) if a in self.pool: return self.pool[a] - tmp = None #test if mem lookup is known for k in self.pool: @@ -532,11 +529,9 @@ class eval_abs: #XXX hack test a.is_term = True return a - #eq lookup if a.size == k.size: return self.pool[tmp] - #bigger lookup if a.size > k.size: rest = a.size @@ -547,28 +542,23 @@ class eval_abs: v = self.find_mem_by_addr(ptr) if v == None: raise ValueError("cannot find %s in mem"%str(ptr)) - - if (rest-v.size) >=0: + if rest >= v.size: val = self.pool[v] diff_size = v.size else: - diff_size = v.size-rest + diff_size = rest val = self.pool[v][0:diff_size] - val = ExprSliceTo(val, ptr_index, ptr_index+diff_size) - out.append(val) ptr_index+=diff_size rest -= diff_size ptr = expr_simp(self.eval_expr(ExprOp('+', ptr, ExprInt(uint32(v.size/8))), eval_cache)) e = expr_simp(ExprCompose(out)) return e - #part lookup tmp = expr_simp(ExprSlice(self.pool[tmp], 0, a.size)) - return tmp - + def eval_ExprOp(self, e, eval_cache = {}): args = [] for a in e.args: diff --git a/miasm/expression/expression_helper.py b/miasm/expression/expression_helper.py index 99f8331e..912250c3 100644 --- a/miasm/expression/expression_helper.py +++ b/miasm/expression/expression_helper.py @@ -26,7 +26,7 @@ tab_size_int = {8:uint8, tab_max_uint = {8:uint8(0xFF), 16:uint16(0xFFFF), 32:uint32(0xFFFFFFFF), 64:uint64(0xFFFFFFFFFFFFFFFFL)} -def parity(self, a): +def parity(a): tmp = (a)&0xFFL cpt = 1 while tmp!=0: @@ -40,7 +40,10 @@ def merge_sliceto_slice(args): sources_int = {} for a in args: if isinstance(a.arg, ExprInt): - sources_int[a.start] = a + #sources_int[a.start] = a + # copy ExprInt because we will inplace modify arg just below + # /!\ TODO XXX never ever modify inplace args... + sources_int[a.start] = ExprSliceTo(ExprInt(a.arg.arg.__class__(a.arg.arg)), a.start, a.stop) elif isinstance(a.arg, ExprSlice): if not a.arg.arg in sources: sources[a.arg.arg] = [] @@ -161,8 +164,10 @@ def expr_simp_w(e): return ExprMem(expr_simp(e.arg), size = e.size) elif isinstance(e, ExprOp): op, args = e.op, list(e.args) + """ if ExprTop() in args: return ExprTop() + """ #int OP int => int if e.op in ['+', '-', '*', '|', '&', '^', '>>', '<<'] and isinstance(args[0], ExprInt) and isinstance(args[1], ExprInt) : if args[0].get_size() != args[1].get_size(): @@ -489,7 +494,6 @@ def expr_simp_w(e): if op == 'parity' and isinstance(args[0], ExprInt): - fsdfsdf return ExprInt(tab_size_int[args[0].get_size()](parity(args[0].arg))) new_e = ExprOp(op, *[expr_simp(x) for x in args]) @@ -597,8 +601,10 @@ def expr_simp_w(e): break if all_top: return ExprTop() + """ if ExprTop() in e.args: return ExprTop() + """ args = merge_sliceto_slice(e.args) if len(args) == 1: diff --git a/miasm/tools/emul_helper.py b/miasm/tools/emul_helper.py index a36cba85..66521bf3 100755 --- a/miasm/tools/emul_helper.py +++ b/miasm/tools/emul_helper.py @@ -659,7 +659,7 @@ def digest_allbloc_instr(all_bloc, segm_to_do = {}): return instrs -def x86_machine(): +def x86_machine(mem_read_wrap = None, mem_write_wrap = None): machine = eval_abs({esp:init_esp, ebp:init_ebp, eax:init_eax, ebx:init_ebx, ecx:init_ecx, edx:init_edx, esi:init_esi, edi:init_edi, cs:ExprInt(uint32(9)), zf : init_zf, nf : init_nf, pf : init_pf, @@ -674,8 +674,8 @@ def x86_machine(): #my_ret_addr:my_ret_addri }, - #mem_read_wrap, - #mem_write_wrap, + mem_read_wrap, + mem_write_wrap, ) return machine |