1 |
using System; |
#define ENABLE_LOGGING |
2 |
|
using System; |
3 |
using System.Collections.Generic; |
using System.Collections.Generic; |
4 |
using System.Linq; |
using System.Linq; |
5 |
using System.Text; |
using System.Text; |
176 |
|
|
177 |
#endregion |
#endregion |
178 |
|
|
179 |
|
#region logging implementation |
180 |
|
private static class log |
181 |
|
{ |
182 |
|
public static class verbose |
183 |
|
{ |
184 |
|
public static class debug |
185 |
|
{ |
186 |
|
public static void writeline(string format, params object[] args) |
187 |
|
{ |
188 |
|
#if ENABLE_LOGGING |
189 |
|
logger.VerboseDebug.WriteLine(format, args); |
190 |
|
#endif |
191 |
|
} |
192 |
|
public static void write(string format, params object[] args) |
193 |
|
{ |
194 |
|
#if ENABLE_LOGGING |
195 |
|
logger.VerboseDebug.Write(format, args); |
196 |
|
#endif |
197 |
|
} |
198 |
|
} |
199 |
|
public static class error |
200 |
|
{ |
201 |
|
public static void writeline(string format, params object[] args) |
202 |
|
{ |
203 |
|
#if ENABLE_LOGGING |
204 |
|
logger.VerboseError.WriteLine(format, args); |
205 |
|
#endif |
206 |
|
} |
207 |
|
public static void write(string format, params object[] args) |
208 |
|
{ |
209 |
|
#if ENABLE_LOGGING |
210 |
|
logger.VerboseError.Write(format, args); |
211 |
|
#endif |
212 |
|
} |
213 |
|
} |
214 |
|
} |
215 |
|
} |
216 |
|
#endregion |
217 |
|
|
218 |
|
|
219 |
public PEReader(FileInfo fi) : this(fi.FullName) { } |
public PEReader(FileInfo fi) : this(fi.FullName) { } |
220 |
public PEReader(string filename) |
public PEReader(string filename) |
221 |
{ |
{ |
222 |
Exception ErrorInfo = null; |
Exception ErrorInfo = null; |
223 |
using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read)) |
using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read)) |
224 |
{ |
{ |
225 |
try |
try |
226 |
{ |
{ |
227 |
logger.VerboseDebug.WriteLine("Reading PE Format from: {0}", filename); |
log.verbose.debug.writeline("Reading PE Format from: {0}", filename); |
228 |
BinaryReader reader = new BinaryReader(fs); |
BinaryReader reader = new BinaryReader(fs); |
229 |
// Reset reader position, just in case |
// Reset reader position, just in case |
230 |
reader.BaseStream.Seek(0, SeekOrigin.Begin); |
reader.BaseStream.Seek(0, SeekOrigin.Begin); |
253 |
// Read optional headers |
// Read optional headers |
254 |
if (Is32bitAssembly()) |
if (Is32bitAssembly()) |
255 |
{ |
{ |
256 |
logger.VerboseDebug.WriteLine("Detected a 32Bit PE Executable"); |
log.verbose.debug.writeline("\tDetected a 32Bit PE Executable"); |
257 |
Load32bitOptionalHeaders(reader); |
Load32bitOptionalHeaders(reader); |
258 |
} |
} |
259 |
else |
else |
260 |
{ |
{ |
261 |
logger.VerboseDebug.WriteLine("Detected a 64Bit PE Executable"); |
log.verbose.debug.writeline("\tDetected a 64Bit PE Executable"); |
262 |
Load64bitOptionalHeaders(reader); |
Load64bitOptionalHeaders(reader); |
263 |
} |
} |
264 |
|
|
265 |
// Read section data |
// Read section data |
266 |
logger.VerboseDebug.WriteLine("Total Section Headers: {0}", _sectionHeaders.Count); |
log.verbose.debug.writeline("\tTotal Section Headers: {0}", _sectionHeaders.Count); |
267 |
foreach (IMAGE_SECTION_HEADER header in _sectionHeaders) |
foreach (IMAGE_SECTION_HEADER header in _sectionHeaders) |
268 |
{ |
{ |
269 |
int section_index = _sectionHeaders.IndexOf(header) + 1; |
int section_index = _sectionHeaders.IndexOf(header) + 1; |
270 |
logger.VerboseDebug.WriteLine("Section Header: {0} of {1}", section_index, _sectionHeaders.Count); |
log.verbose.debug.writeline("\tSection Header: {0} of {1}", section_index, _sectionHeaders.Count); |
271 |
logger.VerboseDebug.WriteLine("\tName: {0}", header.Name); |
log.verbose.debug.writeline("\t\tName: {0}", header.Name); |
272 |
logger.VerboseDebug.WriteLine("\tVirtual Address: 0x{0:x8}", header.VirtualAddress); |
log.verbose.debug.writeline("\t\tVirtual Address: 0x{0:x8}", header.VirtualAddress); |
273 |
logger.VerboseDebug.WriteLine("\tPhysical Address: 0x{0:x8}", header.Misc.PhysicalAddress); |
log.verbose.debug.writeline("\t\tPhysical Address: 0x{0:x8}", header.Misc.PhysicalAddress); |
274 |
logger.VerboseDebug.WriteLine("\tVirtual Size: 0x{0:x8}", header.Misc.VirtualSize); |
log.verbose.debug.writeline("\t\tVirtual Size: 0x{0:x8}", header.Misc.VirtualSize); |
275 |
logger.VerboseDebug.WriteLine("\tRaw Data Size: 0x{0:x8}", header.SizeOfRawData); |
log.verbose.debug.writeline("\t\tRaw Data Size: 0x{0:x8}", header.SizeOfRawData); |
276 |
logger.VerboseDebug.WriteLine("\tPointer To Raw Data: 0x{0:x8}", header.PointerToRawData); |
log.verbose.debug.writeline("\t\tPointer To Raw Data: 0x{0:x8}", header.PointerToRawData); |
277 |
|
|
278 |
// Skip to beginning of a section |
// Skip to beginning of a section |
279 |
reader.BaseStream.Seek(header.PointerToRawData, SeekOrigin.Begin); |
reader.BaseStream.Seek(header.PointerToRawData, SeekOrigin.Begin); |
291 |
} |
} |
292 |
if (ErrorInfo != null) |
if (ErrorInfo != null) |
293 |
{ |
{ |
294 |
logger.VerboseError.WriteLine("Error Reading PE Format from: {0}",filename); |
log.verbose.error.writeline("Error Reading PE Format from: {0}", filename); |
295 |
logger.VerboseError.WriteLine(ErrorInfo.ToString()); |
log.verbose.error.writeline(ErrorInfo.ToString()); |
296 |
} |
} |
297 |
} |
} |
298 |
|
|