Mercurial > paraspace
annotate paraspace/dexfile.py @ 13:c05fac334ab1
compute size for objects
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 25 May 2011 21:47:15 +0800 |
parents | 8101024c942b |
children | f5728c6868b2 |
rev | line source |
---|---|
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1 import itertools |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
2 |
0 | 3 class _DEX_header(object): |
4 magic = None # 0x00, 8 bytes | |
5 checksum = None # 0x08, 4 bytes | |
6 signature = None # 0x0c, 20 bytes | |
7 fileSize = None # 0x20, 4 bytes | |
8 headerSize = None # 0x24 | |
9 endianTag = None # 0x28 | |
10 linkSize = None # 0x2c | |
11 linkOff = None # 0x30 | |
12 mapOff = None # 0x34 | |
13 stringIdsSize = None # 0x38 | |
14 stringIdsOff = None # 0x3c | |
15 typeIdsSize = None # 0x40 | |
16 typeIdsOff = None # 0x44 | |
17 protoIdsSize = None # 0x48 | |
18 protoIdsOff = None # 0x4c | |
19 fieldIdsSize = None # 0x50 | |
20 fieldIdsOff = None # 0x54 | |
21 methodIdsSize = None # 0x58 | |
22 methodIdsOff = None # 0x5c | |
23 classDefsSize = None # 0x60 | |
24 classDefsOff = None # 0x64 | |
25 dataSize = None # 0x68 | |
26 dataOff = None # 0x6c | |
27 | |
2 | 28 header_fields = \ |
29 'magic checksum signature fileSize headerSize endianTag ' \ | |
30 'linkSize linkOff mapOff stringIdsSize stringIdsOff typeIdsSize ' \ | |
31 'typeIdsOff protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \ | |
32 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \ | |
33 'dataSize dataOff'.split() | |
34 | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
35 data_size = 0x70 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
36 |
0 | 37 def parse(self, data): |
38 self.magic = data[:8] | |
39 self.checksum = data[8: 0x0c] | |
40 self.signature = data[0x0c: 0x20] | |
41 | |
42 idx = 0x20 | |
43 fields = 'fileSize headerSize endianTag linkSize linkOff mapOff ' \ | |
44 'stringIdsSize stringIdsOff typeIdsSize typeIdsOff ' \ | |
45 'protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \ | |
46 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \ | |
47 'dataSize dataOff'.split() | |
48 for field in fields: | |
49 d = data[idx: idx + 4] | |
50 value = _to_uint(d) | |
51 setattr(self, field, value) | |
52 idx = idx + 4 | |
53 pass | |
54 pass | |
55 pass | |
56 | |
57 | |
12
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
58 ## \brief Manage offset |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
59 # |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
60 # The instances are initialized with a offset. Every time an instance |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
61 # is called, it return the offset before advancing offset with specify |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
62 # size. |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
63 # |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
64 # moff = man_off(init_off) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
65 # assert moff(5) == init_off |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
66 # assert moff() == (init_off + 5) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
67 # assert moff() == (init_off + 5) |
8101024c942b
Document class man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
11
diff
changeset
|
68 # |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
69 class man_off(object): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
70 off = None |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
71 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
72 def __init__(self, off): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
73 self.off = off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
74 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
75 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
76 def __call__(self, sz=0): |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
77 off = self.off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
78 self.off = off + sz |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
79 return off |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
80 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
81 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
82 |
0 | 83 def _to_uint(data): |
84 v = 0 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
85 sh = 0 |
0 | 86 for c in data: |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
87 v = v + (ord(c) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
88 sh = sh + 8 |
0 | 89 pass |
90 return v | |
91 | |
92 | |
8 | 93 def _to_int(data): |
94 v = _to_uint(data) | |
95 sz = len(data) | |
96 if sz and ((1 << (sz * 8 - 1)) & v): | |
97 v = -((1 << (sz * 8)) - v) | |
98 pass | |
99 return v | |
100 | |
101 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
102 def _uleb128(data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
103 sh = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
104 v = 0 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
105 for c in data: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
106 cv = ord(c) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
107 v = v + ((cv & 0x7f) << sh) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
108 sh = sh + 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
109 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
110 if cv <= 0x7f: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
111 break |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
112 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
113 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
114 nbytes = sh / 7 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
115 return v, nbytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
116 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
117 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
118 def _to_uleb128(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
119 assert v >= 0 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
120 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
121 data = '' |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
122 while True: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
123 if v > 0x7f: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
124 data = data + chr((v & 0x7f) | 0x80) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
125 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
126 data = data + chr(v & 0x7f) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
127 break |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
128 v = v >> 7 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
129 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
130 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
131 return data |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
132 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
133 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
134 def _uleb128_sz(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
135 return len(_to_uleb128(v)) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
136 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
137 |
2 | 138 def _leb128(data): |
139 v, sh = _uleb128(data) | |
140 if v & (1 << (sh * 7 - 1)): | |
141 v = -((1 << (sh * 7)) - v) | |
142 pass | |
143 return v, sh | |
144 | |
145 | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
146 def _to_leb128(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
147 data = '' |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
148 while True: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
149 if v > 0x3f or v < ~0x3f: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
150 data = data + chr((v & 0x7f) | 0x80) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
151 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
152 data = data + chr(v & 0x7f) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
153 break |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
154 v = v >> 7 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
155 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
156 return data |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
157 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
158 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
159 def _leb128_sz(v): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
160 return len(_to_leb128(v)) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
161 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
162 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
163 def _compute_sz(o): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
164 if hasattr(o, 'compute_size'): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
165 o.compute_size() |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
166 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
167 return o.data_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
168 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
169 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
170 def _sum_data_size(obj_list): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
171 obj_sizes = itertools.imap(_compute_sz, obj_list) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
172 total = sum(obj_sizes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
173 return total |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
174 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
175 |
0 | 176 class _DEX_MapItem(object): |
177 type = None # 2 bytes | |
178 unused = None # 2 bytes | |
179 size = None # 4 bytes | |
180 offset = None # 4 bytes | |
181 | |
182 data_size = 12 | |
2 | 183 types = { |
184 0x0000: 'kDexTypeHeaderItem', | |
185 0x0001: 'kDexTypeStringIdItem', | |
186 0x0002: 'kDexTypeTypeIdItem', | |
187 0x0003: 'kDexTypeProtoIdItem', | |
188 0x0004: 'kDexTypeFieldIdItem', | |
189 0x0005: 'kDexTypeMethodIdItem', | |
190 0x0006: 'kDexTypeClassDefItem', | |
191 0x1000: 'kDexTypeMapList', | |
192 0x1001: 'kDexTypeTypeList', | |
193 0x1002: 'kDexTypeAnnotationSetRefList', | |
194 0x1003: 'kDexTypeAnnotationSetItem', | |
195 0x2000: 'kDexTypeClassDataItem', | |
196 0x2001: 'kDexTypeCodeItem', | |
197 0x2002: 'kDexTypeStringDataItem', | |
198 0x2003: 'kDexTypeDebugInfoItem', | |
199 0x2004: 'kDexTypeAnnotationItem', | |
200 0x2005: 'kDexTypeEncodedArrayItem', | |
201 0x2006: 'kDexTypeAnnotationsDirectoryItem' | |
202 } | |
0 | 203 |
204 def parse(self, data): | |
205 self.type = _to_uint(data[:2]) | |
206 self.size = _to_uint(data[4:8]) | |
207 self.offset = _to_uint(data[8:12]) | |
208 pass | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
209 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
210 @classmethod |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
211 def find_type_name(self, type_name): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
212 type_value = [v |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
213 for v, name in _DEX_MapItem.types.items() |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
214 if name == type_name][0] |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
215 return type_value |
0 | 216 pass |
217 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
218 |
0 | 219 class _DEX_TypeId(object): |
220 descriptorIdx = None # 4 bytes | |
221 | |
222 data_size = 4 | |
223 | |
224 def parse(self, data): | |
225 self.descriptorIdx = _to_uint(data[:4]) | |
226 pass | |
227 pass | |
228 | |
229 | |
230 class _DEX_ProtoId(object): | |
231 shortyIdx = None # 4 bytes | |
232 returnTypeIdx = None # 4 bytes | |
233 parametersOff = None # 4 bytes | |
234 | |
235 data_size = 12 | |
236 | |
237 def parse(self, data): | |
238 self.shortyIdx = _to_uint(data[:4]) | |
239 self.returnTypeIdx = _to_uint(data[4:8]) | |
240 self.parametersOff = _to_uint(data[8:12]) | |
241 pass | |
242 pass | |
243 | |
244 | |
245 class _DEX_FieldId(object): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
246 classIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
247 typeIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
248 nameIdx = None # 4 bytes |
0 | 249 |
250 data_size = 8 | |
251 | |
252 def parse(self, data): | |
253 self.classIdx = _to_uint(data[:2]) | |
254 self.typeIdx = _to_uint(data[2:4]) | |
255 self.nameIdx = _to_uint(data[4:8]) | |
256 pass | |
257 pass | |
258 | |
259 | |
260 class _DEX_MethodId(object): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
261 classIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
262 protoIdx = None # 2 bytes |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
263 nameIdx = None # 4 bytes |
0 | 264 |
265 data_size = 8 | |
266 | |
267 def parse(self, data): | |
268 self.classIdx = _to_uint(data[:2]) | |
269 self.protoIdx = _to_uint(data[2:4]) | |
270 self.nameIdx = _to_uint(data[4:8]) | |
271 pass | |
272 pass | |
273 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
274 |
0 | 275 class _DEX_ClassDef(object): |
276 classIdx = None # 0x00 | |
277 accessFlags = None # 0x04 | |
278 superclassIdx = None # 0x08 | |
279 interfacesOff = None # 0x0c | |
280 sourceFileIdx = None # 0x10 | |
281 annotationsOff = None # 0x14 | |
282 classDataOff = None # 0x18 | |
283 staticValuesOff = None # 0x1c | |
284 | |
285 data_size = 0x20 | |
286 | |
287 def parse(self, data): | |
288 self.classIdx = _to_uint(data[:4]) | |
289 self.accessFlags = _to_uint(data[4:8]) | |
290 self.superclassIdx = _to_uint(data[8:0xc]) | |
291 self.interfacesOff = _to_uint(data[0xc:0x10]) | |
292 self.sourceFileIdx = _to_uint(data[0x10:0x14]) | |
293 self.annotationsOff = _to_uint(data[0x14:0x18]) | |
294 self.classDataOff = _to_uint(data[0x18:0x1c]) | |
295 self.staticValuesOff = _to_uint(data[0x1c:0x20]) | |
296 pass | |
297 pass | |
298 | |
299 | |
2 | 300 class _DEX_ClassDataHeader(object): |
301 staticFieldsSize = None | |
302 instanceFieldsSize = None | |
303 directMethodsSize = None | |
304 virtualMethodsSize = None | |
305 | |
306 data_size = None | |
307 | |
308 def parse(self, data, off): | |
309 self.staticFieldsSize, sh = _uleb128(data[off:off + 10]) | |
310 sz = sh | |
311 off = off + sh | |
312 self.instanceFieldsSize, sh = _uleb128(data[off:off + 10]) | |
313 sz = sz + sh | |
314 off = off + sh | |
315 self.directMethodsSize, sh = _uleb128(data[off:off + 10]) | |
316 sz = sz + sh | |
317 off = off + sh | |
318 self.virtualMethodsSize, sh = _uleb128(data[off:off + 10]) | |
319 sz = sz + sh | |
320 | |
321 self.data_size = sz | |
322 pass | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
323 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
324 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
325 self.data_size = \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
326 _uleb128_sz(self.staticFieldsSize) + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
327 _uleb128_sz(self.instanceFieldsSize) + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
328 _uleb128_sz(self.directMethodsSize) + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
329 _uleb128_sz(self.virtualMethodsSize) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
330 pass |
2 | 331 pass |
332 | |
333 | |
334 class _DEX_Field(object): | |
335 fieldIdx = None | |
336 accessFlags = None | |
337 | |
338 data_size = None | |
339 | |
340 def parse(self, data, off): | |
341 self.fieldIdx, sh = _uleb128(data[off:off + 10]) | |
342 sz = sh | |
343 off = off + sh | |
344 self.accessFlags, sh = _uleb128(data[off:off + 10]) | |
345 sz = sz + sh | |
346 | |
347 self.data_size = sz | |
348 pass | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
349 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
350 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
351 self.data_size = \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
352 _uleb128_sz(self.fieldIdx) + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
353 _uleb128_sz(self.accessFlags) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
354 pass |
2 | 355 pass |
356 | |
357 | |
358 class _DEX_Method(object): | |
359 methodIdx = None | |
360 accessFlags = None | |
361 codeOff = None | |
362 | |
363 data_size = None | |
364 | |
365 def parse(self, data, off): | |
366 self.methodIdx, sh = _uleb128(data[off:off + 10]) | |
367 sz = sh | |
368 off = off + sh | |
369 | |
370 self.accessFlags, sh = _uleb128(data[off:off + 10]) | |
371 sz = sz + sh | |
372 off = off + sh | |
373 | |
374 self.codeOff, sh = _uleb128(data[off:off + 10]) | |
375 sz = sz + sh | |
376 | |
377 self.data_size = sz | |
378 pass | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
379 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
380 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
381 self.data_size = \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
382 _uleb128_sz(self.methodIdx) + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
383 _uleb128_sz(self.accessFlags) + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
384 _uleb128_sz(self.codeOff) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
385 pass |
2 | 386 pass |
387 | |
388 class _DEX_ClassData(object): | |
389 header = None # DexClassDataHeader | |
390 staticFields = None # DexField* | |
391 instanceFields = None # DexField* | |
392 directMethods = None # DexMethod* | |
393 virtualMethods = None # DexMethod* | |
394 | |
395 data_size = None | |
396 | |
397 def parse(self, data, off): | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
398 moff = man_off(off) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
399 |
2 | 400 header = _DEX_ClassDataHeader() |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
401 header.parse(data, moff()) |
2 | 402 self.header = header |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
403 moff(header.data_size) |
2 | 404 |
405 def parse_field(): | |
406 field = _DEX_Field() | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
407 field.parse(data, moff()) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
408 moff(field.data_size) |
2 | 409 |
410 # | |
411 # field index depends previous one to reduce size | |
412 # | |
413 field.fieldIdx = field.fieldIdx + idx[0] | |
414 idx[0] = field.fieldIdx | |
415 | |
416 return field | |
417 | |
418 def parse_method(): | |
419 method = _DEX_Method() | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
420 method.parse(data, moff()) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
421 moff(method.data_size) |
2 | 422 |
423 # | |
424 # method index depends previous one to reduce size | |
425 # | |
426 method.methodIdx = method.methodIdx + idx[0] | |
427 idx[0] = method.methodIdx | |
428 | |
429 return method | |
430 | |
431 idx = [0] | |
432 self.staticFields = [parse_field() | |
433 for i in range(header.staticFieldsSize)] | |
434 idx = [0] | |
435 self.instanceFields = [parse_field() | |
436 for i in range(header.instanceFieldsSize)] | |
437 idx = [0] | |
438 self.directMethods = [parse_method() | |
439 for i in range(header.directMethodsSize)] | |
440 idx = [0] | |
441 self.virtualMethods = [parse_method() | |
442 for i in range(header.virtualMethodsSize)] | |
443 | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
444 self.data_size = moff() - off |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
445 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
446 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
447 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
448 sz = self.header.data_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
449 sz = sz + _sum_data_size(itertools.chain(self.staticFields, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
450 self.instanceFields, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
451 self.directMethods, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
452 self.virtualMethods)) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
453 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
454 self.data_size = sz |
2 | 455 pass |
456 pass | |
457 | |
458 | |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
459 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
|
460 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
|
461 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
462 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
|
463 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
464 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
|
465 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
|
466 pass |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
467 pass |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
468 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
469 |
2 | 470 class _DEX_TypeList(object): |
471 typeItems = None | |
472 | |
473 data_size = None | |
474 | |
475 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
|
476 moff = man_off(off) |
2 | 477 |
6
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
478 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
|
479 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 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
|
484 return item |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
485 |
917f0a9b9d06
Refactor _DEX_TypeItem from _DEX_TypeList for layout info tracking
Thinker K.F. Li <thinker@codemud.net>
parents:
5
diff
changeset
|
486 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
|
487 for i in range(size)] |
2 | 488 |
489 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
|
490 self.data_size = moff() - off |
2 | 491 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
492 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
493 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
494 size = 4 + _sum_data_size(self.typeItems) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
495 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
496 self.data_size = size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
497 pass |
2 | 498 pass |
499 | |
500 | |
501 class _DEX_TypeLists(object): | |
502 typeLists = None | |
503 | |
504 data_size = None | |
505 | |
506 def parse(self, num, data, off): | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
507 moff = man_off(off) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
508 |
2 | 509 def parse(): |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
510 moff.off = (moff(0) + 3) & ~0x3 # aligned for 4 bytes |
2 | 511 typeList = _DEX_TypeList() |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
512 typeList.parse(data, moff()) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
513 moff(typeList.data_size) |
2 | 514 |
515 return typeList | |
516 | |
517 typeLists = [parse() for i in range(num)] | |
518 | |
519 self.typeLists = typeLists | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
520 self.data_size = moff(0) - off |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
521 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
522 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
523 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
524 def compute_align(prev, cur): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
525 v = ((prev + 3) & ~0x3) + cur |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
526 return v |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
527 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
528 sizes = itertools.imap(_compute_sz, self.typeLists) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
529 size = reduce(compute_align, sizes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
530 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
531 self.data_size = size |
2 | 532 pass |
533 pass | |
534 | |
535 | |
536 class _DEX_Try(object): | |
537 startAddr = None # 4 bytes | |
538 insnCount = None # 2 bytes | |
539 handlerOff = None # 2 bytes | |
540 | |
541 data_size = 8 | |
542 | |
543 def parse(self, data, off): | |
544 cur_off = off | |
545 self.startAddr = _to_uint(data[cur_off:cur_off + 4]) | |
546 cur_off = cur_off + 4 | |
547 self.insnCount = _to_uint(data[cur_off:cur_off + 2]) | |
548 cur_off = cur_off + 2 | |
549 self.handlerOff = _to_uint(data[cur_off:cur_off + 2]) | |
550 pass | |
551 pass | |
552 | |
553 | |
554 class _DEX_CatchHandler(object): | |
555 typeIdx = None | |
556 address = None | |
557 | |
558 data_size = None | |
559 | |
560 def parse(self, data, off): | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
561 moff = man_off(off) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
562 self.typeIdx, sh = _uleb128(data[moff():moff() + 5]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
563 moff(sh) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
564 self.address, sh = _uleb128(data[moff():moff() + 5]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
565 moff(sh) |
2 | 566 |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
567 self.data_size = moff() - off |
2 | 568 pass |
569 | |
570 def parse1(self, data, off): | |
571 self.address, sh = _uleb128(data[off:off + 5]) | |
572 | |
573 self.data_size = sh | |
574 pass | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
575 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
576 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
577 if self.typeIdx is not None: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
578 size = _uleb128_sz(self.typeIdx) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
579 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
580 size = 0 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
581 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
582 size = size + _uleb128_sz(self.address) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
583 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
584 self.data_size = size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
585 pass |
2 | 586 pass |
587 | |
588 | |
589 class _DEX_Catch(object): | |
590 catchesAll = None | |
591 handlers = None | |
592 | |
593 data_size = None | |
594 | |
595 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
|
596 moff = man_off(off) |
2 | 597 |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
598 count, sh = _leb128(data[moff():moff() + 5]) |
2 | 599 moff(sh) |
600 | |
601 if count > 0: | |
602 self.catchesAll = False | |
603 else: | |
604 self.catchesAll = True | |
605 count = -count | |
606 pass | |
607 | |
608 def parse_handler(): | |
609 handler = _DEX_CatchHandler() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
610 handler.parse(data, moff()) |
2 | 611 moff(handler.data_size) |
612 return handler | |
613 | |
614 self.handlers = [parse_handler() for i in range(count)] | |
615 | |
616 if self.catchesAll: | |
617 # | |
618 # Additional handler for catching all | |
619 # | |
620 handler = _DEX_CatchHandler() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
621 handler.parse1(data, moff()) |
2 | 622 moff(handler.data_size) |
623 self.handlers.append(handler) | |
624 pass | |
625 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
626 self.data_size = moff() - off |
2 | 627 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
628 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
629 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
630 count = len(self.handlers) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
631 if self.catchesAll: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
632 count = -(count - 1) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
633 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
634 count_sz = _leb128_sz(count) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
635 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
636 handlers_size = _sum_data_size(self.handlers) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
637 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
638 size = count_sz + handlers_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
639 pass |
2 | 640 pass |
641 | |
642 | |
643 class _DEX_Code(object): | |
644 registersSize = None # 2 bytes | |
645 insSize = None # 2 bytes | |
646 outsSize = None # 2 bytes | |
647 triesSize = None # 2 bytes | |
648 debugInfoOff = None # 4 bytes | |
649 insnsSize = None # 4 bytes | |
650 insns = None | |
651 try_items = None | |
652 catch_handler_items = None | |
653 | |
654 data_size = None | |
655 | |
656 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
|
657 moff = man_off(off) |
2 | 658 |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
659 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
|
660 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
|
661 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
|
662 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
|
663 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
|
664 self.insnsSize = _to_uint(data[moff(4):moff()]) |
2 | 665 |
666 moff(self.insnsSize * 2) # skip insns | |
667 | |
668 if self.triesSize > 0: | |
669 def parse_try_item(): | |
670 try_item = _DEX_Try() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
671 try_item.parse(data, moff()) |
2 | 672 moff(try_item.data_size) |
673 return try_item | |
674 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
675 moff.off = (moff.off + 3) & ~0x3 # align tries to 4 bytes |
2 | 676 self.try_items = [parse_try_item() for i in range(self.triesSize)] |
677 | |
678 def parse_catch_handler(): | |
679 catch = _DEX_Catch() | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
680 catch.parse(data, moff()) |
2 | 681 moff(catch.data_size) |
682 return catch | |
683 | |
684 # | |
685 # No tries, no catch handlers | |
686 # | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
687 handlersSize, sh = _uleb128(data[moff():moff() + 5]) |
2 | 688 moff(sh) |
689 self.catch_handler_items = [parse_catch_handler() | |
690 for i in range(handlersSize)] | |
691 pass | |
692 | |
5
97b7006ced5f
Move move_off imps. to man_off
Thinker K.F. Li <thinker@codemud.net>
parents:
4
diff
changeset
|
693 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
|
694 self.data_size = moff() - off |
2 | 695 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
696 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
697 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
698 size = 16 + self.insnsSize * 2 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
699 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
700 if self.triesSize > 0: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
701 size = (size + 0x3) & ~0x3 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
702 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
703 try_items_size = _sum_data_size(self.try_items) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
704 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
705 catch_handler_items = self.catch_handler_items |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
706 catch_handler_items_cnt = len(catch_handler_items) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
707 catch_handler_items_cnt_sz = _uleb128_sz(catch_handler_items_cnt) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
708 catch_handler_items_sz = _sum_data_size(catch_handler_items) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
709 catch_handler_items_size = \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
710 catch_handler_items_cnt_sz + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
711 catch_handler_items_sz |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
712 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
713 size = size + try_items_size + catch_handler_items_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
714 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
715 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
716 self.data_size = (size + 3) & ~0x3 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
717 pass |
2 | 718 pass |
719 | |
720 | |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
721 ## \brief File offset to Annotation item. |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
722 # |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
723 # 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
|
724 # information for layout algorithm. |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
725 # |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
726 class _DEX_AnnotationRefItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
727 annotationOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
728 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
729 data_size = 4 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
730 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
731 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
732 self.annotationOff = _to_uint(data[off:off + 4]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
733 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
734 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
735 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
736 class _DEX_AnnotationSetItem(object): |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
737 # size = None # 4 bytes |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
738 annotations = None # 4 * size bytes |
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 data_size = None |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
741 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
742 def parse(self, data, off): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
743 moff = man_off(off) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
744 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
745 size = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
746 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
747 def parse_annotation_ref(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
748 ref = _DEX_AnnotationRefItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
749 ref.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
750 moff(ref.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
751 return ref |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
752 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
753 self.annotations = [parse_annotation_ref() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
754 for i in range(size)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
755 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
756 self.data_size = moff() - off |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
757 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
758 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
759 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
760 annotations_size = _sum_data_size(self.annotations) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
761 size = 4 + annotations_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
762 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
763 self.data_size = size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
764 pass |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
765 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
766 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
767 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
768 class _DEX_FieldAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
769 fieldIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
770 annotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
771 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
772 data_size = 8 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
773 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
774 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
775 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
776 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
777 self.fieldIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
778 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
779 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
780 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
781 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
782 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
783 class _DEX_MethodAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
784 methodIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
785 annotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
786 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
787 data_size = 8 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
788 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
789 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
790 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
791 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
792 self.methodIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
793 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
794 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
795 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
796 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
797 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
798 class _DEX_ParameterAnnotationsItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
799 methodIdx = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
800 annotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
801 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
802 data_size = 8 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
803 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
804 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
805 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
806 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
807 self.methodIdx = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
808 self.annotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
809 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
810 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
811 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
812 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
813 class _DEX_AnnotationsDirectoryItem(object): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
814 classAnnotationsOff = None # 4 bytes |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
815 fieldAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
816 methodAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
817 parameterAnnotationsItems = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
818 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
819 data_size = None |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
820 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
821 def parse(self, data, off): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
822 moff = man_off(off) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
823 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
824 self.classAnnotationsOff = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
825 fieldsSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
826 methodsSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
827 parametersSize = _to_uint(data[moff(4):moff()]) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
828 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
829 def parse_fieldAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
830 item = _DEX_FieldAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
831 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
832 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
833 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
834 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
835 def parse_methodAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
836 item = _DEX_MethodAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
837 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
838 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
839 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
840 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
841 def parse_parameterAnnotationsItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
842 item = _DEX_ParameterAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
843 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
844 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
845 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
846 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
847 self.fieldAnnotationsItems = [parse_fieldAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
848 for i in range(fieldsSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
849 self.methodAnnotationsItems = [parse_methodAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
850 for i in range(methodsSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
851 self.parameterAnnotationsItems = [parse_parameterAnnotationsItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
852 for i in range(parametersSize)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
853 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
854 self.data_size = moff() - off |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
855 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
856 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
857 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
858 field_anno_sz = _sum_data_size(self.fieldAnnotationsItems) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
859 method_anno_sz = _sum_data_size(self.methodAnnotationsItems) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
860 parameter_anno_sz = _sum_data_size(self.parameterAnnotationsItems) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
861 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
862 all_items_size = field_anno_sz + method_anno_sz + parameter_anno_sz |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
863 size = 16 + all_items_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
864 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
865 self.data_size = size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
866 pass |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
867 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
868 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
869 |
8 | 870 ## |
871 # | |
872 # \see createAnnotationMember() in dalvik/vm/reflect/Annotation.c | |
873 # | |
874 class _DEX_AnnotationMember(object): | |
875 nameIdx = None # optional | |
876 valueType = None # 1 byte | |
877 value = None | |
878 | |
879 # | |
880 # Constants from DexFile.h | |
881 # | |
882 kDexAnnotationByte = 0x00 | |
883 kDexAnnotationShort = 0x02 | |
884 kDexAnnotationChar = 0x03 | |
885 kDexAnnotationInt = 0x04 | |
886 kDexAnnotationLong = 0x06 | |
887 kDexAnnotationFloat = 0x10 | |
888 kDexAnnotationDouble = 0x11 | |
889 kDexAnnotationString = 0x17 | |
890 kDexAnnotationType = 0x18 | |
891 kDexAnnotationField = 0x19 | |
892 kDexAnnotationMethod = 0x1a | |
893 kDexAnnotationEnum = 0x1b | |
894 kDexAnnotationArray = 0x1c | |
895 kDexAnnotationAnnotation = 0x1d | |
896 kDexAnnotationNull = 0x1e | |
897 kDexAnnotationBoolean = 0x1f | |
898 | |
899 kDexAnnotationValueTypeMask = 0x1f | |
900 kDexAnnotationValueArgShift = 5 | |
901 | |
902 data_size = None | |
903 | |
904 def parse(self, data, off): | |
905 self.nameIdx, sh = _uleb128(data[off:off + 5]) | |
906 | |
907 self.parse_noname(data, off + sh) | |
908 | |
909 self.data_size = self.data_size + sh | |
910 pass | |
911 | |
912 def parse_noname(self, data, off): | |
913 moff = man_off(off) | |
914 | |
915 valueType = _to_uint(data[moff(1):moff()]) | |
916 self.valueType = valueType | |
917 width = valueType >> self.kDexAnnotationValueArgShift | |
918 | |
919 vtype = valueType & self.kDexAnnotationValueTypeMask | |
920 | |
921 if vtype == self.kDexAnnotationByte: | |
922 self.value = _to_int(data[moff(width):moff()]) | |
923 moff(1) | |
924 pass | |
925 elif vtype == self.kDexAnnotationShort: | |
926 self.value = _to_int(data[moff(width):moff()]) | |
927 pass | |
928 elif vtype == self.kDexAnnotationChar: | |
929 self.value = _to_uint(data[moff(width):moff()]) | |
930 moff(1) | |
931 pass | |
932 elif vtype == self.kDexAnnotationInt: | |
933 self.value = _to_int(data[moff(width):moff()]) | |
934 moff(1) | |
935 pass | |
936 elif vtype == self.kDexAnnotationLong: | |
937 self.value = _to_int(data[moff(width):moff()]) | |
938 moff(1) | |
939 pass | |
940 elif vtype == self.kDexAnnotationFloat: | |
941 self.value = _to_uint(data[moff(width):moff()]) | |
942 moff(1) | |
943 pass | |
944 elif vtype == self.kDexAnnotationDouble: | |
945 self.value = _to_uint(data[moff(width):moff()]) | |
946 moff(1) | |
947 pass | |
948 elif vtype == self.kDexAnnotationBoolean: | |
949 self.value = width != 0 | |
950 pass | |
951 elif vtype == self.kDexAnnotationString: # string index | |
952 self.value = _to_uint(data[moff(width):moff()]) | |
953 moff(1) | |
954 pass | |
955 elif vtype == self.kDexAnnotationType: # TypeId index | |
956 self.value = _to_uint(data[moff(width):moff()]) | |
957 moff(1) | |
958 pass | |
959 elif vtype == self.kDexAnnotationMethod: # MethodId index | |
960 self.value = _to_uint(data[moff(width):moff()]) | |
961 moff(1) | |
962 pass | |
963 elif vtype == self.kDexAnnotationField: | |
964 self.value = _to_uint(data[moff(width):moff()]) | |
965 moff(1) | |
966 pass | |
967 elif vtype == self.kDexAnnotationEnum: # FieldId index | |
968 self.value = _to_uint(data[moff(width):moff()]) | |
969 moff(1) | |
970 pass | |
971 elif vtype == self.kDexAnnotationArray: | |
972 size, sh = _uleb128(data[moff():moff() + 5]) | |
973 moff(sh) | |
974 | |
975 def parse_array_elm(): | |
976 elm = _DEX_AnnotationMember() | |
977 elm.parse_noname(data, moff()) | |
978 moff(elm.data_size) | |
979 return elm | |
980 | |
981 self.value = [parse_array_elm() | |
982 for i in range(size)] | |
983 pass | |
984 elif vtype == self.kDexAnnotationAnnotation: | |
985 annoitem = _DEX_AnnotationItem() | |
986 annoitem.parse_novisibility(data, moff()) | |
987 moff(annoitem.data_size) | |
988 self.value = annoitem | |
989 pass | |
990 elif vtype == self.kDexAnnotationNull: | |
991 self.value = 0 | |
992 pass | |
993 else: | |
994 raise ValueError, \ | |
995 'Bad annotation element value byte 0x02x' % (valueType) | |
996 | |
997 self.data_size = moff() - off | |
998 pass | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
999 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1000 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1001 if self.nameIdx is not None: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1002 nameIdx_size = _uleb128_sz(self.nameIdx) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1003 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1004 nameIdx_size = 0 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1005 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1006 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1007 valueType = self.valueType |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1008 width = valueType >> self.kDexAnnotationValueArgShift |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1009 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1010 vtype = valueType & self.kDexAnnotationValueTypeMask |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1011 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1012 if vtype in (self.kDexAnnotationByte, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1013 self.kDexAnnotationShort, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1014 self.kDexAnnotationChar, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1015 self.kDexAnnotationInt, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1016 self.kDexAnnotationLong, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1017 self.kDexAnnotationFloat, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1018 self.kDexAnnotationDouble, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1019 self.kDexAnnotationString, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1020 self.kDexAnnotationType, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1021 self.kDexAnnotationMethod, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1022 self.kDexAnnotationField, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1023 self.kDexAnnotationEnum): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1024 value_size = width + 2 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1025 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1026 elif vtype in (self.kDexAnnotationBoolean, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1027 self.kDexAnnotationNull): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1028 value_size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1029 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1030 elif vtype == self.kDexAnnotationArray: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1031 array_cnt = len(self.value) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1032 array_cnt_size = _uleb128_sz(array_cnt) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1033 array_size = _sum_data_size(self.value) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1034 value_size = 1 + array_cnt_size + array_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1035 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1036 elif vtype == self.kDexAnnotationAnnotation: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1037 value_size = 1 + _compute_sz(self.value) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1038 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1039 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1040 raise ValueError, \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1041 'Bad annotation element value byte 0x02x' % (valueType) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1042 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1043 self.data_size = nameIdx_size + value_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1044 pass |
8 | 1045 pass |
1046 | |
1047 | |
1048 ## \brief Annotation item | |
1049 # | |
1050 # \see processEncodedAnnotation() in dalvik/vm/reflect/Annotation.c | |
1051 # | |
1052 class _DEX_AnnotationItem(object): | |
1053 visibility = None # 1 byte (optional) | |
1054 typeIdx = None | |
1055 members = None | |
1056 | |
1057 kDexVisibilityBuild = 0x00 | |
1058 kDexVisibilityRuntime = 0x01 | |
1059 kDexVisibilitySystem = 0x02 | |
1060 | |
1061 data_size = None | |
1062 | |
1063 def parse(self, data, off): | |
1064 self.visibility = _to_uint(data[off:off + 1]) | |
1065 | |
1066 self.parse_novisibility(data, off + 1) | |
1067 | |
1068 self.data_size = self.data_size + 1 | |
1069 pass | |
1070 | |
1071 def parse_novisibility(self, data, off): | |
1072 moff = man_off(off) | |
1073 | |
1074 self.typeIdx, sh = _uleb128(data[moff():moff() + 5]) | |
1075 moff(sh) | |
1076 size, sh = _uleb128(data[moff():moff() + 5]) | |
1077 moff(sh) | |
1078 | |
1079 def parse_AnnotationMemmber(): | |
1080 member = _DEX_AnnotationMember() | |
1081 member.parse(data, moff()) | |
1082 moff(member.data_size) | |
1083 return member | |
1084 | |
1085 self.members = [parse_AnnotationMemmber() | |
1086 for i in range(size)] | |
1087 | |
1088 self.data_size = moff() - off | |
1089 pass | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1090 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1091 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1092 if self.visibility is not None: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1093 visibility_size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1094 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1095 visibility_size = 0 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1096 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1097 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1098 typeIdx_size = _uleb128_sz(self.typeIdx) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1099 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1100 members_cnt_size = _uleb128_sz(len(self.members)) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1101 members_size = members_cnt_size + _sum_data_size(self.members) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1102 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1103 size = visibility_size + typeIdx_size + members_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1104 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1105 self.data_size = size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1106 pass |
8 | 1107 pass |
1108 | |
1109 | |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1110 class _DEX_EncodedArrayItem(object): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1111 elements = None |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1112 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1113 data_size = None |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1114 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1115 def parse(self, data, off): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1116 moff = man_off(off) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1117 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1118 size, sh = _uleb128(data[moff():moff() + 5]) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1119 moff(sh) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1120 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1121 def parse_element(): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1122 element = _DEX_AnnotationMember() |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1123 element.parse_noname(data, moff()) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1124 moff(element.data_size) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1125 return element |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1126 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1127 self.elements = [parse_element() |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1128 for i in range(size)] |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1129 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1130 self.data_size = moff() - off |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1131 pass |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1132 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1133 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1134 elements_cnt_size = _uleb128_sz(len(self.elements)) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1135 size = elements_cnt_size + _sum_data_size(self.elements) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1136 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1137 self.data_size = size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1138 pass |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1139 pass |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1140 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1141 |
11 | 1142 class _DEX_DebugInfoItem(object): |
1143 start_line = None | |
1144 parameters = None | |
1145 opcodes = None | |
1146 | |
1147 DBG_END_SEQUENCE = 0x00 | |
1148 DBG_ADVANCE_PC = 0x01 | |
1149 DBG_ADVANCE_LINE = 0x02 | |
1150 DBG_START_LOCAL = 0x03 | |
1151 DBG_START_LOCAL_EXTENDED = 0x04 | |
1152 DBG_END_LOCAL = 0x05 | |
1153 DBG_RESTART_LOCAL = 0x06 | |
1154 DBG_SET_PROLOGUE_END = 0x07 | |
1155 DBG_SET_EPILOGUE_BEGIN = 0x08 | |
1156 DBG_SET_FILE = 0x09 | |
1157 DBG_FIRST_SPECIAL = 0x0a | |
1158 DBG_LINE_BASE = -4 | |
1159 DBG_LINE_RANGE = 15 | |
1160 | |
1161 data_size = None | |
1162 | |
1163 def parse(self, data, off): | |
1164 moff = man_off(off) | |
1165 | |
1166 self.start_line, sh = _uleb128(data[moff():moff() + 5]) | |
1167 moff(sh) | |
1168 parameters_size, sh = _uleb128(data[moff():moff() + 5]) | |
1169 moff(sh) | |
1170 | |
1171 # | |
1172 # Parse parameters | |
1173 # | |
1174 def parse_parameter(): | |
1175 paramter, sh = _uleb128(data[moff():moff() + 5]) | |
1176 moff(sh) | |
1177 return paramter | |
1178 | |
1179 self.parameters = [parse_parameter() | |
1180 for i in range(parameters_size)] | |
1181 | |
1182 # | |
1183 # Parse debug opcodes | |
1184 # | |
1185 opcodes = [] | |
1186 while True: | |
1187 opcode = _to_uint(data[moff(1):moff()]) | |
1188 | |
1189 if opcode == self.DBG_END_SEQUENCE: | |
1190 opcodes.append((opcode,)) | |
1191 break | |
1192 elif opcode == self.DBG_ADVANCE_PC: | |
1193 adv, sh = _uleb128(data[moff():moff() + 5]) | |
1194 moff(sh) | |
1195 opcodes.append((opcode, adv)) | |
1196 pass | |
1197 elif opcode == self.DBG_ADVANCE_LINE: | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1198 adv, sh = _leb128(data[moff():moff() + 5]) |
11 | 1199 moff(sh) |
1200 opcodes.append((opcode, adv)) | |
1201 pass | |
1202 elif opcode in (self.DBG_START_LOCAL, | |
1203 self.DBG_START_LOCAL_EXTENDED): | |
1204 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1205 moff(sh) | |
1206 name, sh = _uleb128(data[moff():moff() + 5]) | |
1207 moff(sh) | |
1208 descriptor, sh = _uleb128(data[moff():moff() + 5]) | |
1209 moff(sh) | |
1210 if opcode == self.DBG_START_LOCAL_EXTENDED: | |
1211 signature, sh = _uleb128(data[moff():moff() + 5]) | |
1212 moff(sh) | |
1213 opcodes.append((opcode, reg, name, descriptor, signature)) | |
1214 else: | |
1215 opcodes.append((opcode, reg, name, descriptor)) | |
1216 pass | |
1217 pass | |
1218 elif opcode == self.DBG_END_LOCAL: | |
1219 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1220 moff(sh) | |
1221 opcodes.append((opcode, reg)) | |
1222 pass | |
1223 elif opcode == self.DBG_RESTART_LOCAL: | |
1224 reg, sh = _uleb128(data[moff():moff() + 5]) | |
1225 moff(sh) | |
1226 opcodes.append((opcode, reg)) | |
1227 pass | |
1228 elif opcode in (self.DBG_SET_PROLOGUE_END, | |
1229 self.DBG_SET_EPILOGUE_BEGIN, | |
1230 self.DBG_SET_FILE): | |
1231 opcodes.append((opcode,)) | |
1232 pass | |
1233 else: | |
1234 opcodes.append((opcode,)) | |
1235 pass | |
1236 pass | |
1237 self.opcodes = opcodes | |
1238 | |
1239 self.data_size = moff() - off | |
1240 pass | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1241 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1242 def compute_size(self): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1243 start_line_size = _uleb128_sz(self.start_line) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1244 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1245 parameters_cnt_size = _uleb128_sz(len(self.parameters)) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1246 parameter_sizes = itertools.imap(_uleb128_sz, self.parameters) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1247 parameters_size = parameters_cnt_size + sum(parameter_sizes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1248 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1249 def compute_opcode_size(code): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1250 opcode = code[0] |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1251 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1252 if opcode == self.DBG_END_SEQUENCE: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1253 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1254 elif opcode == self.DBG_ADVANCE_PC: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1255 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1256 elif opcode == self.DBG_ADVANCE_LINE: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1257 size = 1 + _leb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1258 elif opcode in (self.DBG_START_LOCAL, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1259 self.DBG_START_LOCAL_EXTENDED): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1260 size = 1 + _uleb128_sz(code[1]) + _uleb128_sz(code[2]) + \ |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1261 _uleb128_sz(code[3]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1262 if len(code) == 5: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1263 size = size + _uleb128_sz(code[4]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1264 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1265 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1266 elif opcode == self.DBG_END_LOCAL: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1267 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1268 elif opcode == self.DBG_RESTART_LOCAL: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1269 size = 1 + _uleb128_sz(code[1]) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1270 elif opcode in (self.DBG_SET_PROLOGUE_END, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1271 self.DBG_SET_EPILOGUE_BEGIN, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1272 self.DBG_SET_FILE): |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1273 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1274 else: |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1275 size = 1 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1276 pass |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1277 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1278 return size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1279 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1280 opcode_sizes = itertools.imap(compute_opcode_size, self.opcodes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1281 opcode_sizes = [i for i in opcode_sizes] |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1282 opcodes_size = sum(opcode_sizes) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1283 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1284 size = start_line_size + parameters_size + opcodes_size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1285 |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1286 self.data_size = size |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1287 pass |
11 | 1288 pass |
1289 | |
1290 | |
0 | 1291 class DEXFile(object): |
1292 _data = None | |
1293 _header = None | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1294 _maps = None |
0 | 1295 _strings = None |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1296 _typeIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1297 _protoIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1298 _fieldIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1299 _methodIds = None |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1300 _classDefs = None |
2 | 1301 _classDatas = None |
1302 _typeLists = None | |
1303 _codeItems = None | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1304 _annotationSetItems = None |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1305 _annotationsDirectoryItems = None |
8 | 1306 _annotationItems = None |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1307 _encodedArrayItems = None |
11 | 1308 _debugInfoItems = None |
0 | 1309 |
1310 def __init__(self): | |
1311 pass | |
1312 | |
1313 def open(self, filename): | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1314 fo = file(filename, 'r') |
0 | 1315 data = fo.read() |
1316 | |
1317 self.parse(data) | |
1318 pass | |
1319 | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1320 def _parse_maps(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1321 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1322 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1323 off = header.mapOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1324 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1325 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
|
1326 off = off + 4 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1327 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1328 maps = [] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1329 for i in range(num): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1330 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
|
1331 item = _DEX_MapItem() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1332 item.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1333 maps.append(item) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1334 off = off + _DEX_MapItem.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1335 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1336 |
2 | 1337 self._maps = maps |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1338 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1339 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1340 def find_map_item(self, type_value): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1341 maps = self._maps |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1342 try: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1343 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
|
1344 except IndexError: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1345 return None |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1346 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1347 return codeItem_map |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1348 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1349 def find_map_item_name(self, type_name): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1350 type_value = _DEX_MapItem.find_type_name(type_name) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1351 map = self.find_map_item(type_value) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1352 return map |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1353 |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1354 def _parse_strings(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1355 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1356 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1357 strings = [] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1358 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1359 num = header.stringIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1360 off = header.stringIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1361 for i in range(num): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1362 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
|
1363 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
|
1364 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
|
1365 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1366 sz, sh = _uleb128(string) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1367 string = string[sh:] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1368 strings.append(string) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1369 off = off + 4 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1370 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1371 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1372 self._strings = strings |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1373 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1374 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1375 def _parse_typeIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1376 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1377 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1378 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1379 num = header.typeIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1380 off = header.typeIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1381 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1382 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1383 type_id = _DEX_TypeId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1384 type_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1385 return type_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1386 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1387 item_size = _DEX_TypeId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1388 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
|
1389 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
|
1390 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1391 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
|
1392 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1393 self._typeIds = typeIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1394 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1395 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1396 def _parse_protoIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1397 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1398 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1399 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1400 num = header.protoIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1401 off = header.protoIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1402 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1403 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1404 proto_id = _DEX_ProtoId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1405 proto_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1406 return proto_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1407 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1408 item_size = _DEX_ProtoId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1409 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
|
1410 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
|
1411 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1412 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
|
1413 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1414 self._protoIds = protoIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1415 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1416 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1417 def _parse_fieldIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1418 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1419 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1420 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1421 num = header.fieldIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1422 off = header.fieldIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1423 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1424 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1425 field_id = _DEX_FieldId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1426 field_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1427 return field_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1428 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1429 item_size = _DEX_FieldId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1430 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
|
1431 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
|
1432 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1433 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
|
1434 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1435 self._fieldIds = fieldIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1436 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1437 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1438 def _parse_methodIds(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1439 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1440 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1441 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1442 num = header.methodIdsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1443 off = header.methodIdsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1444 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1445 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1446 method_id = _DEX_MethodId() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1447 method_id.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1448 return method_id |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1449 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1450 item_size = _DEX_MethodId.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1451 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
|
1452 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
|
1453 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1454 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
|
1455 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1456 self._methodIds = methodIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1457 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1458 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1459 def _parse_classDefs(self): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1460 data = self._data |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1461 header = self._header |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1462 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1463 num = header.classDefsSize |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1464 off = header.classDefsOff |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1465 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1466 def parse(item_data): |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1467 class_def = _DEX_ClassDef() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1468 class_def.parse(item_data) |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1469 return class_def |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1470 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1471 item_size = _DEX_ClassDef.data_size |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1472 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
|
1473 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
|
1474 for item_off in item_offs] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1475 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
|
1476 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1477 self._classDefs = classDefs |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1478 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1479 |
2 | 1480 def _parse_classDatas(self): |
1481 header = self._header | |
1482 data = self._data | |
1483 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1484 class_data_map = self.find_map_item_name('kDexTypeClassDataItem') |
2 | 1485 |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1486 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
|
1487 |
2 | 1488 def parse_class_data(): |
1489 class_data = _DEX_ClassData() | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1490 class_data.parse(data, moff()) |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1491 moff(class_data.data_size) |
2 | 1492 return class_data |
1493 class_datas = [parse_class_data() for i in range(class_data_map.size)] | |
1494 | |
1495 self._classDatas = class_datas | |
1496 pass | |
1497 | |
1498 def _parse_typeLists(self): | |
1499 data = self._data | |
1500 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1501 typeList_map = self.find_map_item_name('kDexTypeTypeList') |
2 | 1502 num_typeLists = typeList_map.size |
1503 | |
1504 typeLists = _DEX_TypeLists() | |
1505 typeLists.parse(num_typeLists, data, typeList_map.offset) | |
1506 | |
1507 self._typeLists = typeLists | |
1508 pass | |
1509 | |
1510 def _parse_codeItems(self): | |
1511 data = self._data | |
1512 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1513 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
|
1514 if codeItem_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1515 return |
2 | 1516 num_codeItems = codeItem_map.size |
1517 | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1518 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
|
1519 |
2 | 1520 def parse_code(): |
1521 code = _DEX_Code() | |
7
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1522 code.parse(data, moff()) |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1523 moff(code.data_size) |
2 | 1524 return code |
1525 | |
1526 codeItems = [parse_code() for i in range(num_codeItems)] | |
1527 | |
1528 self._codeItems = codeItems | |
1529 pass | |
1530 | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1531 def _parse_annotationSetItems(self): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1532 data = self._data |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1533 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1534 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
|
1535 if annoset_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1536 return |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1537 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1538 moff = man_off(annoset_map.offset) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1539 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1540 def parse_annotationSetItem(): |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1541 item = _DEX_AnnotationSetItem() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1542 item.parse(data, moff()) |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1543 moff(item.data_size) |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1544 return item |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1545 |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1546 self._annotationSetItems = [parse_annotationSetItem() |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1547 for i in range(annoset_map.size)] |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1548 pass |
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1549 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1550 def _parse_annotationsDirectoryItems(self): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1551 data = self._data |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1552 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1553 annodir_map = \ |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1554 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
|
1555 if annodir_map is None: |
1d776ec496e5
Migrate all to find_map_item_name()
Thinker K.F. Li <thinker@codemud.net>
parents:
6
diff
changeset
|
1556 return |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1557 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1558 moff = man_off(annodir_map.offset) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1559 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1560 def parse_annotationDirItem(): |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1561 item = _DEX_AnnotationsDirectoryItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1562 item.parse(data, moff()) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1563 moff(item.data_size) |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1564 return item |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1565 |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1566 self._annotationsDirectoryItems = [parse_annotationDirItem() |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1567 for i in range(annodir_map.size)] |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1568 pass |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1569 |
8 | 1570 def _parse_annotationItems(self): |
1571 data = self._data | |
1572 | |
1573 annoitem_map = self.find_map_item_name('kDexTypeAnnotationItem') | |
1574 if annoitem_map is None: | |
1575 return | |
1576 | |
1577 moff = man_off(annoitem_map.offset) | |
1578 | |
1579 def parse_annotationItem(): | |
1580 item = _DEX_AnnotationItem() | |
1581 item.parse(data, moff()) | |
1582 moff(item.data_size) | |
1583 return item | |
1584 | |
1585 self._annotationItems = [parse_annotationItem() | |
1586 for i in range(annoitem_map.size)] | |
1587 pass | |
1588 | |
9
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1589 def _parse_header(self): |
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1590 data = self._data |
0 | 1591 header = _DEX_header() |
1592 header.parse(data) | |
1593 self._header = header | |
9
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1594 pass |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1595 |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1596 def _parse_encodedArrayItems(self): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1597 data = self._data |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1598 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1599 encodedArrayItem_map = \ |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1600 self.find_map_item_name('kDexTypeEncodedArrayItem') |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1601 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1602 moff = man_off(encodedArrayItem_map.offset) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1603 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1604 def parse_encodedArrayItem(): |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1605 item = _DEX_EncodedArrayItem() |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1606 item.parse(data, moff()) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1607 moff(item.data_size) |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1608 return item |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1609 |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1610 self._encodedArrayItems = [parse_encodedArrayItem() |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1611 for i in range(encodedArrayItem_map.size)] |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1612 pass |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1613 |
11 | 1614 def _parse_debugInfoItems(self): |
1615 data = self._data | |
1616 | |
1617 debugInfoItem_map = \ | |
1618 self.find_map_item_name('kDexTypeDebugInfoItem') | |
1619 | |
1620 moff = man_off(debugInfoItem_map.offset) | |
1621 | |
1622 def parse_debugInfoItem(): | |
1623 item = _DEX_DebugInfoItem() | |
1624 item.parse(data, moff()) | |
1625 moff(item.data_size) | |
1626 return item | |
1627 | |
1628 self._debugInfoItems = [parse_debugInfoItem() | |
1629 for i in range(debugInfoItem_map.size)] | |
1630 pass | |
1631 | |
9
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1632 def parse(self, data): |
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1633 self._data = data |
9a49826b26d4
Refactor _parse_header()
Thinker K.F. Li <thinker@codemud.net>
parents:
8
diff
changeset
|
1634 self._parse_header() |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1635 self._parse_maps() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1636 self._parse_strings() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1637 self._parse_typeIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1638 self._parse_protoIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1639 self._parse_fieldIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1640 self._parse_methodIds() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1641 self._parse_classDefs() |
2 | 1642 self._parse_classDatas() |
1643 self._parse_typeLists() | |
1644 self._parse_codeItems() | |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1645 self._parse_annotationSetItems() |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1646 self._parse_annotationsDirectoryItems() |
8 | 1647 self._parse_annotationItems() |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1648 self._parse_encodedArrayItems() |
11 | 1649 self._parse_debugInfoItems() |
0 | 1650 pass |
1651 pass | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1652 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1653 if __name__ == '__main__': |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1654 dex = DEXFile() |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1655 dex.open('test.dex') |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1656 |
2 | 1657 print 'Header' |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1658 h = dex._header |
2 | 1659 for attr in h.header_fields: |
1660 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
|
1661 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1662 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1663 print |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1664 print 'Define Classes' |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1665 strings = dex._strings |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1666 classDefs = dex._classDefs |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1667 typeIds = dex._typeIds |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1668 for classDef in classDefs: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1669 typeId = typeIds[classDef.classIdx] |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1670 descriptor = strings[typeId.descriptorIdx] |
2 | 1671 data_off = classDef.classDataOff |
1672 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
|
1673 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1674 |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1675 print |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1676 print 'Reference Classes' |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1677 for typeId in typeIds: |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1678 descriptor = strings[typeId.descriptorIdx] |
2 | 1679 print '\t%s' % (descriptor) |
1680 pass | |
1681 | |
1682 print | |
1683 print 'Class data' | |
1684 methodIds = dex._methodIds | |
1685 classDatas = dex._classDatas | |
1686 for classData in classDatas: | |
1687 print '\tclass' | |
1688 for method in classData.directMethods: | |
1689 code_off = method.codeOff | |
1690 methodId = methodIds[method.methodIdx] | |
1691 name = strings[methodId.nameIdx] | |
1692 print '\t\t%s@0x%x' % (name, code_off) | |
1693 pass | |
1694 for method in classData.virtualMethods: | |
1695 code_off = method.codeOff | |
1696 methodId = methodIds[method.methodIdx] | |
1697 name = strings[methodId.nameIdx] | |
1698 print '\t\t%s@0x%x' % (name, code_off) | |
1699 pass | |
1700 pass | |
1701 | |
1702 print | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1703 print 'TypeLists size is %d/%d bytes' % (dex._typeLists.data_size, |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1704 _compute_sz(dex._typeLists)) |
2 | 1705 |
1706 bytes = sum([code.data_size for code in dex._codeItems]) | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1707 rbytes = sum([_compute_sz(code) for code in dex._codeItems]) |
2 | 1708 print |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1709 print 'CodeItems size is %d/%d bytes' % (bytes, rbytes) |
2 | 1710 |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1711 bytes = sum([annoset.data_size for annoset in dex._annotationSetItems]) |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1712 rbytes = sum([_compute_sz(annoset) for annoset in dex._annotationSetItems]) |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1713 print |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1714 print 'AnnotationSetItems size is %d/%d bytes' % (bytes, rbytes) |
3
a78db169b0c8
parse AnnotationSetItems
Thinker K.F. Li <thinker@codemud.net>
parents:
2
diff
changeset
|
1715 |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1716 bytes = sum([annodir.data_size |
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1717 for annodir in dex._annotationsDirectoryItems]) |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1718 rbytes = sum([_compute_sz(annodir) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1719 for annodir in dex._annotationsDirectoryItems]) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1720 print |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1721 print 'AnnotationsDirtoryItems size is %d/%d bytes' % (bytes, rbytes) |
4
b0766f1984bb
parse annotationsDirectoryItem
Thinker K.F. Li <thinker@codemud.net>
parents:
3
diff
changeset
|
1722 |
8 | 1723 bytes = sum([annoitem.data_size |
1724 for annoitem in dex._annotationItems]) | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1725 rbytes = sum([_compute_sz(annoitem) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1726 for annoitem in dex._annotationItems]) |
8 | 1727 print |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1728 print 'AnnotationItems size is %d/%d bytes' % (bytes, rbytes) |
8 | 1729 |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1730 bytes = sum([encodeditem.data_size |
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1731 for encodeditem in dex._encodedArrayItems]) |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1732 rbytes = sum([_compute_sz(encodeditem) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1733 for encodeditem in dex._encodedArrayItems]) |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1734 print |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1735 print 'EncodedArrayItems size is %d/%d bytes' % (bytes, rbytes) |
10
123c7a8bbf4c
Parse EncodedArrayItems
Thinker K.F. Li <thinker@codemud.net>
parents:
9
diff
changeset
|
1736 |
11 | 1737 bytes = sum([debuginfoitem.data_size |
1738 for debuginfoitem in dex._debugInfoItems]) | |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1739 rbytes = sum([_compute_sz(debuginfoitem) |
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1740 for debuginfoitem in dex._debugInfoItems]) |
11 | 1741 print |
13
c05fac334ab1
compute size for objects
Thinker K.F. Li <thinker@codemud.net>
parents:
12
diff
changeset
|
1742 print 'DebugInfoItems size is %d/%d bytes' % (bytes, rbytes) |
11 | 1743 |
2 | 1744 print |
1745 print 'Data maps' | |
1746 maps = dex._maps | |
1747 for map in maps: | |
1748 print '\t0x%04x(%s) size=%d offset=0x%08x' % (map.type, | |
1749 map.types[map.type], | |
1750 map.size, | |
1751 map.offset) | |
1
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1752 pass |
05346b632adb
Parse records mentioned in file header
Thinker K.F. Li <thinker@codemud.net>
parents:
0
diff
changeset
|
1753 pass |