comparison paraspace/dexfile.py @ 0:31050a971b52

Project ParaSpace
author Thinker K.F. Li <thinker@codemud.net>
date Sun, 22 May 2011 00:11:57 +0800
parents
children 05346b632adb
comparison
equal deleted inserted replaced
-1:000000000000 0:31050a971b52
1 class _DEX_header(object):
2 magic = None # 0x00, 8 bytes
3 checksum = None # 0x08, 4 bytes
4 signature = None # 0x0c, 20 bytes
5 fileSize = None # 0x20, 4 bytes
6 headerSize = None # 0x24
7 endianTag = None # 0x28
8 linkSize = None # 0x2c
9 linkOff = None # 0x30
10 mapOff = None # 0x34
11 stringIdsSize = None # 0x38
12 stringIdsOff = None # 0x3c
13 typeIdsSize = None # 0x40
14 typeIdsOff = None # 0x44
15 protoIdsSize = None # 0x48
16 protoIdsOff = None # 0x4c
17 fieldIdsSize = None # 0x50
18 fieldIdsOff = None # 0x54
19 methodIdsSize = None # 0x58
20 methodIdsOff = None # 0x5c
21 classDefsSize = None # 0x60
22 classDefsOff = None # 0x64
23 dataSize = None # 0x68
24 dataOff = None # 0x6c
25
26 def parse(self, data):
27 self.magic = data[:8]
28 self.checksum = data[8: 0x0c]
29 self.signature = data[0x0c: 0x20]
30
31 idx = 0x20
32 fields = 'fileSize headerSize endianTag linkSize linkOff mapOff ' \
33 'stringIdsSize stringIdsOff typeIdsSize typeIdsOff ' \
34 'protoIdsSize protoIdsOff fieldIdsSize fieldIdsOff ' \
35 'methodIdsSize methodIdsOff classDefsSize classDefsOff ' \
36 'dataSize dataOff'.split()
37 for field in fields:
38 d = data[idx: idx + 4]
39 value = _to_uint(d)
40 setattr(self, field, value)
41 idx = idx + 4
42 pass
43 pass
44 pass
45
46
47 def _to_uint(data):
48 v = 0
49 for c in data:
50 v = (v << 8) + ord(c)
51 pass
52 return v
53
54
55 class _DEX_MapItem(object):
56 type = None # 2 bytes
57 unused = None # 2 bytes
58 size = None # 4 bytes
59 offset = None # 4 bytes
60
61 data_size = 12
62
63 def parse(self, data):
64 self.type = _to_uint(data[:2])
65 self.size = _to_uint(data[4:8])
66 self.offset = _to_uint(data[8:12])
67 pass
68 pass
69
70 class _DEX_TypeId(object):
71 descriptorIdx = None # 4 bytes
72
73 data_size = 4
74
75 def parse(self, data):
76 self.descriptorIdx = _to_uint(data[:4])
77 pass
78 pass
79
80
81 class _DEX_ProtoId(object):
82 shortyIdx = None # 4 bytes
83 returnTypeIdx = None # 4 bytes
84 parametersOff = None # 4 bytes
85
86 data_size = 12
87
88 def parse(self, data):
89 self.shortyIdx = _to_uint(data[:4])
90 self.returnTypeIdx = _to_uint(data[4:8])
91 self.parametersOff = _to_uint(data[8:12])
92 pass
93 pass
94
95
96 class _DEX_FieldId(object):
97 classIdx # 2 bytes
98 typeIdx # 2 bytes
99 nameIdx # 4 bytes
100
101 data_size = 8
102
103 def parse(self, data):
104 self.classIdx = _to_uint(data[:2])
105 self.typeIdx = _to_uint(data[2:4])
106 self.nameIdx = _to_uint(data[4:8])
107 pass
108 pass
109
110
111 class _DEX_MethodId(object):
112 classIdx # 2 bytes
113 protoIdx # 2 bytes
114 nameIdx # 4 bytes
115
116 data_size = 8
117
118 def parse(self, data):
119 self.classIdx = _to_uint(data[:2])
120 self.protoIdx = _to_uint(data[2:4])
121 self.nameIdx = _to_uint(data[4:8])
122 pass
123 pass
124
125 class _DEX_ClassDef(object):
126 classIdx = None # 0x00
127 accessFlags = None # 0x04
128 superclassIdx = None # 0x08
129 interfacesOff = None # 0x0c
130 sourceFileIdx = None # 0x10
131 annotationsOff = None # 0x14
132 classDataOff = None # 0x18
133 staticValuesOff = None # 0x1c
134
135 data_size = 0x20
136
137 def parse(self, data):
138 self.classIdx = _to_uint(data[:4])
139 self.accessFlags = _to_uint(data[4:8])
140 self.superclassIdx = _to_uint(data[8:0xc])
141 self.interfacesOff = _to_uint(data[0xc:0x10])
142 self.sourceFileIdx = _to_uint(data[0x10:0x14])
143 self.annotationsOff = _to_uint(data[0x14:0x18])
144 self.classDataOff = _to_uint(data[0x18:0x1c])
145 self.staticValuesOff = _to_uint(data[0x1c:0x20])
146 pass
147 pass
148
149
150 class DEXFile(object):
151 _data = None
152 _header = None
153 _strings = None
154
155 def __init__(self):
156 pass
157
158 def open(self, filename):
159 fo = file(filename)
160 data = fo.read()
161
162 self.parse(data)
163 pass
164
165 def parse(self, data):
166 self._data = data
167 header = _DEX_header()
168 header.parse(data)
169 self._header = header
170 pass
171 pass