about summary refs log tree commit diff stats
path: root/example/expression/manip_expression6.py
blob: 7e32da4b306b8ae8bd093bf2a34676ef42c13d52 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
from miasm.expression.expression import *
from miasm.expression.expression_helper import *
import os

filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)

a = ExprId('a')
b = ExprId('b')
c = ExprId('c')
d = ExprId('d')


x = ExprMem(a+b+ExprInt32(0x42))

def replace_expr(e):
    #print 'visit', e
    dct = {c+ExprInt32(0x42):d,
           a+b:c,}
    if e in dct:
        return dct[e]
    return e


print x
y = x.visit(replace_expr)
print y
print x.copy()
print y.copy()
print y == y.copy()
print repr(y), repr(y.copy())


z = ExprCompose([(a[5:9], 0, 8), (b, 8, 24), (x, 24, 32)])
print z
print z.copy()
print z[:31].copy().visit(replace_expr)

print 'replace'
print x.replace_expr({c+ExprInt32(0x42):d,
                      a+b:c,})
print z.replace_expr({c+ExprInt32(0x42):d,
                      a+b:c,})


u = z.copy()
print u
u.args[-1][0].arg.args[1].arg = uint32(0x45)
print u
print z
print u == z

to_test = [(ExprInt32(1)-ExprInt32(1), ExprInt32(0)),
           ((ExprInt32(5)+c+a+b-a+ExprInt32(1)-ExprInt32(5)),b+c+ExprInt32(1)),
           (a+b+c-a-b-c+a,a),
           (a+a+b+c-(a+(b+c)),a),
           (c^b^a^c^b,a),
           (a^ExprInt32(0),a),
           ((a+b)-b,a),
           (-(ExprInt32(0)-((a+b)-b)),a),

           (ExprOp('<<<', a, ExprInt32(32)),a),
           (ExprOp('>>>', a, ExprInt32(32)),a),
           (ExprOp('>>>', a, ExprInt32(0)),a),
           (ExprOp('<<', a, ExprInt32(0)),a),

           (ExprOp('<<<', a, ExprOp('<<<', b, c)),
            ExprOp('<<<', a, ExprOp('<<<', b, c))),
           (ExprOp('<<<', ExprOp('<<<', a, b), c),
            ExprOp('<<<', ExprOp('<<<', a, b), c)),
           (ExprOp('<<<', ExprOp('>>>', a, b), c),
            ExprOp('<<<', ExprOp('>>>', a, b), c)),
           (ExprOp('>>>', ExprOp('<<<', a, b), c),
            ExprOp('>>>', ExprOp('<<<', a, b), c)),
           (ExprOp('>>>', ExprOp('<<<', a, b), b),
            ExprOp('>>>', ExprOp('<<<', a, b), b)),


           (ExprOp('>>>', ExprOp('<<<', a, ExprInt32(10)), ExprInt32(2)),
            ExprOp('<<<', a, ExprInt32(8))),

           (ExprOp('>>>', ExprOp('<<<', a, ExprInt32(10)), ExprInt32(2)) ^ ExprOp('>>>', ExprOp('<<<', a, ExprInt32(10)), ExprInt32(2)),
            ExprInt32(0)),
           (ExprOp(">>", (a & ExprInt32(0xF)), ExprInt32(0x15)),
            ExprInt32(0)),
           (ExprOp("==", ExprInt32(12), ExprInt32(10)), ExprInt32(0)),
           (ExprOp("==", ExprInt32(12), ExprInt32(12)), ExprInt32(1)),
           (ExprOp("==", a|ExprInt32(12), ExprInt32(0)),ExprInt32(0)),
           (ExprOp("==", a|ExprInt32(12), ExprInt32(14)),
            ExprOp("==", a|ExprInt32(12), ExprInt32(14))),
           (ExprOp("parity", ExprInt32(0xf)), ExprInt32(1)),
           (ExprOp("parity", ExprInt32(0xe)), ExprInt32(0)),
           (ExprInt32(0x4142)[:32],ExprInt32(0x4142)),
           (ExprInt32(0x4142)[:8],ExprInt8(0x42)),
           (ExprInt32(0x4142)[8:16],ExprInt8(0x41)),
           (a[:32], a),
           (a[:8][:8],a[:8]),
           (a[:16][:8],a[:8]),
           (a[8:16][:8],a[8:16]),
           (a[8:32][:8],a[8:16]),
           (a[:16][8:16],a[8:16]),
           (ExprCompose([(a, 0, 32)]),a),
           (ExprCompose([(a[:16], 0, 16)]), a[:16]),
           (ExprCompose([(a[:16], 0, 16), (a, 16, 32)]),
            ExprCompose([(a[:16], 0, 16), (a, 16, 32)]),),
           (ExprCompose([(a[:16], 0, 16), (a[16:32], 16, 32)]), a),

           (ExprMem(a)[:32], ExprMem(a)),
           (ExprMem(a)[:16], ExprMem(a, size=16)),

           (ExprCond(ExprInt32(1), a, b), a),
           (ExprCond(ExprInt32(0), b, a), a),

           (ExprInt32(0x80000000)[31:32], ExprInt32(1)),
           (ExprCompose([(ExprInt16(0x1337)[:8], 0, 8),(ExprInt16(0x1337)[8:16], 8, 16)]),
            ExprInt16(0x1337)),

           (ExprCompose([(ExprInt32(0x1337beef)[8:16], 8, 16),
                        (ExprInt32(0x1337beef)[:8], 0, 8),
                        (ExprInt32(0x1337beef)[16:32], 16, 32)]),
            ExprInt32(0x1337BEEF)),


           ]


for e, e_check in to_test[:]:
    #
    print "#"*80
    e_check = expr_simp(e_check)
    print "#"*80
    print str(e), str(e_check)
    e_new = expr_simp(e)
    print "orig", str(e), "new", str(e_new), "check", str(e_check)
    rez = e_new == e_check
    if not rez:
        fdsfds