diff options
| -rw-r--r-- | miasm/arch/ia32_sem.py | 39 | ||||
| -rwxr-xr-x | miasm/tools/emul_helper.py | 2 | ||||
| -rw-r--r-- | miasm/tools/nux_api.py | 2 |
3 files changed, 34 insertions, 9 deletions
diff --git a/miasm/arch/ia32_sem.py b/miasm/arch/ia32_sem.py index 5fdf305c..bac0a90c 100644 --- a/miasm/arch/ia32_sem.py +++ b/miasm/arch/ia32_sem.py @@ -943,24 +943,32 @@ def dec(info, a): def push(info, a): e= [] s = a.get_size() - if not s in [16,32]: - raise 'bad size stacker!' + # special case segment regs + if a in [es, cs, ss, ds, fs, gs]: + opmode, admode = info.opmode, info.admode + s = {u16:16, u32:32}[opmode] + if not s in [16, 32]: + raise ValueError('bad size stacker!') c = ExprOp('-', esp, ExprInt32(s/8)) e.append(ExprAff(esp, c)) - e.append(ExprAff(ExprMem(c, s), a)) + e.append(ExprAff(ExprMem(c, a.get_size()), a)) return e def pop(info, a): e= [] s = a.get_size() + # special case segment regs + if a in [es, cs, ss, ds, fs, gs]: + opmode, admode = info.opmode, info.admode + s = {u16:16, u32:32}[opmode] if not s in [16,32]: - raise 'bad size stacker!' + raise ValueError('bad size stacker!') new_esp = ExprOp('+', esp, ExprInt32(s/8)) e.append(ExprAff(esp, new_esp)) - #XXX FIX XXX for pop [esp] + # XXX FIX XXX for pop [esp] if isinstance(a, ExprMem): a =a.replace_expr({esp:new_esp}) - e.append(ExprAff(a, ExprMem(esp, s))) + e.append(ExprAff(a, ExprMem(esp, a.get_size()))) return e def sete(info, a): @@ -1394,10 +1402,23 @@ def loopne(info, a, b): ExprCond(c, ExprInt_from(c, 0), ExprInt_from(c, 1)), ExprCond(zf, ExprInt_from(c, 1), ExprInt_from(c, 0)) ) + e.append(ExprAff(eip, ExprCond(cond, a, b))) + return e + +def loope(info, a, b): + e= [] + c = ExprOp('-', ecx, ExprInt32(1)) + e.append(ExprAff(ecx, c)) + + cond = ExprOp('|', + ExprCond(c, ExprInt_from(c, 0), ExprInt_from(c, 1)), + ExprCond(zf, ExprInt_from(c, 0), ExprInt_from(c, 1)) + ) e.append(ExprAff(eip, ExprCond(cond, a, b))) return e + #XXX size to do; eflag def div(info, a): e= [] @@ -2077,7 +2098,10 @@ def into(info): return [] def l_in(info, a, b): - return [] + e = [] + e.append(ExprAff(ExprId('vmcpu.vm_exception_flags'), + ExprInt32(EXCEPT_PRIV_INSN))) + return e def cmpxchg(info, a, b, c): e = [] @@ -2227,6 +2251,7 @@ mnemo_func = {'mov': mov, 'jecxz':jecxz, 'loop':loop, 'loopne':loopne, + 'loope':loope, 'div':div, 'mul':mul, 'imul':imul, diff --git a/miasm/tools/emul_helper.py b/miasm/tools/emul_helper.py index 0987c37c..488b8124 100755 --- a/miasm/tools/emul_helper.py +++ b/miasm/tools/emul_helper.py @@ -56,7 +56,7 @@ def tohex(a): return hex(a) -jcc = ['jz', 'je', 'jnz', 'jp', 'jnp', 'jg', 'jge', 'ja', 'jae', 'jb', 'jbe', 'jl', 'jle', 'js', 'jns', 'jo', 'jno', 'loop', 'loopne', 'jecxz'] +jcc = ['jz', 'je', 'jnz', 'jp', 'jnp', 'jg', 'jge', 'ja', 'jae', 'jb', 'jbe', 'jl', 'jle', 'js', 'jns', 'jo', 'jno', 'loop', 'loopne', 'loope', 'jecxz'] def dump_pool(p): log_emu_helper.error('/-------------\\') diff --git a/miasm/tools/nux_api.py b/miasm/tools/nux_api.py index 352af70c..07a7aca9 100644 --- a/miasm/tools/nux_api.py +++ b/miasm/tools/nux_api.py @@ -986,7 +986,7 @@ def xxx_strcpy(): def my_vprintf(arg_fmt, arg_ap): fmt = get_str_ansi(arg_fmt) - print repr(fmt) + #print repr(fmt) fmt_a = parse_fmt(fmt) |