@@ -81,11 +81,115 @@ def __init__(self, data):
81
81
self .NumberOfSymbols = struct .unpack ("I" , data [self .e_lfanew + 16 :self .e_lfanew + 20 ])[0 ]
82
82
self .SizeOfOptionalHeader = struct .unpack ("H" , data [self .e_lfanew + 20 :self .e_lfanew + 22 ])[0 ]
83
83
self .Characteristics = struct .unpack ("H" , data [self .e_lfanew + 22 :self .e_lfanew + 24 ])[0 ]
84
-
84
+
85
+ #COFF Fields
86
+ self .Magic = struct .unpack ("H" , data [self .e_lfanew + 24 :self .e_lfanew + 26 ])[0 ]
87
+ self .MajorLinkerVersion = struct .unpack ("B" , data [self .e_lfanew + 26 :self .e_lfanew + 27 ])[0 ]
88
+ self .MinorLinkerVersion = struct .unpack ("B" , data [self .e_lfanew + 27 :self .e_lfanew + 28 ])[0 ]
89
+ self .SizeOfCode = struct .unpack ("I" , data [self .e_lfanew + 28 :self .e_lfanew + 32 ])[0 ]
90
+ self .SizeOfInitializedData = struct .unpack ("I" , data [self .e_lfanew + 32 :self .e_lfanew + 36 ])[0 ]
91
+ self .SizeOfUninitializedData = struct .unpack ("I" , data [self .e_lfanew + 36 :self .e_lfanew + 40 ])[0 ]
92
+ self .AddressOfEntryPoint = struct .unpack ("I" , data [self .e_lfanew + 40 :self .e_lfanew + 44 ])[0 ]
93
+ self .BaseOfCode = struct .unpack ("I" , data [self .e_lfanew + 44 :self .e_lfanew + 48 ])[0 ]
94
+ self .BaseOfData = struct .unpack ("I" , data [self .e_lfanew + 48 :self .e_lfanew + 52 ])[0 ]
95
+
96
+ #Windows Specific Fields
97
+ self .ImageBase = struct .unpack ("I" , data [self .e_lfanew + 52 :self .e_lfanew + 56 ])[0 ]
98
+ self .SectionAlignment = struct .unpack ("I" , data [self .e_lfanew + 56 :self .e_lfanew + 60 ])[0 ]
99
+ self .FileAlignment = struct .unpack ("I" , data [self .e_lfanew + 60 :self .e_lfanew + 64 ])[0 ]
100
+ self .MajorOperatingSystemVersion = struct .unpack ("H" , data [self .e_lfanew + 64 :self .e_lfanew + 66 ])[0 ]
101
+ self .MinorOperatingSystemVersion = struct .unpack ("H" , data [self .e_lfanew + 66 :self .e_lfanew + 68 ])[0 ]
102
+ self .MajorImageVersion = struct .unpack ("H" , data [self .e_lfanew + 68 :self .e_lfanew + 70 ])[0 ]
103
+ self .MinorImageVersion = struct .unpack ("H" , data [self .e_lfanew + 70 :self .e_lfanew + 72 ])[0 ]
104
+ self .MajorSubsystemVersion = struct .unpack ("H" , data [self .e_lfanew + 72 :self .e_lfanew + 74 ])[0 ]
105
+ self .MinorSubsystemVersion = struct .unpack ("H" , data [self .e_lfanew + 74 :self .e_lfanew + 76 ])[0 ]
106
+ self .Win32VersionValue = struct .unpack ("I" , data [self .e_lfanew + 76 :self .e_lfanew + 80 ])[0 ]
107
+ self .SizeOfImage = struct .unpack ("I" , data [self .e_lfanew + 80 :self .e_lfanew + 84 ])[0 ]
108
+ self .SizeOfHeaders = struct .unpack ("I" , data [self .e_lfanew + 84 :self .e_lfanew + 88 ])[0 ]
109
+ self .CheckSum = struct .unpack ("I" , data [self .e_lfanew + 88 :self .e_lfanew + 92 ])[0 ]
110
+ self .Subsystem = struct .unpack ("H" , data [self .e_lfanew + 92 :self .e_lfanew + 94 ])[0 ]
111
+ self .DllCharacteristics = struct .unpack ("H" , data [self .e_lfanew + 94 :self .e_lfanew + 96 ])[0 ]
112
+ self .SizeOfStackReserve = struct .unpack ("I" , data [self .e_lfanew + 96 :self .e_lfanew + 100 ])[0 ]
113
+ self .SizeOfStackCommit = struct .unpack ("I" , data [self .e_lfanew + 100 :self .e_lfanew + 104 ])[0 ]
114
+ self .SizeOfHeapReserve = struct .unpack ("I" , data [self .e_lfanew + 104 :self .e_lfanew + 108 ])[0 ]
115
+ self .SizeOfHeapCommit = struct .unpack ("I" , data [self .e_lfanew + 108 :self .e_lfanew + 112 ])[0 ]
116
+ self .LoaderFlags = struct .unpack ("I" , data [self .e_lfanew + 112 :self .e_lfanew + 116 ])[0 ]
117
+ self .NumberOfRvaAndSizes = struct .unpack ("I" , data [self .e_lfanew + 116 :self .e_lfanew + 120 ])[0 ]
118
+
119
+ #Data Directory
120
+ self .ExportTable = struct .unpack ("I" , data [self .e_lfanew + 120 :self .e_lfanew + 124 ])[0 ]
121
+ self .SizeOfExportTable = struct .unpack ("I" , data [self .e_lfanew + 124 :self .e_lfanew + 128 ])[0 ]
122
+
123
+ self .ImportTable = struct .unpack ("I" , data [self .e_lfanew + 128 :self .e_lfanew + 132 ])[0 ]
124
+ self .SizeOfImportTable = struct .unpack ("I" , data [self .e_lfanew + 132 :self .e_lfanew + 136 ])[0 ]
125
+
126
+ self .ResourceTable = struct .unpack ("I" , data [self .e_lfanew + 136 :self .e_lfanew + 140 ])[0 ]
127
+ self .SizeOfResourceTable = struct .unpack ("I" , data [self .e_lfanew + 140 :self .e_lfanew + 144 ])[0 ]
128
+
129
+ self .ExceptionTable = struct .unpack ("I" , data [self .e_lfanew + 144 :self .e_lfanew + 148 ])[0 ]
130
+ self .SizeOfExceptionTable = struct .unpack ("I" , data [self .e_lfanew + 148 :self .e_lfanew + 152 ])[0 ]
131
+
132
+ self .CertificateTable = struct .unpack ("I" , data [self .e_lfanew + 152 :self .e_lfanew + 156 ])[0 ]
133
+ self .SizeOfCertificateTable = struct .unpack ("I" , data [self .e_lfanew + 156 :self .e_lfanew + 160 ])[0 ]
134
+
135
+ self .BaseRelocationTable = struct .unpack ("I" , data [self .e_lfanew + 160 :self .e_lfanew + 164 ])[0 ]
136
+ self .SizeOfBaseRelocationTable = struct .unpack ("I" , data [self .e_lfanew + 164 :self .e_lfanew + 168 ])[0 ]
137
+
138
+ self .Debug = struct .unpack ("I" , data [self .e_lfanew + 168 :self .e_lfanew + 172 ])[0 ]
139
+ self .SizeOfDebug = struct .unpack ("I" , data [self .e_lfanew + 172 :self .e_lfanew + 176 ])[0 ]
140
+
141
+ self .ArchitectureData = struct .unpack ("I" , data [self .e_lfanew + 176 :self .e_lfanew + 180 ])[0 ]
142
+ self .SizeOfArchitectureData = struct .unpack ("I" , data [self .e_lfanew + 180 :self .e_lfanew + 184 ])[0 ]
143
+
144
+ self .GlobalPtr = struct .unpack ("I" , data [self .e_lfanew + 184 :self .e_lfanew + 188 ])[0 ]
145
+ self .SizeOfGlobalPtr = struct .unpack ("I" , data [self .e_lfanew + 188 :self .e_lfanew + 192 ])[0 ]
146
+
147
+ self .TLSTable = struct .unpack ("I" , data [self .e_lfanew + 192 :self .e_lfanew + 196 ])[0 ]
148
+ self .SizeOfTLSTable = struct .unpack ("I" , data [self .e_lfanew + 196 :self .e_lfanew + 200 ])[0 ]
149
+
150
+ self .LoadConfigTable = struct .unpack ("I" , data [self .e_lfanew + 200 :self .e_lfanew + 204 ])[0 ]
151
+ self .SizeOfLoadConfigTable = struct .unpack ("I" , data [self .e_lfanew + 204 :self .e_lfanew + 208 ])[0 ]
152
+
153
+ self .BoundImport = struct .unpack ("I" , data [self .e_lfanew + 208 :self .e_lfanew + 212 ])[0 ]
154
+ self .SizeOfBoundImoprt = struct .unpack ("I" , data [self .e_lfanew + 212 :self .e_lfanew + 216 ])[0 ]
155
+
156
+ self .ImportAddressTable = struct .unpack ("I" , data [self .e_lfanew + 216 :self .e_lfanew + 220 ])[0 ]
157
+ self .SizeOfImportAddressTable = struct .unpack ("I" , data [self .e_lfanew + 220 :self .e_lfanew + 224 ])[0 ]
158
+
159
+ self .DelayImportDescriptor = struct .unpack ("I" , data [self .e_lfanew + 224 :self .e_lfanew + 228 ])[0 ]
160
+ self .SizeOfDelayImportDescriptor = struct .unpack ("I" , data [self .e_lfanew + 228 :self .e_lfanew + 232 ])[0 ]
161
+
162
+ self .CLRRuntimeHeader = struct .unpack ("I" , data [self .e_lfanew + 232 :self .e_lfanew + 236 ])[0 ]
163
+ self .SizeOfCLRRuntimeHeader = struct .unpack ("I" , data [self .e_lfanew + 236 :self .e_lfanew + 240 ])[0 ]
164
+
165
+ self .Reserved = struct .unpack ("I" , data [self .e_lfanew + 240 :self .e_lfanew + 244 ])[0 ]
166
+ self .SizeOfReserved = struct .unpack ("I" , data [self .e_lfanew + 244 :self .e_lfanew + 248 ])[0 ]
167
+
168
+ self .sections = {}
169
+ pos = self .e_lfanew + 248
170
+ for _ in xrange (self .NumberOfSections ):
171
+ name = struct .unpack ("8s" , data [pos :pos + 8 ])[0 ]
172
+ VirtualSize = struct .unpack ("I" , data [pos + 8 :pos + 12 ])[0 ]
173
+ VirtualAddress = struct .unpack ("I" , data [pos + 12 :pos + 16 ])[0 ]
174
+ SizeOfRawData = struct .unpack ("I" , data [pos + 16 :pos + 20 ])[0 ]
175
+ PointerToRawData = struct .unpack ("I" , data [pos + 20 :pos + 24 ])[0 ]
176
+ PointerToRelocations = struct .unpack ("I" , data [pos + 24 :pos + 28 ])[0 ]
177
+ PointerToLineNumbers = struct .unpack ("I" , data [pos + 28 :pos + 32 ])[0 ]
178
+ NumberOfRelocations = struct .unpack ("H" , data [pos + 32 :pos + 34 ])[0 ]
179
+ NumberOfLineNumbers = struct .unpack ("H" , data [pos + 34 :pos + 36 ])[0 ]
180
+ Characteristics = struct .unpack ("I" , data [pos + 36 :pos + 40 ])[0 ]
181
+
182
+ self .sections [name ] = (name , VirtualSize , VirtualAddress , SizeOfRawData ,
183
+ PointerToRawData , PointerToRelocations , PointerToLineNumbers ,
184
+ NumberOfRelocations , NumberOfLineNumbers , Characteristics )
185
+ pos = pos + 8 + 4 + 4 + 4 + 4 + 4 + 4 + 2 + 2 + 4
186
+
187
+
188
+
85
189
86
190
def __repr__ (self , * args , ** kwargs ):
87
191
dos_header = DosHeader .__repr__ (self , * args , ** kwargs )
88
- return dos_header + '''
192
+ pe_header = '''
89
193
**** Pe Header ****
90
194
Signature: 0x%08X
91
195
Machine: 0x%04X
@@ -95,10 +199,109 @@ def __repr__(self, *args, **kwargs):
95
199
NumberOfSymbols: 0x%08X
96
200
SizeOfOptionalHeader: 0x%04X
97
201
Characteristics: 0x%04X
202
+
203
+ Magic: 0x%04X
204
+ MajorLinkerVersion: 0x%02X
205
+ MinorLinkerVersion: 0x%02X
206
+ SizeOfCode: 0x%08X
207
+ SizeOfInitializedData: 0x%08X
208
+ SizeOfUninitializedData: 0x%08X
209
+ AddressOfEntryPoint: 0x%08X
210
+ BaseOfCode: 0x%08X
211
+ BaseOfData: 0x%08X
212
+ ImageBase: 0x%08X
213
+ SectionAlignment: 0x%08X
214
+ FileAlignment: 0x%08X
215
+ MajorOperatingSystemVersion: 0x%04X
216
+ MinorOperatingSystemVersion: 0x%04X
217
+ MajorImageVersion: 0x%04X
218
+ MinorImageVersion: 0x%04X
219
+ MajorSubsystemVersion: 0x%04X
220
+ MinorSubsystemVersion: 0x%04X
221
+ Win32VersionValue 0x%08X
222
+ SizeOfImage: 0x%08X
223
+ SizeOfHeaders: 0x%08X
224
+ CheckSum: 0x%08X
225
+ Subsystem: 0x%04X
226
+ DllCharacteristics: 0x%04X
227
+ SizeOfStackReserve: 0x%08X
228
+ SizeOfStackCommit: 0x%08X
229
+ SizeOfHeapReserve: 0x%08X
230
+ SizeOfHeapCommit: 0x%08X
231
+ LoaderFlags: 0x%08X
232
+ NumberOfRvaAndSizes: 0x%08X
233
+
234
+ #Data Directory
235
+ ExportTable: 0x%08X, SizeOfExportTable: 0x%08X
236
+ ImportTable: 0x%08X, SizeOfImportTable: 0x%08X
237
+ ResourceTable: 0x%08X, SizeOfResourceTable: 0x%08X
238
+ ExceptionTable: 0x%08X, SizeOfExceptionTable: 0x%08X
239
+ CertificateTable: 0x%08X, SizeOfCertificateTable: 0x%08X
240
+ BaseRelocationTable: 0x%08X, SizeOfBaseRelocationTable: 0x%08X
241
+ Debug: 0x%08X, SizeOfDebug: 0x%08X
242
+ ArchitectureData: 0x%08X, SizeOfArchitectureData: 0x%08X
243
+ GlobalPtr: 0x%08X, SizeOfGlobalPtr: 0x%08X
244
+ TLSTable: 0x%08X, SizeOfTLSTable: 0x%08X
245
+ LoadConfigTable: 0x%08X, SizeOfLoadConfigTable: 0x%08X
246
+ BoundImport: 0x%08X, SizeOfBoundImoprt: 0x%08X
247
+ ImportAddressTable: 0x%08X, SizeOfImportAddressTable: 0x%08X
248
+ DelayImportDescriptor: 0x%08X, SizeOfDelayImportDescriptor: 0x%08X
249
+ CLRRuntimeHeader: 0x%08X, SizeOfCLRRuntimeHeader: 0x%08X
250
+ Reserved: 0x%08X, SizeOfReserved: 0x%08X
98
251
''' % (
99
252
self .Signature , self .Machine , self .NumberOfSections , self .TimeDateStamp , time .ctime (self .TimeDateStamp ),
100
- self .PointerToSymbolTable , self .NumberOfSymbols , self .SizeOfOptionalHeader , self .Characteristics
253
+ self .PointerToSymbolTable , self .NumberOfSymbols , self .SizeOfOptionalHeader , self .Characteristics ,
254
+
255
+ #COFF Fields
256
+ self .Magic , self .MajorLinkerVersion , self .MinorLinkerVersion , self .SizeOfCode ,
257
+ self .SizeOfInitializedData , self .SizeOfUninitializedData , self .AddressOfEntryPoint ,
258
+ self .BaseOfCode , self .BaseOfData ,
259
+
260
+ #Windows Specific Fields
261
+ self .ImageBase , self .SectionAlignment , self .FileAlignment , self .MajorOperatingSystemVersion ,
262
+ self .MinorOperatingSystemVersion , self .MajorImageVersion , self .MinorImageVersion ,
263
+ self .MajorSubsystemVersion , self .MinorSubsystemVersion , self .Win32VersionValue ,
264
+ self .SizeOfImage , self .SizeOfHeaders , self .CheckSum , self .Subsystem , self .DllCharacteristics ,
265
+ self .SizeOfStackReserve , self .SizeOfStackCommit , self .SizeOfHeapReserve ,
266
+ self .SizeOfHeapCommit , self .LoaderFlags , self .NumberOfRvaAndSizes ,
267
+
268
+ #Data Directory
269
+ self .ExportTable , self .SizeOfExportTable ,
270
+ self .ImportTable , self .SizeOfImportTable ,
271
+ self .ResourceTable , self .SizeOfResourceTable ,
272
+ self .ExceptionTable , self .SizeOfExceptionTable ,
273
+ self .CertificateTable , self .SizeOfCertificateTable ,
274
+ self .BaseRelocationTable , self .SizeOfBaseRelocationTable ,
275
+ self .Debug , self .SizeOfDebug ,
276
+ self .ArchitectureData , self .SizeOfArchitectureData ,
277
+ self .GlobalPtr , self .SizeOfGlobalPtr ,
278
+ self .TLSTable , self .SizeOfTLSTable ,
279
+ self .LoadConfigTable , self .SizeOfLoadConfigTable ,
280
+ self .BoundImport , self .SizeOfBoundImoprt ,
281
+ self .ImportAddressTable , self .SizeOfImportAddressTable ,
282
+ self .DelayImportDescriptor , self .SizeOfDelayImportDescriptor ,
283
+ self .CLRRuntimeHeader , self .SizeOfCLRRuntimeHeader ,
284
+ self .Reserved , self .SizeOfReserved
101
285
)
286
+
287
+ sections = "#sections blow, total: %d\n " % (self .NumberOfSections )
288
+ for val in self .sections .values ():
289
+ sections += '''
290
+ name: %s
291
+ VirtualSize: 0x%08X
292
+ VirtualAddress: 0x%08X
293
+ SizeOfRawData 0x%08X
294
+ PointerToRawData: 0x%08X
295
+ PointerToRelocations: 0x%08X
296
+ PointerToLineNumbers: 0x%08X
297
+ NumberOfRelocations: 0x%04X
298
+ NumberOfLineNumbers: 0x%04X
299
+ Characteristics: 0x%08X
300
+ ''' % (val [0 ], val [1 ], val [2 ], val [3 ], val [4 ], val [5 ],
301
+ val [6 ], val [7 ], val [8 ], val [9 ]
302
+ )
303
+
304
+ return dos_header + pe_header + sections
102
305
103
306
104
307
0 commit comments