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
|