Mercurial > paraspace
annotate paraspace/dexfile.py @ 7:1d776ec496e5
Migrate all to find_map_item_name()
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Tue, 24 May 2011 10:28:30 +0800 |
parents | 917f0a9b9d06 |
children | 59dd10bf60f2 |
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 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
78 def _uleb128(data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
79 sh = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
80 v = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
81 for c in data: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
82 cv = ord(c) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
83 v = v + ((cv & 0x7f) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
84 sh = sh + 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
85 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
86 if cv <= 0x7f: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
87 break |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
88 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
89 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
90 nbytes = sh / 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
91 return v, nbytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
92 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
93 |
2 | 94 def _leb128(data): |
95 v, sh = _uleb128(data) | |
96 if v & (1 << (sh * 7 - 1)): | |
97 v = -((1 << (sh * 7)) - v) | |
98 pass | |
99 return v, sh | |
100 | |
101 | |
0 | 102 class _DEX_MapItem(object): |
103 type = None # 2 bytes | |
104 unused = None # 2 bytes | |
105 size = None # 4 bytes | |
106 offset = None # 4 bytes | |
107 | |
108 data_size = 12 | |
2 | 109 types = { |
110 0x0000: 'kDexTypeHeaderItem', | |
111 0x0001: 'kDexTypeStringIdItem', | |
112 0x0002: 'kDexTypeTypeIdItem', | |
113 0x0003: 'kDexTypeProtoIdItem', | |
114 0x0004: 'kDexTypeFieldIdItem', | |
115 0x0005: 'kDexTypeMethodIdItem', | |
116 0x0006: 'kDexTypeClassDefItem', | |
117 0x1000: 'kDexTypeMapList', | |
118 0x1001: 'kDexTypeTypeList', | |
119 0x1002: 'kDexTypeAnnotationSetRefList', | |
120 0x1003: 'kDexTypeAnnotationSetItem', | |
121 0x2000: 'kDexTypeClassDataItem', | |
122 0x2001: 'kDexTypeCodeItem', | |
123 0x2002: 'kDexTypeStringDataItem', | |
124 0x2003: 'kDexTypeDebugInfoItem', | |
125 0x2004: 'kDexTypeAnnotationItem', | |
126 0x2005: 'kDexTypeEncodedArrayItem', | |
127 0x2006: 'kDexTypeAnnotationsDirectoryItem' | |
128 } | |
0 | 129 |
130 def parse(self, data): | |
131 self.type = _to_uint(data[:2]) | |
132 self.size = _to_uint(data[4:8]) | |
133 self.offset = _to_uint(data[8:12]) | |
134 pass | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
135 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
136 @classmethod |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
137 def find_type_name(self, type_name): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
138 type_value = [v |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
139 for v, name in _DEX_MapItem.types.items() |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
140 if name == type_name][0] |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
141 return type_value |
0 | 142 pass |
143 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
144 |
0 | 145 class _DEX_TypeId(object): |
146 descriptorIdx = None # 4 bytes | |
147 | |
148 data_size = 4 | |
149 | |
150 def parse(self, data): | |
151 self.descriptorIdx = _to_uint(data[:4]) | |
152 pass | |
153 pass | |
154 | |
155 | |
156 class _DEX_ProtoId(object): | |
157 shortyIdx = None # 4 bytes | |
158 returnTypeIdx = None # 4 bytes | |
159 parametersOff = None # 4 bytes | |
160 | |
161 data_size = 12 | |
162 | |
163 def parse(self, data): | |
164 self.shortyIdx = _to_uint(data[:4]) | |
165 self.returnTypeIdx = _to_uint(data[4:8]) | |
166 self.parametersOff = _to_uint(data[8:12]) | |
167 pass | |
168 pass | |
169 | |
170 | |
171 class _DEX_FieldId(object): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
172 classIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
173 typeIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
174 nameIdx = None # 4 bytes |
0 | 175 |
176 data_size = 8 | |
177 | |
178 def parse(self, data): | |
179 self.classIdx = _to_uint(data[:2]) | |
180 self.typeIdx = _to_uint(data[2:4]) | |
181 self.nameIdx = _to_uint(data[4:8]) | |
182 pass | |
183 pass | |
184 | |
185 | |
186 class _DEX_MethodId(object): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
187 classIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
188 protoIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
189 nameIdx = None # 4 bytes |
0 | 190 |
191 data_size = 8 | |
192 | |
193 def parse(self, data): | |
194 self.classIdx = _to_uint(data[:2]) | |
195 self.protoIdx = _to_uint(data[2:4]) | |
196 self.nameIdx = _to_uint(data[4:8]) | |
197 pass | |
198 pass | |
199 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
200 |
0 | 201 class _DEX_ClassDef(object): |
202 classIdx = None # 0x00 | |
203 accessFlags = None # 0x04 | |
204 superclassIdx = None # 0x08 | |
205 interfacesOff = None # 0x0c | |
206 sourceFileIdx = None # 0x10 | |
207 annotationsOff = None # 0x14 | |
208 classDataOff = None # 0x18 | |
209 staticValuesOff = None # 0x1c | |
210 | |
211 data_size = 0x20 | |
212 | |
213 def parse(self, data): | |
214 self.classIdx = _to_uint(data[:4]) | |
215 self.accessFlags = _to_uint(data[4:8]) | |
216 self.superclassIdx = _to_uint(data[8:0xc]) | |
217 self.interfacesOff = _to_uint(data[0xc:0x10]) | |
218 self.sourceFileIdx = _to_uint(data[0x10:0x14]) | |
219 self.annotationsOff = _to_uint(data[0x14:0x18]) | |
220 self.classDataOff = _to_uint(data[0x18:0x1c]) | |
221 self.staticValuesOff = _to_uint(data[0x1c:0x20]) | |
222 pass | |
223 pass | |
224 | |
225 | |
2 | 226 class _DEX_ClassDataHeader(object): |
227 staticFieldsSize = None | |
228 instanceFieldsSize = None | |
229 directMethodsSize = None | |
230 virtualMethodsSize = None | |
231 | |
232 data_size = None | |
233 | |
234 def parse(self, data, off): | |
235 self.staticFieldsSize, sh = _uleb128(data[off:off + 10]) | |
236 sz = sh | |
237 off = off + sh | |
238 self.instanceFieldsSize, sh = _uleb128(data[off:off + 10]) | |
239 sz = sz + sh | |
240 off = off + sh | |
241 self.directMethodsSize, sh = _uleb128(data[off:off + 10]) | |
242 sz = sz + sh | |
243 off = off + sh | |
244 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10]) | |
245 sz = sz + sh | |
246 | |
247 self.data_size = sz | |
248 pass | |
249 pass | |
250 | |
251 | |
252 class _DEX_Field(object): | |
253 fieldIdx = None | |
254 accessFlags = None | |
255 | |
256 data_size = None | |
257 | |
258 def parse(self, data, off): | |
259 self.fieldIdx, sh = _uleb128(data[off:off + 10]) | |
260 sz = sh | |
261 off = off + sh | |
262 self.accessFlags, sh = _uleb128(data[off:off + 10]) | |
263 sz = sz + sh | |
264 | |
265 self.data_size = sz | |
266 pass | |
267 pass | |
268 | |
269 | |
270 class _DEX_Method(object): | |
271 methodIdx = None | |
272 accessFlags = None | |
273 codeOff = None | |
274 | |
275 data_size = None | |
276 | |
277 def parse(self, data, off): | |
278 self.methodIdx, sh = _uleb128(data[off:off + 10]) | |
279 sz = sh | |
280 off = off + sh | |
281 | |
282 self.accessFlags, sh = _uleb128(data[off:off + 10]) | |
283 sz = sz + sh | |
284 off = off + sh | |
285 | |
286 self.codeOff, sh = _uleb128(data[off:off + 10]) | |
287 sz = sz + sh | |
288 | |
289 self.data_size = sz | |
290 pass | |
291 pass | |
292 | |
293 class _DEX_ClassData(object): | |
294 header = None # DexClassDataHeader | |
295 staticFields = None # DexField* | |
296 instanceFields = None # DexField* | |
297 directMethods = None # DexMethod* | |
298 virtualMethods = None # DexMethod* | |
299 | |
300 data_size = None | |
301 | |
302 def parse(self, data, off): | |
303 header = _DEX_ClassDataHeader() | |
304 header.parse(data, off) | |
305 self.header = header | |
306 | |
307 cur_off = [off + header.data_size] | |
308 | |
309 def parse_field(): | |
310 field = _DEX_Field() | |
311 off = cur_off[0] | |
312 field.parse(data, off) | |
313 cur_off[0] = cur_off[0] + field.data_size | |
314 | |
315 # | |
316 # field index depends previous one to reduce size | |
317 # | |
318 field.fieldIdx = field.fieldIdx + idx[0] | |
319 idx[0] = field.fieldIdx | |
320 | |
321 return field | |
322 | |
323 def parse_method(): | |
324 method = _DEX_Method() | |
325 off = cur_off[0] | |
326 method.parse(data, off) | |
327 cur_off[0] = cur_off[0] + method.data_size | |
328 | |
329 # | |
330 # method index depends previous one to reduce size | |
331 # | |
332 method.methodIdx = method.methodIdx + idx[0] | |
333 idx[0] = method.methodIdx | |
334 | |
335 return method | |
336 | |
337 idx = [0] | |
338 self.staticFields = [parse_field() | |
339 for i in range(header.staticFieldsSize)] | |
340 idx = [0] | |
341 self.instanceFields = [parse_field() | |
342 for i in range(header.instanceFieldsSize)] | |
343 idx = [0] | |
344 self.directMethods = [parse_method() | |
345 for i in range(header.directMethodsSize)] | |
346 idx = [0] | |
347 self.virtualMethods = [parse_method() | |
348 for i in range(header.virtualMethodsSize)] | |
349 | |
350 self.data_size = cur_off[0] - off | |
351 pass | |
352 pass | |
353 | |
354 | |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
355 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
|
356 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
|
357 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
358 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
|
359 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
360 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
|
361 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
|
362 pass |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
363 pass |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
364 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
365 |
2 | 366 class _DEX_TypeList(object): |
367 typeItems = None | |
368 | |
369 data_size = None | |
370 | |
371 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
|
372 moff = man_off(off) |
2 | 373 |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
374 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
|
375 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
376 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
|
377 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
|
378 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
|
379 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
|
380 return item |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
381 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
382 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
|
383 for i in range(size)] |
2 | 384 |
385 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
|
386 self.data_size = moff() - off |
2 | 387 pass |
388 pass | |
389 | |
390 | |
391 class _DEX_TypeLists(object): | |
392 typeLists = None | |
393 | |
394 data_size = None | |
395 | |
396 def parse(self, num, data, off): | |
397 def parse(): | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
398 off = (cur_off[0] + 3) & ~0x3 # type list must aligned for 4 bytes |
2 | 399 typeList = _DEX_TypeList() |
400 typeList.parse(data, off) | |
401 cur_off[0] = off + typeList.data_size | |
402 | |
403 return typeList | |
404 | |
405 cur_off = [off] | |
406 typeLists = [parse() for i in range(num)] | |
407 | |
408 self.typeLists = typeLists | |
409 self.data_size = cur_off[0] - off | |
410 pass | |
411 pass | |
412 | |
413 | |
414 class _DEX_Try(object): | |
415 startAddr = None # 4 bytes | |
416 insnCount = None # 2 bytes | |
417 handlerOff = None # 2 bytes | |
418 | |
419 data_size = 8 | |
420 | |
421 def parse(self, data, off): | |
422 cur_off = off | |
423 self.startAddr = _to_uint(data[cur_off:cur_off + 4]) | |
424 cur_off = cur_off + 4 | |
425 self.insnCount = _to_uint(data[cur_off:cur_off + 2]) | |
426 cur_off = cur_off + 2 | |
427 self.handlerOff = _to_uint(data[cur_off:cur_off + 2]) | |
428 pass | |
429 pass | |
430 | |
431 | |
432 class _DEX_CatchHandler(object): | |
433 typeIdx = None | |
434 address = None | |
435 | |
436 data_size = None | |
437 | |
438 def parse(self, data, off): | |
439 cur_off = off | |
440 self.typeIdx, sh = _uleb128(data[cur_off:cur_off + 5]) | |
441 cur_off = cur_off + sh | |
442 self.address, sh = _uleb128(data[cur_off:cur_off + 5]) | |
443 cur_off = cur_off + sh | |
444 | |
445 self.data_size = cur_off - off | |
446 pass | |
447 | |
448 def parse1(self, data, off): | |
449 self.address, sh = _uleb128(data[off:off + 5]) | |
450 | |
451 self.data_size = sh | |
452 pass | |
453 pass | |
454 | |
455 | |
456 class _DEX_Catch(object): | |
457 catchesAll = None | |
458 handlers = None | |
459 | |
460 data_size = None | |
461 | |
462 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
|
463 moff = man_off(off) |
2 | 464 |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
465 count, sh = _leb128(data[moff():moff() + 5]) |
2 | 466 moff(sh) |
467 | |
468 if count > 0: | |
469 self.catchesAll = False | |
470 else: | |
471 self.catchesAll = True | |
472 count = -count | |
473 pass | |
474 | |
475 def parse_handler(): | |
476 handler = _DEX_CatchHandler() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
477 handler.parse(data, moff()) |
2 | 478 moff(handler.data_size) |
479 return handler | |
480 | |
481 self.handlers = [parse_handler() for i in range(count)] | |
482 | |
483 if self.catchesAll: | |
484 # | |
485 # Additional handler for catching all | |
486 # | |
487 handler = _DEX_CatchHandler() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
488 handler.parse1(data, moff()) |
2 | 489 moff(handler.data_size) |
490 self.handlers.append(handler) | |
491 pass | |
492 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
493 self.data_size = moff() - off |
2 | 494 pass |
495 pass | |
496 | |
497 | |
498 class _DEX_Code(object): | |
499 registersSize = None # 2 bytes | |
500 insSize = None # 2 bytes | |
501 outsSize = None # 2 bytes | |
502 triesSize = None # 2 bytes | |
503 debugInfoOff = None # 4 bytes | |
504 insnsSize = None # 4 bytes | |
505 insns = None | |
506 try_items = None | |
507 catch_handler_items = None | |
508 | |
509 data_size = None | |
510 | |
511 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
|
512 moff = man_off(off) |
2 | 513 |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
514 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
|
515 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
|
516 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
|
517 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
|
518 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
|
519 self.insnsSize = _to_uint(data[moff(4):moff()]) |
2 | 520 |
521 moff(self.insnsSize * 2) # skip insns | |
522 | |
523 if self.triesSize > 0: | |
524 def parse_try_item(): | |
525 try_item = _DEX_Try() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
526 try_item.parse(data, moff()) |
2 | 527 moff(try_item.data_size) |
528 return try_item | |
529 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
530 moff.off = (moff.off + 3) & ~0x3 # align tries to 4 bytes |
2 | 531 self.try_items = [parse_try_item() for i in range(self.triesSize)] |
532 | |
533 def parse_catch_handler(): | |
534 catch = _DEX_Catch() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
535 catch.parse(data, moff()) |
2 | 536 moff(catch.data_size) |
537 return catch | |
538 | |
539 # | |
540 # No tries, no catch handlers | |
541 # | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
542 handlersSize, sh = _uleb128(data[moff():moff() + 5]) |
2 | 543 moff(sh) |
544 self.catch_handler_items = [parse_catch_handler() | |
545 for i in range(handlersSize)] | |
546 pass | |
547 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
548 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
|
549 self.data_size = moff() - off |
2 | 550 pass |
551 pass | |
552 | |
553 | |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
554 ## \brief File offset to Annotation item. |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
555 # |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
556 # 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
|
557 # information for layout algorithm. |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
558 # |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
559 class _DEX_AnnotationRefItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
560 annotationOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
561 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
562 data_size = 4 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
563 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
564 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
565 self.annotationOff = _to_uint(data[off:off + 4]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
566 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
567 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
568 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
569 class _DEX_AnnotationSetItem(object): |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
570 # size = None # 4 bytes |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
571 annotations = None # 4 * size bytes |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
572 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
573 data_size = None |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
574 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
575 def parse(self, data, off): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
576 moff = man_off(off) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
577 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
578 size = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
579 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
580 def parse_annotation_ref(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
581 ref = _DEX_AnnotationRefItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
582 ref.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
583 moff(ref.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
584 return ref |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
585 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
586 self.annotations = [parse_annotation_ref() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
587 for i in range(size)] |
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 self.data_size = moff() - off |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
590 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
591 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
592 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
593 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
594 class _DEX_FieldAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
595 fieldIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
596 annotationsOff = None # 4 bytes |
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 data_size = 8 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
599 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
600 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
601 moff = man_off(off) |
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 self.fieldIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
604 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
605 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
606 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
607 |
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 class _DEX_MethodAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
610 methodIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
611 annotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
612 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
613 data_size = 8 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
614 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
615 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
616 moff = man_off(off) |
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 self.methodIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
619 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
620 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
621 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
622 |
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 class _DEX_ParameterAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
625 methodIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
626 annotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
627 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
628 data_size = 8 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
629 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
630 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
631 moff = man_off(off) |
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 self.methodIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
634 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
635 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
636 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
637 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
638 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
639 class _DEX_AnnotationsDirectoryItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
640 classAnnotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
641 fieldAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
642 methodAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
643 parameterAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
644 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
645 data_size = None |
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 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
648 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
649 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
650 self.classAnnotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
651 fieldsSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
652 methodsSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
653 parametersSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
654 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
655 def parse_fieldAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
656 item = _DEX_FieldAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
657 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
658 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
659 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
660 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
661 def parse_methodAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
662 item = _DEX_MethodAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
663 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
664 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
665 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
666 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
667 def parse_parameterAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
668 item = _DEX_ParameterAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
669 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
670 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
671 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
672 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
673 self.fieldAnnotationsItems = [parse_fieldAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
674 for i in range(fieldsSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
675 self.methodAnnotationsItems = [parse_methodAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
676 for i in range(methodsSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
677 self.parameterAnnotationsItems = [parse_parameterAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
678 for i in range(parametersSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
679 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
680 self.data_size = moff() - off |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
681 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
682 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
683 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
684 |
0 | 685 class DEXFile(object): |
686 _data = None | |
687 _header = None | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
688 _maps = None |
0 | 689 _strings = None |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
690 _typeIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
691 _protoIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
692 _fieldIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
693 _methodIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
694 _classDefs = None |
2 | 695 _classDatas = None |
696 _typeLists = None | |
697 _codeItems = None | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
698 _annotationSetItems = None |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
699 _annotationsDirectoryItems = None |
0 | 700 |
701 def __init__(self): | |
702 pass | |
703 | |
704 def open(self, filename): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
705 fo = file(filename, 'r') |
0 | 706 data = fo.read() |
707 | |
708 self.parse(data) | |
709 pass | |
710 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
711 def _parse_maps(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
712 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
713 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
714 off = header.mapOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
715 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
716 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
|
717 off = off + 4 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
718 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
719 maps = [] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
720 for i in range(num): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
721 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
|
722 item = _DEX_MapItem() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
723 item.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
724 maps.append(item) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
725 off = off + _DEX_MapItem.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
726 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
727 |
2 | 728 self._maps = maps |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
729 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
730 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
731 def find_map_item(self, type_value): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
732 maps = self._maps |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
733 try: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
734 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
|
735 except IndexError: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
736 return None |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
737 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
738 return codeItem_map |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
739 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
740 def find_map_item_name(self, type_name): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
741 type_value = _DEX_MapItem.find_type_name(type_name) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
742 map = self.find_map_item(type_value) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
743 return map |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
744 |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
745 def _parse_strings(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
746 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
747 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
748 strings = [] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
749 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
750 num = header.stringIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
751 off = header.stringIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
752 for i in range(num): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
753 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
|
754 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
|
755 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
|
756 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
757 sz, sh = _uleb128(string) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
758 string = string[sh:] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
759 strings.append(string) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
760 off = off + 4 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
761 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
762 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
763 self._strings = strings |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
764 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
765 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
766 def _parse_typeIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
767 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
768 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
769 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
770 num = header.typeIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
771 off = header.typeIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
772 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
773 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
774 type_id = _DEX_TypeId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
775 type_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
776 return type_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
777 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
778 item_size = _DEX_TypeId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
779 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
|
780 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
|
781 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
782 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
|
783 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
784 self._typeIds = typeIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
785 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
786 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
787 def _parse_protoIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
788 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
789 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
790 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
791 num = header.protoIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
792 off = header.protoIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
793 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
794 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
795 proto_id = _DEX_ProtoId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
796 proto_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
797 return proto_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
798 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
799 item_size = _DEX_ProtoId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
800 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
|
801 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
|
802 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
803 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
|
804 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
805 self._protoIds = protoIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
806 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
807 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
808 def _parse_fieldIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
809 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
810 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
811 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
812 num = header.fieldIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
813 off = header.fieldIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
814 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
815 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
816 field_id = _DEX_FieldId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
817 field_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
818 return field_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
819 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
820 item_size = _DEX_FieldId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
821 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
|
822 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
|
823 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
824 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
|
825 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
826 self._fieldIds = fieldIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
827 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
828 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
829 def _parse_methodIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
830 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
831 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
832 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
833 num = header.methodIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
834 off = header.methodIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
835 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
836 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
837 method_id = _DEX_MethodId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
838 method_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
839 return method_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
840 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
841 item_size = _DEX_MethodId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
842 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
|
843 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
|
844 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
845 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
|
846 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
847 self._methodIds = methodIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
848 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
849 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
850 def _parse_classDefs(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
851 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
852 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
853 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
854 num = header.classDefsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
855 off = header.classDefsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
856 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
857 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
858 class_def = _DEX_ClassDef() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
859 class_def.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
860 return class_def |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
861 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
862 item_size = _DEX_ClassDef.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
863 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
|
864 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
|
865 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
866 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
|
867 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
868 self._classDefs = classDefs |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
869 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
870 |
2 | 871 def _parse_classDatas(self): |
872 header = self._header | |
873 data = self._data | |
874 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
875 class_data_map = self.find_map_item_name('kDexTypeClassDataItem') |
2 | 876 |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
877 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
|
878 |
2 | 879 def parse_class_data(): |
880 class_data = _DEX_ClassData() | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
881 class_data.parse(data, moff()) |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
882 moff(class_data.data_size) |
2 | 883 return class_data |
884 class_datas = [parse_class_data() for i in range(class_data_map.size)] | |
885 | |
886 self._classDatas = class_datas | |
887 pass | |
888 | |
889 def _parse_typeLists(self): | |
890 data = self._data | |
891 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
892 typeList_map = self.find_map_item_name('kDexTypeTypeList') |
2 | 893 num_typeLists = typeList_map.size |
894 | |
895 typeLists = _DEX_TypeLists() | |
896 typeLists.parse(num_typeLists, data, typeList_map.offset) | |
897 | |
898 self._typeLists = typeLists | |
899 pass | |
900 | |
901 def _parse_codeItems(self): | |
902 data = self._data | |
903 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
904 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
|
905 if codeItem_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
906 return |
2 | 907 num_codeItems = codeItem_map.size |
908 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
909 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
|
910 |
2 | 911 def parse_code(): |
912 code = _DEX_Code() | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
913 code.parse(data, moff()) |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
914 moff(code.data_size) |
2 | 915 return code |
916 | |
917 codeItems = [parse_code() for i in range(num_codeItems)] | |
918 | |
919 self._codeItems = codeItems | |
920 pass | |
921 | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
922 def _parse_annotationSetItems(self): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
923 data = self._data |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
924 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
925 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
|
926 if annoset_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
927 return |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
928 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
929 moff = man_off(annoset_map.offset) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
930 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
931 def parse_annotationSetItem(): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
932 item = _DEX_AnnotationSetItem() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
933 item.parse(data, moff()) |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
934 moff(item.data_size) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
935 return item |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
936 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
937 self._annotationSetItems = [parse_annotationSetItem() |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
938 for i in range(annoset_map.size)] |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
939 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
940 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
941 def _parse_annotationsDirectoryItems(self): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
942 data = self._data |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
943 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
944 annodir_map = \ |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
945 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
|
946 if annodir_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
947 return |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
948 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
949 moff = man_off(annodir_map.offset) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
950 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
951 def parse_annotationDirItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
952 item = _DEX_AnnotationsDirectoryItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
953 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
954 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
955 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
956 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
957 self._annotationsDirectoryItems = [parse_annotationDirItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
958 for i in range(annodir_map.size)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
959 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
960 |
0 | 961 def parse(self, data): |
962 self._data = data | |
963 header = _DEX_header() | |
964 header.parse(data) | |
965 self._header = header | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
966 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
967 self._parse_maps() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
968 self._parse_strings() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
969 self._parse_typeIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
970 self._parse_protoIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
971 self._parse_fieldIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
972 self._parse_methodIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
973 self._parse_classDefs() |
2 | 974 self._parse_classDatas() |
975 self._parse_typeLists() | |
976 self._parse_codeItems() | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
977 self._parse_annotationSetItems() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
978 self._parse_annotationsDirectoryItems() |
0 | 979 pass |
980 pass | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
981 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
982 if __name__ == '__main__': |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
983 dex = DEXFile() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
984 dex.open('test.dex') |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
985 |
2 | 986 print 'Header' |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
987 h = dex._header |
2 | 988 for attr in h.header_fields: |
989 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
|
990 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
991 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
992 print |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
993 print 'Define Classes' |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
994 strings = dex._strings |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
995 classDefs = dex._classDefs |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
996 typeIds = dex._typeIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
997 for classDef in classDefs: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
998 typeId = typeIds[classDef.classIdx] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
999 descriptor = strings[typeId.descriptorIdx] |
2 | 1000 data_off = classDef.classDataOff |
1001 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
|
1002 pass |
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 print |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1005 print 'Reference Classes' |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1006 for typeId in typeIds: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1007 descriptor = strings[typeId.descriptorIdx] |
2 | 1008 print '\t%s' % (descriptor) |
1009 pass | |
1010 | |
1011 print | |
1012 print 'Class data' | |
1013 methodIds = dex._methodIds | |
1014 classDatas = dex._classDatas | |
1015 for classData in classDatas: | |
1016 print '\tclass' | |
1017 for method in classData.directMethods: | |
1018 code_off = method.codeOff | |
1019 methodId = methodIds[method.methodIdx] | |
1020 name = strings[methodId.nameIdx] | |
1021 print '\t\t%s@0x%x' % (name, code_off) | |
1022 pass | |
1023 for method in classData.virtualMethods: | |
1024 code_off = method.codeOff | |
1025 methodId = methodIds[method.methodIdx] | |
1026 name = strings[methodId.nameIdx] | |
1027 print '\t\t%s@0x%x' % (name, code_off) | |
1028 pass | |
1029 pass | |
1030 | |
1031 print | |
1032 print 'TypeLists size is %d bytes' % (dex._typeLists.data_size) | |
1033 | |
1034 bytes = sum([code.data_size for code in dex._codeItems]) | |
1035 print | |
1036 print 'CodeItems size is %d bytes' % (bytes) | |
1037 | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1038 bytes = sum([annoset.data_size for annoset in dex._annotationSetItems]) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1039 print |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1040 print 'AnnotationSetItems size is %d bytes' % (bytes) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1041 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1042 bytes = sum([annodir.data_size |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1043 for annodir in dex._annotationsDirectoryItems]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1044 print |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1045 print 'AnnotationsDirtoryItems size is %d bytes' % (bytes) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1046 |
2 | 1047 print |
1048 print 'Data maps' | |
1049 maps = dex._maps | |
1050 for map in maps: | |
1051 print '\t0x%04x(%s) size=%d offset=0x%08x' % (map.type, | |
1052 map.types[map.type], | |
1053 map.size, | |
1054 map.offset) | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1055 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1056 pass |