1 import logging
2 import unittest
3
4 from rekall import addrspace
5 from rekall import obj
6
7
8 from rekall import plugins
9 from rekall import session
10 from rekall import testlib
11
12
14 """Test the profile implementation."""
15
21
34
36
37 profile = obj.Profile.classes['Profile32Bits'](session=self.session)
38 profile.add_types({
39 'Test': [0x10, {
40 'Field1': [0x00, ['BitField', dict(start_bit=0, end_bit=4)]],
41 'Field2': [0x00, ['BitField', dict(start_bit=4, end_bit=8)]],
42 }]})
43
44 test = profile.Object("Test", offset=0, vm=self.address_space)
45
46 bf1 = test.Field1
47 bf2 = test.Field2
48
49 self.assertEqual(bf1, 8)
50 self.assertEqual(bf2, 6)
51
52
53 self.assertEqual(bf1 + 1, 9)
54 self.assertEqual(bf1 - 1, 7)
55 self.assertEqual(bf1 + bf2, 8 + 6)
56 self.assertEqual(bf1 < bf2, 8 < 6)
57 self.assertEqual(bf1 > bf2, 8 > 6)
58 self.assertEqual(bf1 & bf2, 8 & 6)
59 self.assertEqual(bf1 ^ bf2, 8 ^ 6)
60 self.assertEqual(bf1 + 6, 8 + bf2)
61 self.assertEqual(bf1 < 6, 8 < bf2)
62 self.assertEqual(bf1 > 6, 8 > bf2)
63 self.assertEqual(bf1 & 6, 8 & bf2)
64 self.assertEqual(bf1 ^ 6, 8 ^ bf2)
65
67
68 address_space = addrspace.BufferAddressSpace(
69 data="\x08\x00\x00\x00\x00\x00\x00\x00"
70 "\x66\x55\x44\x33\x00\x00\x00\x00"
71 "\x99\x88\x77\x66\x55\x44\x33\x22", session=self.session)
72
73 vtype = {'Test': [0x10, {
74
75 'ptr32': [0x00, ['Pointer', dict(
76 target='unsigned long'
77 )]],
78 'ptr64': [0x00, ['Pointer', dict(
79 target='long long'
80 )]],
81
82
83 'next': [0x00, ['Pointer', dict(
84 target='Test'
85 )]],
86
87
88 'invalid': [0x08, ['Pointer', dict(
89 target='long'
90 )]],
91
92
93 'void': [0x00, ['Pointer', dict(
94 target='Void'
95 )]],
96 }]}
97
98
99 profile = obj.Profile.classes['Profile32Bits'](session=self.session)
100 profile.add_types(vtype)
101
102 test = profile.Object("Test", offset=0, vm=address_space)
103
104 ptr = test.ptr32
105
106
107 self.assertEqual(profile.get_obj_offset("Test", "invalid"), 8)
108
109
110 self.assertEqual(ptr.obj_size, 4)
111
112
113 self.assertEqual(ptr.obj_offset, 0)
114
115
116 self.assertEqual(ptr.v(), 8)
117 self.assertEqual(int(ptr), 8)
118 self.assertEqual(ptr, 8)
119
120
121 self.assertEqual(ptr.dereference(), 0x33445566)
122
123
124 self.assertEqual(test.ptr32, test.ptr64)
125
126
127 ptr2 = ptr + 2
128
129
130 self.assertEqual(ptr2.obj_offset, 8)
131
132
133 self.assertEqual(test.ptr64 + 1, 0x33445566)
134 self.assertEqual(test.ptr32 + 1, 0)
135
136
137 self.assertEqual(ptr2.v(), 0x33445566)
138
139
140
141
142 self.assertEqual(ptr2.dereference(), 0)
143
144
145 self.assertEqual(test.invalid.dereference(), 0)
146
147
148 self.assert_(test.ptr32)
149
150
151 ptr3 = test.next
152
153
154 self.assertEqual(test.next.v(), 8)
155
156 next = ptr3.dereference()
157
158
159 self.assertEqual(next.obj_type, "Test")
160
161
162 self.assertEqual(next.ptr32, 0x33445566)
163
164
165 profile = obj.Profile.classes['ProfileLLP64'](session=self.session)
166 profile.add_types(vtype)
167
168 test = profile.Object("Test", offset=0, vm=address_space)
169
170 ptr = test.ptr32
171
172
173 self.assertEqual(ptr.obj_size, 8)
174
175
176 self.assertEqual(ptr.obj_offset, 0)
177
178
179 self.assertEqual(ptr.v(), 8)
180
181
182 self.assertEqual(ptr.dereference(), 0x33445566)
183
184
185 ptr2 = ptr + 2
186
187
188 self.assertEqual(ptr2.obj_offset, 8)
189 self.assertEqual(ptr2, 0x33445566)
190
191
192
193
194
195
196 self.assertEqual(test.void, 8)
197
198
199 self.assertNotEqual(test.void.dereference(), 0x33445566)
200
215
216
217 if __name__ == "__main__":
218 logging.basicConfig(level=logging.DEBUG)
219 unittest.main()
220