diff options
Diffstat (limited to 'miasm2/arch/x86/arch.py')
| -rw-r--r-- | miasm2/arch/x86/arch.py | 88 |
1 files changed, 46 insertions, 42 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index 0a1d83e2..5cbf62ff 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -174,6 +174,10 @@ def parse_deref_ptr(s, l, t): t = t[0] return ExprMem(ExprOp('segm', t[0], t[1])) +def parse_deref_segmoff(s, l, t): + t = t[0] + return ExprOp('segm', t[0], t[1]) + variable, operand, base_expr = gen_base_expr() @@ -222,7 +226,7 @@ deref_mem_ad |= Group( deref_ptr = Group(int_or_expr + COLON + - int_or_expr).setParseAction(parse_deref_ptr) + int_or_expr).setParseAction(parse_deref_segmoff) PTR = Suppress('PTR') @@ -542,6 +546,32 @@ class instruction_x86(instruction): args.append(a) return args + @staticmethod + def arg2str(e, pos = None): + if isinstance(e, ExprId) or isinstance(e, ExprInt): + o = str(e) + elif isinstance(e, ExprMem): + sz = {8: 'BYTE', 16: 'WORD', 32: 'DWORD', + 64: 'QWORD', 80: 'TBYTE'}[e.size] + segm = "" + if e.is_op_segm(): + segm = "%s:" % e.arg.args[0] + e = e.arg.args[1] + else: + e = e.arg + if isinstance(e, ExprOp): + # s = str(e.arg)[1:-1] + s = str(e).replace('(', '').replace(')', '') + else: + s = str(e) + o = sz + ' PTR %s[%s]' % (segm, s) + elif isinstance(e, ExprOp) and e.op == 'segm': + o = "%s:%s" % (e.args[0], e.args[1]) + else: + raise ValueError('check this %r' % e) + return "%s" % o + + class mn_x86(cls_mn): name = "x86" @@ -1902,29 +1932,6 @@ class x86_rm_arg(m_arg): s = e.size return start, stop - @staticmethod - def arg2str(e): - if isinstance(e, ExprId): - o = str(e) - elif isinstance(e, ExprMem): - sz = {8: 'BYTE', 16: 'WORD', 32: 'DWORD', - 64: 'QWORD', 80: 'TBYTE'}[e.size] - segm = "" - if e.is_op_segm(): - segm = "%s:" % e.arg.args[0] - e = e.arg.args[1] - else: - e = e.arg - if isinstance(e, ExprOp): - # s = str(e.arg)[1:-1] - s = str(e).replace('(', '').replace(')', '') - else: - s = str(e) - o = sz + ' PTR %s[%s]' % (segm, s) - else: - raise ValueError('check this %r' % e) - return "%s" % o - def get_modrm(self): p = self.parent admode = p.v_admode() @@ -2861,8 +2868,9 @@ class bs_moff(bsi): if not hasattr(self.parent, "mseg"): raise StopIteration m = self.parent.mseg.expr - if (not (isinstance(m, ExprMem) and m.is_op_segm() and - isinstance(m.arg.args[0], ExprInt))): + if not (isinstance(m, ExprOp) and m.op == 'segm'): + raise StopIteration + if not isinstance(m.args[1], ExprInt): raise StopIteration l = self.parent.v_opmode() # self.parent.args[0].expr.size if l == 16: @@ -2870,7 +2878,7 @@ class bs_moff(bsi): else: self.l = 32 # print 'imm enc', l, self.parent.rex_w.value - v = int(m.arg.args[1].arg) + v = int(m.args[1].arg) mask = ((1 << self.l) - 1) # print 'ext', self.l, l, hex(v), hex(sign_ext(v & ((1<<self.l)-1), # self.l, l)) @@ -2964,12 +2972,6 @@ class bs_movoff(m_arg): # print self.expr, repr(self.expr) return True - @staticmethod - def arg2str(e): - sz = {8: 'BYTE', 16: 'WORD', 32: 'DWORD', 64: 'QWORD', 80: 'TBYTE'} - o = sz[e.size] + ' PTR [%s]' % e.arg - return "%s" % o - class bs_msegoff(m_arg): parser = deref_ptr @@ -2988,6 +2990,7 @@ class bs_msegoff(m_arg): except StopIteration: return None, None e = v[0] + print "XXX", e if e is None: log.debug('cannot fromstring int %r' % s) return None, None @@ -2995,20 +2998,25 @@ class bs_msegoff(m_arg): return start, stop def encode(self): - if not (isinstance(self.expr, ExprMem) and self.expr.is_op_segm()): + print 'ENCODE', self.expr + if not (isinstance(self.expr, ExprOp) and self.expr.op == 'segm'): raise StopIteration - if not isinstance(self.expr.arg.args[0], ExprInt): + print 'ENCODE1', self.expr + if not isinstance(self.expr.args[0], ExprInt): raise StopIteration - if not isinstance(self.expr.arg.args[1], ExprInt): + print 'ENCODE2', self.expr + if not isinstance(self.expr.args[1], ExprInt): raise StopIteration + print 'ENCODE3', self.expr l = self.parent.v_opmode() # self.parent.args[0].expr.size # print 'imm enc', l, self.parent.rex_w.value - v = int(self.expr.arg.args[0].arg) + v = int(self.expr.args[0].arg) mask = ((1 << self.l) - 1) # print 'ext', self.l, l, hex(v), hex(sign_ext(v & ((1<<self.l)-1), # self.l, l)) if v != sign_ext(v & mask, self.l, l): raise StopIteration + print 'ENCODE4', self.expr self.value = swap_uint(self.l, v & ((1 << self.l) - 1)) yield True @@ -3018,15 +3026,11 @@ class bs_msegoff(m_arg): self.value = v v = sign_ext(v, self.l, opmode) v = ExprInt_fromsize(opmode, v) - e = ExprMem(ExprOp('segm', v, self.parent.off.expr)) + e = ExprOp('segm', v, self.parent.off.expr) self.expr = e # print self.expr, repr(self.expr) return True - @staticmethod - def arg2str(e): - return "%s:%s" % (e.arg.args[0], e.arg.args[1]) - d_rex_p = bs(l=0, cls=(bs_fbit,), fname="rex_p") d_rex_w = bs(l=0, cls=(bs_fbit,), fname="rex_w") |