Mercurial > paraspace
annotate paraspace/dexfile.py @ 10:123c7a8bbf4c
Parse EncodedArrayItems
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Tue, 24 May 2011 23:47:16 +0800 |
parents | 9a49826b26d4 |
children | 409e2cd76f72 |
rev | line source |
---|---|
0 | 1 class _DEX_header(object): |
2 magic = None # 0x00, 8 bytes | |
3 checksum = None # 0x08, 4 bytes | |
4 signature = None # 0x0c, 20 bytes | |
5 fileSize = None # 0x20, 4 bytes | |
6 headerSize = None # 0x24 | |
7 endianTag = None # 0x28 | |
8 linkSize = None # 0x2c | |
9 linkOff = None # 0x30 | |
10 mapOff = None # 0x34 | |
11 stringIdsSize = None # 0x38 | |
12 stringIdsOff = None # 0x3c | |
13 typeIdsSize = None # 0x40 | |
14 typeIdsOff = None # 0x44 | |
15 protoIdsSize = None # 0x48 | |
16 protoIdsOff = None # 0x4c | |
17 fieldIdsSize = None # 0x50 | |
18 fieldIdsOff = None # 0x54 | |
19 methodIdsSize = None # 0x58 | |
20 methodIdsOff = None # 0x5c | |
21 classDefsSize = None # 0x60 | |
22 classDefsOff = None # 0x64 | |
23 dataSize = None # 0x68 | |
24 dataOff = None # 0x6c | |
25 | |
2 | 26 header_fields = \ |
27 'magic checksum signature fileSize headerSize endianTag ' \ | |
28 'linkSize linkOff mapOff stringIdsSize stringIdsOff typeIdsSize ' \ | |
29 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \ | |
30 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \ | |
31 'dataSize dataOff'.split() | |
32 | |
0 | 33 def parse(self, data): |
34 self.magic = data[:8] | |
35 self.checksum = data[8: 0x0c] | |
36 self.signature = data[0x0c: 0x20] | |
37 | |
38 idx = 0x20 | |
39 fields = 'fileSize headerSize endianTag linkSize linkOff mapOff ' \ | |
40 'stringIdsSize stringIdsOff typeIdsSize typeIdsOff ' \ | |
41 'protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \ | |
42 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \ | |
43 'dataSize dataOff'.split() | |
44 for field in fields: | |
45 d = data[idx: idx + 4] | |
46 value = _to_uint(d) | |
47 setattr(self, field, value) | |
48 idx = idx + 4 | |
49 pass | |
50 pass | |
51 pass | |
52 | |
53 | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
54 class man_off(object): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
55 off = None |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
56 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
57 def __init__(self, off): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
58 self.off = off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
59 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
60 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
61 def __call__(self, sz=0): |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
62 off = self.off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
63 self.off = off + sz |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
64 return off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
65 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
66 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
67 |
0 | 68 def _to_uint(data): |
69 v = 0 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
70 sh = 0 |
0 | 71 for c in data: |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
72 v = v + (ord(c) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
73 sh = sh + 8 |
0 | 74 pass |
75 return v | |
76 | |
77 | |
8 | 78 def _to_int(data): |
79 v = _to_uint(data) | |
80 sz = len(data) | |
81 if sz and ((1 << (sz * 8 - 1)) & v): | |
82 v = -((1 << (sz * 8)) - v) | |
83 pass | |
84 return v | |
85 | |
86 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
87 def _uleb128(data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
88 sh = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
89 v = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
90 for c in data: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
91 cv = ord(c) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
92 v = v + ((cv & 0x7f) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
93 sh = sh + 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
94 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
95 if cv <= 0x7f: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
96 break |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
97 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
98 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
99 nbytes = sh / 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
100 return v, nbytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
101 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
102 |
2 | 103 def _leb128(data): |
104 v, sh = _uleb128(data) | |
105 if v & (1 << (sh * 7 - 1)): | |
106 v = -((1 << (sh * 7)) - v) | |
107 pass | |
108 return v, sh | |
109 | |
110 | |
0 | 111 class _DEX_MapItem(object): |
112 type = None # 2 bytes | |
113 unused = None # 2 bytes | |
114 size = None # 4 bytes | |
115 offset = None # 4 bytes | |
116 | |
117 data_size = 12 | |
2 | 118 types = { |
119 0x0000: 'kDexTypeHeaderItem', | |
120 0x0001: 'kDexTypeStringIdItem', | |
121 0x0002: 'kDexTypeTypeIdItem', | |
122 0x0003: 'kDexTypeProtoIdItem', | |
123 0x0004: 'kDexTypeFieldIdItem', | |
124 0x0005: 'kDexTypeMethodIdItem', | |
125 0x0006: 'kDexTypeClassDefItem', | |
126 0x1000: 'kDexTypeMapList', | |
127 0x1001: 'kDexTypeTypeList', | |
128 0x1002: 'kDexTypeAnnotationSetRefList', | |
129 0x1003: 'kDexTypeAnnotationSetItem', | |
130 0x2000: 'kDexTypeClassDataItem', | |
131 0x2001: 'kDexTypeCodeItem', | |
132 0x2002: 'kDexTypeStringDataItem', | |
133 0x2003: 'kDexTypeDebugInfoItem', | |
134 0x2004: 'kDexTypeAnnotationItem', | |
135 0x2005: 'kDexTypeEncodedArrayItem', | |
136 0x2006: 'kDexTypeAnnotationsDirectoryItem' | |
137 } | |
0 | 138 |
139 def parse(self, data): | |
140 self.type = _to_uint(data[:2]) | |
141 self.size = _to_uint(data[4:8]) | |
142 self.offset = _to_uint(data[8:12]) | |
143 pass | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
144 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
145 @classmethod |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
146 def find_type_name(self, type_name): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
147 type_value = [v |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
148 for v, name in _DEX_MapItem.types.items() |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
149 if name == type_name][0] |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
150 return type_value |
0 | 151 pass |
152 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
153 |
0 | 154 class _DEX_TypeId(object): |
155 descriptorIdx = None # 4 bytes | |
156 | |
157 data_size = 4 | |
158 | |
159 def parse(self, data): | |
160 self.descriptorIdx = _to_uint(data[:4]) | |
161 pass | |
162 pass | |
163 | |
164 | |
165 class _DEX_ProtoId(object): | |
166 shortyIdx = None # 4 bytes | |
167 returnTypeIdx = None # 4 bytes | |
168 parametersOff = None # 4 bytes | |
169 | |
170 data_size = 12 | |
171 | |
172 def parse(self, data): | |
173 self.shortyIdx = _to_uint(data[:4]) | |
174 self.returnTypeIdx = _to_uint(data[4:8]) | |
175 self.parametersOff = _to_uint(data[8:12]) | |
176 pass | |
177 pass | |
178 | |
179 | |
180 class _DEX_FieldId(object): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
181 classIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
182 typeIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
183 nameIdx = None # 4 bytes |
0 | 184 |
185 data_size = 8 | |
186 | |
187 def parse(self, data): | |
188 self.classIdx = _to_uint(data[:2]) | |
189 self.typeIdx = _to_uint(data[2:4]) | |
190 self.nameIdx = _to_uint(data[4:8]) | |
191 pass | |
192 pass | |
193 | |
194 | |
195 class _DEX_MethodId(object): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
196 classIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
197 protoIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
198 nameIdx = None # 4 bytes |
0 | 199 |
200 data_size = 8 | |
201 | |
202 def parse(self, data): | |
203 self.classIdx = _to_uint(data[:2]) | |
204 self.protoIdx = _to_uint(data[2:4]) | |
205 self.nameIdx = _to_uint(data[4:8]) | |
206 pass | |
207 pass | |
208 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
209 |
0 | 210 class _DEX_ClassDef(object): |
211 classIdx = None # 0x00 | |
212 accessFlags = None # 0x04 | |
213 superclassIdx = None # 0x08 | |
214 interfacesOff = None # 0x0c | |
215 sourceFileIdx = None # 0x10 | |
216 annotationsOff = None # 0x14 | |
217 classDataOff = None # 0x18 | |
218 staticValuesOff = None # 0x1c | |
219 | |
220 data_size = 0x20 | |
221 | |
222 def parse(self, data): | |
223 self.classIdx = _to_uint(data[:4]) | |
224 self.accessFlags = _to_uint(data[4:8]) | |
225 self.superclassIdx = _to_uint(data[8:0xc]) | |
226 self.interfacesOff = _to_uint(data[0xc:0x10]) | |
227 self.sourceFileIdx = _to_uint(data[0x10:0x14]) | |
228 self.annotationsOff = _to_uint(data[0x14:0x18]) | |
229 self.classDataOff = _to_uint(data[0x18:0x1c]) | |
230 self.staticValuesOff = _to_uint(data[0x1c:0x20]) | |
231 pass | |
232 pass | |
233 | |
234 | |
2 | 235 class _DEX_ClassDataHeader(object): |
236 staticFieldsSize = None | |
237 instanceFieldsSize = None | |
238 directMethodsSize = None | |
239 virtualMethodsSize = None | |
240 | |
241 data_size = None | |
242 | |
243 def parse(self, data, off): | |
244 self.staticFieldsSize, sh = _uleb128(data[off:off + 10]) | |
245 sz = sh | |
246 off = off + sh | |
247 self.instanceFieldsSize, sh = _uleb128(data[off:off + 10]) | |
248 sz = sz + sh | |
249 off = off + sh | |
250 self.directMethodsSize, sh = _uleb128(data[off:off + 10]) | |
251 sz = sz + sh | |
252 off = off + sh | |
253 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10]) | |
254 sz = sz + sh | |
255 | |
256 self.data_size = sz | |
257 pass | |
258 pass | |
259 | |
260 | |
261 class _DEX_Field(object): | |
262 fieldIdx = None | |
263 accessFlags = None | |
264 | |
265 data_size = None | |
266 | |
267 def parse(self, data, off): | |
268 self.fieldIdx, sh = _uleb128(data[off:off + 10]) | |
269 sz = sh | |
270 off = off + sh | |
271 self.accessFlags, sh = _uleb128(data[off:off + 10]) | |
272 sz = sz + sh | |
273 | |
274 self.data_size = sz | |
275 pass | |
276 pass | |
277 | |
278 | |
279 class _DEX_Method(object): | |
280 methodIdx = None | |
281 accessFlags = None | |
282 codeOff = None | |
283 | |
284 data_size = None | |
285 | |
286 def parse(self, data, off): | |
287 self.methodIdx, sh = _uleb128(data[off:off + 10]) | |
288 sz = sh | |
289 off = off + sh | |
290 | |
291 self.accessFlags, sh = _uleb128(data[off:off + 10]) | |
292 sz = sz + sh | |
293 off = off + sh | |
294 | |
295 self.codeOff, sh = _uleb128(data[off:off + 10]) | |
296 sz = sz + sh | |
297 | |
298 self.data_size = sz | |
299 pass | |
300 pass | |
301 | |
302 class _DEX_ClassData(object): | |
303 header = None # DexClassDataHeader | |
304 staticFields = None # DexField* | |
305 instanceFields = None # DexField* | |
306 directMethods = None # DexMethod* | |
307 virtualMethods = None # DexMethod* | |
308 | |
309 data_size = None | |
310 | |
311 def parse(self, data, off): | |
312 header = _DEX_ClassDataHeader() | |
313 header.parse(data, off) | |
314 self.header = header | |
315 | |
316 cur_off = [off + header.data_size] | |
317 | |
318 def parse_field(): | |
319 field = _DEX_Field() | |
320 off = cur_off[0] | |
321 field.parse(data, off) | |
322 cur_off[0] = cur_off[0] + field.data_size | |
323 | |
324 # | |
325 # field index depends previous one to reduce size | |
326 # | |
327 field.fieldIdx = field.fieldIdx + idx[0] | |
328 idx[0] = field.fieldIdx | |
329 | |
330 return field | |
331 | |
332 def parse_method(): | |
333 method = _DEX_Method() | |
334 off = cur_off[0] | |
335 method.parse(data, off) | |
336 cur_off[0] = cur_off[0] + method.data_size | |
337 | |
338 # | |
339 # method index depends previous one to reduce size | |
340 # | |
341 method.methodIdx = method.methodIdx + idx[0] | |
342 idx[0] = method.methodIdx | |
343 | |
344 return method | |
345 | |
346 idx = [0] | |
347 self.staticFields = [parse_field() | |
348 for i in range(header.staticFieldsSize)] | |
349 idx = [0] | |
350 self.instanceFields = [parse_field() | |
351 for i in range(header.instanceFieldsSize)] | |
352 idx = [0] | |
353 self.directMethods = [parse_method() | |
354 for i in range(header.directMethodsSize)] | |
355 idx = [0] | |
356 self.virtualMethods = [parse_method() | |
357 for i in range(header.virtualMethodsSize)] | |
358 | |
359 self.data_size = cur_off[0] - off | |
360 pass | |
361 pass | |
362 | |
363 | |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
364 class _DEX_TypeItem(object): |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
365 typeIdx = None # 2 bytes |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
366 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
367 data_size = 2 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
368 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
369 def parse(self, data, off): |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
370 self.typeIdx = _to_uint(data[off:off + 2]) |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
371 pass |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
372 pass |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
373 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
374 |
2 | 375 class _DEX_TypeList(object): |
376 typeItems = None | |
377 | |
378 data_size = None | |
379 | |
380 def parse(self, data, off): | |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
381 moff = man_off(off) |
2 | 382 |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
383 size = _to_uint(data[moff(4):moff()]) |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
384 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
385 def parse_type_item(): |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
386 item = _DEX_TypeItem() |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
387 item.parse(data, moff()) |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
388 moff(item.data_size) |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
389 return item |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
390 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
391 typeItems = [parse_type_item() |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
392 for i in range(size)] |
2 | 393 |
394 self.typeItems = typeItems | |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
395 self.data_size = moff() - off |
2 | 396 pass |
397 pass | |
398 | |
399 | |
400 class _DEX_TypeLists(object): | |
401 typeLists = None | |
402 | |
403 data_size = None | |
404 | |
405 def parse(self, num, data, off): | |
406 def parse(): | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
407 off = (cur_off[0] + 3) & ~0x3 # type list must aligned for 4 bytes |
2 | 408 typeList = _DEX_TypeList() |
409 typeList.parse(data, off) | |
410 cur_off[0] = off + typeList.data_size | |
411 | |
412 return typeList | |
413 | |
414 cur_off = [off] | |
415 typeLists = [parse() for i in range(num)] | |
416 | |
417 self.typeLists = typeLists | |
418 self.data_size = cur_off[0] - off | |
419 pass | |
420 pass | |
421 | |
422 | |
423 class _DEX_Try(object): | |
424 startAddr = None # 4 bytes | |
425 insnCount = None # 2 bytes | |
426 handlerOff = None # 2 bytes | |
427 | |
428 data_size = 8 | |
429 | |
430 def parse(self, data, off): | |
431 cur_off = off | |
432 self.startAddr = _to_uint(data[cur_off:cur_off + 4]) | |
433 cur_off = cur_off + 4 | |
434 self.insnCount = _to_uint(data[cur_off:cur_off + 2]) | |
435 cur_off = cur_off + 2 | |
436 self.handlerOff = _to_uint(data[cur_off:cur_off + 2]) | |
437 pass | |
438 pass | |
439 | |
440 | |
441 class _DEX_CatchHandler(object): | |
442 typeIdx = None | |
443 address = None | |
444 | |
445 data_size = None | |
446 | |
447 def parse(self, data, off): | |
448 cur_off = off | |
449 self.typeIdx, sh = _uleb128(data[cur_off:cur_off + 5]) | |
450 cur_off = cur_off + sh | |
451 self.address, sh = _uleb128(data[cur_off:cur_off + 5]) | |
452 cur_off = cur_off + sh | |
453 | |
454 self.data_size = cur_off - off | |
455 pass | |
456 | |
457 def parse1(self, data, off): | |
458 self.address, sh = _uleb128(data[off:off + 5]) | |
459 | |
460 self.data_size = sh | |
461 pass | |
462 pass | |
463 | |
464 | |
465 class _DEX_Catch(object): | |
466 catchesAll = None | |
467 handlers = None | |
468 | |
469 data_size = None | |
470 | |
471 def parse(self, data, off): | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
472 moff = man_off(off) |
2 | 473 |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
474 count, sh = _leb128(data[moff():moff() + 5]) |
2 | 475 moff(sh) |
476 | |
477 if count > 0: | |
478 self.catchesAll = False | |
479 else: | |
480 self.catchesAll = True | |
481 count = -count | |
482 pass | |
483 | |
484 def parse_handler(): | |
485 handler = _DEX_CatchHandler() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
486 handler.parse(data, moff()) |
2 | 487 moff(handler.data_size) |
488 return handler | |
489 | |
490 self.handlers = [parse_handler() for i in range(count)] | |
491 | |
492 if self.catchesAll: | |
493 # | |
494 # Additional handler for catching all | |
495 # | |
496 handler = _DEX_CatchHandler() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
497 handler.parse1(data, moff()) |
2 | 498 moff(handler.data_size) |
499 self.handlers.append(handler) | |
500 pass | |
501 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
502 self.data_size = moff() - off |
2 | 503 pass |
504 pass | |
505 | |
506 | |
507 class _DEX_Code(object): | |
508 registersSize = None # 2 bytes | |
509 insSize = None # 2 bytes | |
510 outsSize = None # 2 bytes | |
511 triesSize = None # 2 bytes | |
512 debugInfoOff = None # 4 bytes | |
513 insnsSize = None # 4 bytes | |
514 insns = None | |
515 try_items = None | |
516 catch_handler_items = None | |
517 | |
518 data_size = None | |
519 | |
520 def parse(self, data, off): | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
521 moff = man_off(off) |
2 | 522 |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
523 self.registersSize = _to_uint(data[moff(2):moff()]) |
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
524 self.insSize = _to_uint(data[moff(2):moff()]) |
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
525 self.outsSize = _to_uint(data[moff(2):moff()]) |
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
526 self.triesSize = _to_uint(data[moff(2):moff()]) |
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
527 self.debugInfoOff = _to_uint(data[moff(4):moff()]) |
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
528 self.insnsSize = _to_uint(data[moff(4):moff()]) |
2 | 529 |
530 moff(self.insnsSize * 2) # skip insns | |
531 | |
532 if self.triesSize > 0: | |
533 def parse_try_item(): | |
534 try_item = _DEX_Try() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
535 try_item.parse(data, moff()) |
2 | 536 moff(try_item.data_size) |
537 return try_item | |
538 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
539 moff.off = (moff.off + 3) & ~0x3 # align tries to 4 bytes |
2 | 540 self.try_items = [parse_try_item() for i in range(self.triesSize)] |
541 | |
542 def parse_catch_handler(): | |
543 catch = _DEX_Catch() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
544 catch.parse(data, moff()) |
2 | 545 moff(catch.data_size) |
546 return catch | |
547 | |
548 # | |
549 # No tries, no catch handlers | |
550 # | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
551 handlersSize, sh = _uleb128(data[moff():moff() + 5]) |
2 | 552 moff(sh) |
553 self.catch_handler_items = [parse_catch_handler() | |
554 for i in range(handlersSize)] | |
555 pass | |
556 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
557 moff.off = (moff() + 3) & ~0x3 # round code item to 4 bytes |
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
558 self.data_size = moff() - off |
2 | 559 pass |
560 pass | |
561 | |
562 | |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
563 ## \brief File offset to Annotation item. |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
564 # |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
565 # This type is not in libdex of Dalvik. We add this class to tracking |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
566 # information for layout algorithm. |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
567 # |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
568 class _DEX_AnnotationRefItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
569 annotationOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
570 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
571 data_size = 4 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
572 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
573 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
574 self.annotationOff = _to_uint(data[off:off + 4]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
575 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
576 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
577 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
578 class _DEX_AnnotationSetItem(object): |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
579 # size = None # 4 bytes |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
580 annotations = None # 4 * size bytes |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
581 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
582 data_size = None |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
583 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
584 def parse(self, data, off): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
585 moff = man_off(off) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
586 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
587 size = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
588 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
589 def parse_annotation_ref(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
590 ref = _DEX_AnnotationRefItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
591 ref.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
592 moff(ref.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
593 return ref |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
594 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
595 self.annotations = [parse_annotation_ref() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
596 for i in range(size)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
597 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
598 self.data_size = moff() - off |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
599 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
600 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
601 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
602 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
603 class _DEX_FieldAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
604 fieldIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
605 annotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
606 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
607 data_size = 8 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
608 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
609 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
610 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
611 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
612 self.fieldIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
613 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
614 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
615 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
616 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
617 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
618 class _DEX_MethodAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
619 methodIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
620 annotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
621 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
622 data_size = 8 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
623 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
624 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
625 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
626 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
627 self.methodIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
628 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
629 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
630 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
631 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
632 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
633 class _DEX_ParameterAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
634 methodIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
635 annotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
636 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
637 data_size = 8 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
638 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
639 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
640 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
641 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
642 self.methodIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
643 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
644 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
645 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
646 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
647 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
648 class _DEX_AnnotationsDirectoryItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
649 classAnnotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
650 fieldAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
651 methodAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
652 parameterAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
653 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
654 data_size = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
655 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
656 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
657 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
658 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
659 self.classAnnotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
660 fieldsSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
661 methodsSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
662 parametersSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
663 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
664 def parse_fieldAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
665 item = _DEX_FieldAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
666 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
667 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
668 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
669 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
670 def parse_methodAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
671 item = _DEX_MethodAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
672 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
673 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
674 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
675 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
676 def parse_parameterAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
677 item = _DEX_ParameterAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
678 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
679 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
680 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
681 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
682 self.fieldAnnotationsItems = [parse_fieldAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
683 for i in range(fieldsSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
684 self.methodAnnotationsItems = [parse_methodAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
685 for i in range(methodsSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
686 self.parameterAnnotationsItems = [parse_parameterAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
687 for i in range(parametersSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
688 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
689 self.data_size = moff() - off |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
690 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
691 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
692 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
693 |
8 | 694 ## |
695 # | |
696 # \see createAnnotationMember() in dalvik/vm/reflect/Annotation.c | |
697 # | |
698 class _DEX_AnnotationMember(object): | |
699 nameIdx = None # optional | |
700 valueType = None # 1 byte | |
701 value = None | |
702 | |
703 # | |
704 # Constants from DexFile.h | |
705 # | |
706 kDexAnnotationByte = 0x00 | |
707 kDexAnnotationShort = 0x02 | |
708 kDexAnnotationChar = 0x03 | |
709 kDexAnnotationInt = 0x04 | |
710 kDexAnnotationLong = 0x06 | |
711 kDexAnnotationFloat = 0x10 | |
712 kDexAnnotationDouble = 0x11 | |
713 kDexAnnotationString = 0x17 | |
714 kDexAnnotationType = 0x18 | |
715 kDexAnnotationField = 0x19 | |
716 kDexAnnotationMethod = 0x1a | |
717 kDexAnnotationEnum = 0x1b | |
718 kDexAnnotationArray = 0x1c | |
719 kDexAnnotationAnnotation = 0x1d | |
720 kDexAnnotationNull = 0x1e | |
721 kDexAnnotationBoolean = 0x1f | |
722 | |
723 kDexAnnotationValueTypeMask = 0x1f | |
724 kDexAnnotationValueArgShift = 5 | |
725 | |
726 data_size = None | |
727 | |
728 def parse(self, data, off): | |
729 self.nameIdx, sh = _uleb128(data[off:off + 5]) | |
730 | |
731 self.parse_noname(data, off + sh) | |
732 | |
733 self.data_size = self.data_size + sh | |
734 pass | |
735 | |
736 def parse_noname(self, data, off): | |
737 moff = man_off(off) | |
738 | |
739 valueType = _to_uint(data[moff(1):moff()]) | |
740 self.valueType = valueType | |
741 width = valueType >> self.kDexAnnotationValueArgShift | |
742 | |
743 vtype = valueType & self.kDexAnnotationValueTypeMask | |
744 | |
745 if vtype == self.kDexAnnotationByte: | |
746 self.value = _to_int(data[moff(width):moff()]) | |
747 moff(1) | |
748 pass | |
749 elif vtype == self.kDexAnnotationShort: | |
750 self.value = _to_int(data[moff(width):moff()]) | |
751 pass | |
752 elif vtype == self.kDexAnnotationChar: | |
753 self.value = _to_uint(data[moff(width):moff()]) | |
754 moff(1) | |
755 pass | |
756 elif vtype == self.kDexAnnotationInt: | |
757 self.value = _to_int(data[moff(width):moff()]) | |
758 moff(1) | |
759 pass | |
760 elif vtype == self.kDexAnnotationLong: | |
761 self.value = _to_int(data[moff(width):moff()]) | |
762 moff(1) | |
763 pass | |
764 elif vtype == self.kDexAnnotationFloat: | |
765 self.value = _to_uint(data[moff(width):moff()]) | |
766 moff(1) | |
767 pass | |
768 elif vtype == self.kDexAnnotationDouble: | |
769 self.value = _to_uint(data[moff(width):moff()]) | |
770 moff(1) | |
771 pass | |
772 elif vtype == self.kDexAnnotationBoolean: | |
773 self.value = width != 0 | |
774 pass | |
775 elif vtype == self.kDexAnnotationString: # string index | |
776 self.value = _to_uint(data[moff(width):moff()]) | |
777 moff(1) | |
778 pass | |
779 elif vtype == self.kDexAnnotationType: # TypeId index | |
780 self.value = _to_uint(data[moff(width):moff()]) | |
781 moff(1) | |
782 pass | |
783 elif vtype == self.kDexAnnotationMethod: # MethodId index | |
784 self.value = _to_uint(data[moff(width):moff()]) | |
785 moff(1) | |
786 pass | |
787 elif vtype == self.kDexAnnotationField: | |
788 self.value = _to_uint(data[moff(width):moff()]) | |
789 moff(1) | |
790 pass | |
791 elif vtype == self.kDexAnnotationEnum: # FieldId index | |
792 self.value = _to_uint(data[moff(width):moff()]) | |
793 moff(1) | |
794 pass | |
795 elif vtype == self.kDexAnnotationArray: | |
796 size, sh = _uleb128(data[moff():moff() + 5]) | |
797 moff(sh) | |
798 | |
799 def parse_array_elm(): | |
800 elm = _DEX_AnnotationMember() | |
801 elm.parse_noname(data, moff()) | |
802 moff(elm.data_size) | |
803 return elm | |
804 | |
805 self.value = [parse_array_elm() | |
806 for i in range(size)] | |
807 pass | |
808 elif vtype == self.kDexAnnotationAnnotation: | |
809 annoitem = _DEX_AnnotationItem() | |
810 annoitem.parse_novisibility(data, moff()) | |
811 moff(annoitem.data_size) | |
812 self.value = annoitem | |
813 pass | |
814 elif vtype == self.kDexAnnotationNull: | |
815 self.value = 0 | |
816 pass | |
817 else: | |
818 raise ValueError, \ | |
819 'Bad annotation element value byte 0x02x' % (valueType) | |
820 | |
821 self.data_size = moff() - off | |
822 pass | |
823 pass | |
824 | |
825 | |
826 ## \brief Annotation item | |
827 # | |
828 # \see processEncodedAnnotation() in dalvik/vm/reflect/Annotation.c | |
829 # | |
830 class _DEX_AnnotationItem(object): | |
831 visibility = None # 1 byte (optional) | |
832 typeIdx = None | |
833 members = None | |
834 | |
835 kDexVisibilityBuild = 0x00 | |
836 kDexVisibilityRuntime = 0x01 | |
837 kDexVisibilitySystem = 0x02 | |
838 | |
839 data_size = None | |
840 | |
841 def parse(self, data, off): | |
842 self.visibility = _to_uint(data[off:off + 1]) | |
843 | |
844 self.parse_novisibility(data, off + 1) | |
845 | |
846 self.data_size = self.data_size + 1 | |
847 pass | |
848 | |
849 def parse_novisibility(self, data, off): | |
850 moff = man_off(off) | |
851 | |
852 self.typeIdx, sh = _uleb128(data[moff():moff() + 5]) | |
853 moff(sh) | |
854 size, sh = _uleb128(data[moff():moff() + 5]) | |
855 moff(sh) | |
856 | |
857 def parse_AnnotationMemmber(): | |
858 member = _DEX_AnnotationMember() | |
859 member.parse(data, moff()) | |
860 moff(member.data_size) | |
861 return member | |
862 | |
863 self.members = [parse_AnnotationMemmber() | |
864 for i in range(size)] | |
865 | |
866 self.data_size = moff() - off | |
867 pass | |
868 pass | |
869 | |
870 | |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
871 class _DEX_EncodedArrayItem(object): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
872 elements = None |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
873 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
874 data_size = None |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
875 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
876 def parse(self, data, off): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
877 moff = man_off(off) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
878 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
879 size, sh = _uleb128(data[moff():moff() + 5]) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
880 moff(sh) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
881 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
882 def parse_element(): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
883 element = _DEX_AnnotationMember() |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
884 element.parse_noname(data, moff()) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
885 moff(element.data_size) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
886 return element |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
887 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
888 self.elements = [parse_element() |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
889 for i in range(size)] |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
890 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
891 self.data_size = moff() - off |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
892 pass |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
893 pass |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
894 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
895 |
0 | 896 class DEXFile(object): |
897 _data = None | |
898 _header = None | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
899 _maps = None |
0 | 900 _strings = None |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
901 _typeIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
902 _protoIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
903 _fieldIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
904 _methodIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
905 _classDefs = None |
2 | 906 _classDatas = None |
907 _typeLists = None | |
908 _codeItems = None | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
909 _annotationSetItems = None |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
910 _annotationsDirectoryItems = None |
8 | 911 _annotationItems = None |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
912 _encodedArrayItems = None |
0 | 913 |
914 def __init__(self): | |
915 pass | |
916 | |
917 def open(self, filename): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
918 fo = file(filename, 'r') |
0 | 919 data = fo.read() |
920 | |
921 self.parse(data) | |
922 pass | |
923 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
924 def _parse_maps(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
925 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
926 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
927 off = header.mapOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
928 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
929 num = _to_uint(data[off:off + 4]) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
930 off = off + 4 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
931 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
932 maps = [] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
933 for i in range(num): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
934 item_data = data[off:off + _DEX_MapItem.data_size] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
935 item = _DEX_MapItem() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
936 item.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
937 maps.append(item) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
938 off = off + _DEX_MapItem.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
939 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
940 |
2 | 941 self._maps = maps |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
942 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
943 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
944 def find_map_item(self, type_value): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
945 maps = self._maps |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
946 try: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
947 codeItem_map = [map for map in maps if map.type == type_value][0] |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
948 except IndexError: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
949 return None |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
950 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
951 return codeItem_map |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
952 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
953 def find_map_item_name(self, type_name): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
954 type_value = _DEX_MapItem.find_type_name(type_name) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
955 map = self.find_map_item(type_value) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
956 return map |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
957 |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
958 def _parse_strings(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
959 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
960 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
961 strings = [] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
962 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
963 num = header.stringIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
964 off = header.stringIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
965 for i in range(num): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
966 str_start_off = _to_uint(data[off:off + 4]) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
967 str_stop_off = data.index('\x00', str_start_off) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
968 string = data[str_start_off:str_stop_off] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
969 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
970 sz, sh = _uleb128(string) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
971 string = string[sh:] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
972 strings.append(string) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
973 off = off + 4 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
974 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
975 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
976 self._strings = strings |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
977 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
978 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
979 def _parse_typeIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
980 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
981 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
982 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
983 num = header.typeIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
984 off = header.typeIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
985 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
986 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
987 type_id = _DEX_TypeId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
988 type_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
989 return type_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
990 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
991 item_size = _DEX_TypeId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
992 item_offs = range(off, off + item_size * num, item_size) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
993 item_datas = [data[item_off:item_off + item_size] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
994 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
995 typeIds = [parse(item_data) for item_data in item_datas] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
996 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
997 self._typeIds = typeIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
998 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
999 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1000 def _parse_protoIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1001 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1002 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1003 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1004 num = header.protoIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1005 off = header.protoIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1006 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1007 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1008 proto_id = _DEX_ProtoId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1009 proto_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1010 return proto_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1011 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1012 item_size = _DEX_ProtoId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1013 item_offs = range(off, off + item_size * num, item_size) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1014 item_datas = [data[item_off:item_off + item_size] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1015 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1016 protoIds = [parse(item_data) for item_data in item_datas] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1017 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1018 self._protoIds = protoIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1019 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1020 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1021 def _parse_fieldIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1022 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1023 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1024 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1025 num = header.fieldIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1026 off = header.fieldIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1027 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1028 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1029 field_id = _DEX_FieldId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1030 field_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1031 return field_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1032 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1033 item_size = _DEX_FieldId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1034 item_offs = range(off, off + item_size * num, item_size) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1035 item_datas = [data[item_off:item_off + item_size] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1036 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1037 fieldIds = [parse(item_data) for item_data in item_datas] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1038 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1039 self._fieldIds = fieldIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1040 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1041 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1042 def _parse_methodIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1043 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1044 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1045 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1046 num = header.methodIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1047 off = header.methodIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1048 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1049 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1050 method_id = _DEX_MethodId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1051 method_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1052 return method_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1053 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1054 item_size = _DEX_MethodId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1055 item_offs = range(off, off + item_size * num, item_size) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1056 item_datas = [data[item_off:item_off + item_size] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1057 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1058 methodIds = [parse(item_data) for item_data in item_datas] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1059 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1060 self._methodIds = methodIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1061 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1062 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1063 def _parse_classDefs(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1064 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1065 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1066 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1067 num = header.classDefsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1068 off = header.classDefsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1069 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1070 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1071 class_def = _DEX_ClassDef() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1072 class_def.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1073 return class_def |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1074 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1075 item_size = _DEX_ClassDef.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1076 item_offs = range(off, off + item_size * num, item_size) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1077 item_datas = [data[item_off:item_off + item_size] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1078 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1079 classDefs = [parse(item_data) for item_data in item_datas] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1080 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1081 self._classDefs = classDefs |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1082 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1083 |
2 | 1084 def _parse_classDatas(self): |
1085 header = self._header | |
1086 data = self._data | |
1087 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1088 class_data_map = self.find_map_item_name('kDexTypeClassDataItem') |
2 | 1089 |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1090 moff = man_off(class_data_map.offset) |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1091 |
2 | 1092 def parse_class_data(): |
1093 class_data = _DEX_ClassData() | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1094 class_data.parse(data, moff()) |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1095 moff(class_data.data_size) |
2 | 1096 return class_data |
1097 class_datas = [parse_class_data() for i in range(class_data_map.size)] | |
1098 | |
1099 self._classDatas = class_datas | |
1100 pass | |
1101 | |
1102 def _parse_typeLists(self): | |
1103 data = self._data | |
1104 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1105 typeList_map = self.find_map_item_name('kDexTypeTypeList') |
2 | 1106 num_typeLists = typeList_map.size |
1107 | |
1108 typeLists = _DEX_TypeLists() | |
1109 typeLists.parse(num_typeLists, data, typeList_map.offset) | |
1110 | |
1111 self._typeLists = typeLists | |
1112 pass | |
1113 | |
1114 def _parse_codeItems(self): | |
1115 data = self._data | |
1116 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1117 codeItem_map = self.find_map_item_name('kDexTypeCodeItem') |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1118 if codeItem_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1119 return |
2 | 1120 num_codeItems = codeItem_map.size |
1121 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1122 moff = man_off(codeItem_map.offset) |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1123 |
2 | 1124 def parse_code(): |
1125 code = _DEX_Code() | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1126 code.parse(data, moff()) |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1127 moff(code.data_size) |
2 | 1128 return code |
1129 | |
1130 codeItems = [parse_code() for i in range(num_codeItems)] | |
1131 | |
1132 self._codeItems = codeItems | |
1133 pass | |
1134 | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1135 def _parse_annotationSetItems(self): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1136 data = self._data |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1137 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1138 annoset_map = self.find_map_item_name('kDexTypeAnnotationSetItem') |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1139 if annoset_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1140 return |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1141 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1142 moff = man_off(annoset_map.offset) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1143 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1144 def parse_annotationSetItem(): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1145 item = _DEX_AnnotationSetItem() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1146 item.parse(data, moff()) |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1147 moff(item.data_size) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1148 return item |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1149 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1150 self._annotationSetItems = [parse_annotationSetItem() |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1151 for i in range(annoset_map.size)] |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1152 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1153 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1154 def _parse_annotationsDirectoryItems(self): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1155 data = self._data |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1156 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1157 annodir_map = \ |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1158 self.find_map_item_name('kDexTypeAnnotationsDirectoryItem') |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1159 if annodir_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1160 return |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1161 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1162 moff = man_off(annodir_map.offset) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1163 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1164 def parse_annotationDirItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1165 item = _DEX_AnnotationsDirectoryItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1166 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1167 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1168 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1169 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1170 self._annotationsDirectoryItems = [parse_annotationDirItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1171 for i in range(annodir_map.size)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1172 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1173 |
8 | 1174 def _parse_annotationItems(self): |
1175 data = self._data | |
1176 | |
1177 annoitem_map = self.find_map_item_name('kDexTypeAnnotationItem') | |
1178 if annoitem_map is None: | |
1179 return | |
1180 | |
1181 moff = man_off(annoitem_map.offset) | |
1182 | |
1183 def parse_annotationItem(): | |
1184 item = _DEX_AnnotationItem() | |
1185 item.parse(data, moff()) | |
1186 moff(item.data_size) | |
1187 return item | |
1188 | |
1189 self._annotationItems = [parse_annotationItem() | |
1190 for i in range(annoitem_map.size)] | |
1191 pass | |
1192 | |
9
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1193 def _parse_header(self): |
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1194 data = self._data |
0 | 1195 header = _DEX_header() |
1196 header.parse(data) | |
1197 self._header = header | |
9
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1198 pass |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1199 |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1200 def _parse_encodedArrayItems(self): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1201 data = self._data |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1202 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1203 encodedArrayItem_map = \ |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1204 self.find_map_item_name('kDexTypeEncodedArrayItem') |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1205 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1206 moff = man_off(encodedArrayItem_map.offset) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1207 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1208 def parse_encodedArrayItem(): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1209 item = _DEX_EncodedArrayItem() |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1210 item.parse(data, moff()) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1211 moff(item.data_size) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1212 return item |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1213 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1214 self._encodedArrayItems = [parse_encodedArrayItem() |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1215 for i in range(encodedArrayItem_map.size)] |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1216 pass |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1217 |
9
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1218 def parse(self, data): |
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1219 self._data = data |
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1220 self._parse_header() |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1221 self._parse_maps() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1222 self._parse_strings() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1223 self._parse_typeIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1224 self._parse_protoIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1225 self._parse_fieldIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1226 self._parse_methodIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1227 self._parse_classDefs() |
2 | 1228 self._parse_classDatas() |
1229 self._parse_typeLists() | |
1230 self._parse_codeItems() | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1231 self._parse_annotationSetItems() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1232 self._parse_annotationsDirectoryItems() |
8 | 1233 self._parse_annotationItems() |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1234 self._parse_encodedArrayItems() |
0 | 1235 pass |
1236 pass | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1237 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1238 if __name__ == '__main__': |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1239 dex = DEXFile() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1240 dex.open('test.dex') |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1241 |
2 | 1242 print 'Header' |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1243 h = dex._header |
2 | 1244 for attr in h.header_fields: |
1245 print '\t%s: %s' % (attr, repr(getattr(h, attr))) | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1246 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1247 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1248 print |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1249 print 'Define Classes' |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1250 strings = dex._strings |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1251 classDefs = dex._classDefs |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1252 typeIds = dex._typeIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1253 for classDef in classDefs: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1254 typeId = typeIds[classDef.classIdx] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1255 descriptor = strings[typeId.descriptorIdx] |
2 | 1256 data_off = classDef.classDataOff |
1257 print '\t%s @0x%x' % (descriptor, data_off) | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1258 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1259 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1260 print |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1261 print 'Reference Classes' |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1262 for typeId in typeIds: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1263 descriptor = strings[typeId.descriptorIdx] |
2 | 1264 print '\t%s' % (descriptor) |
1265 pass | |
1266 | |
1267 print | |
1268 print 'Class data' | |
1269 methodIds = dex._methodIds | |
1270 classDatas = dex._classDatas | |
1271 for classData in classDatas: | |
1272 print '\tclass' | |
1273 for method in classData.directMethods: | |
1274 code_off = method.codeOff | |
1275 methodId = methodIds[method.methodIdx] | |
1276 name = strings[methodId.nameIdx] | |
1277 print '\t\t%s@0x%x' % (name, code_off) | |
1278 pass | |
1279 for method in classData.virtualMethods: | |
1280 code_off = method.codeOff | |
1281 methodId = methodIds[method.methodIdx] | |
1282 name = strings[methodId.nameIdx] | |
1283 print '\t\t%s@0x%x' % (name, code_off) | |
1284 pass | |
1285 pass | |
1286 | |
1287 print | |
1288 print 'TypeLists size is %d bytes' % (dex._typeLists.data_size) | |
1289 | |
1290 bytes = sum([code.data_size for code in dex._codeItems]) | |
1291 print | |
1292 print 'CodeItems size is %d bytes' % (bytes) | |
1293 | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1294 bytes = sum([annoset.data_size for annoset in dex._annotationSetItems]) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1295 print |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1296 print 'AnnotationSetItems size is %d bytes' % (bytes) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1297 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1298 bytes = sum([annodir.data_size |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1299 for annodir in dex._annotationsDirectoryItems]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1300 print |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1301 print 'AnnotationsDirtoryItems size is %d bytes' % (bytes) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1302 |
8 | 1303 bytes = sum([annoitem.data_size |
1304 for annoitem in dex._annotationItems]) | |
1305 print | |
1306 print 'AnnotationItems size is %d bytes' % (bytes) | |
1307 | |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1308 bytes = sum([encodeditem.data_size |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1309 for encodeditem in dex._encodedArrayItems]) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1310 print |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1311 print 'EncodedArrayItems size is %d bytes' % (bytes) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1312 |
2 | 1313 print |
1314 print 'Data maps' | |
1315 maps = dex._maps | |
1316 for map in maps: | |
1317 print '\t0x%04x(%s) size=%d offset=0x%08x' % (map.type, | |
1318 map.types[map.type], | |
1319 map.size, | |
1320 map.offset) | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1321 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1322 pass |