internal static Win32ExeHeader FromBinaryReader(BinaryReader reader) { try { long startPosition = reader.BaseStream.Position; long length = reader.BaseStream.Length - startPosition; if (length < 0x1000) { return(null); } Win32ExeHeader ret = new Win32ExeHeader(); ret.DosHeader = IMAGE_DOS_HEADER.FromBinaryReader(reader); if (ret.DosHeader == null) { return(null); } if (ret.DosHeader.e_lfanew <= 0) { return(ret); } reader.BaseStream.Seek(startPosition + ret.DosHeader.e_lfanew, SeekOrigin.Begin); ret.NtHeader = IMAGE_NT_HEADERS.FromBinaryReader(reader); if (ret.NtHeader == null) { return(null); } IMAGE_SECTION_HEADER section = IMAGE_SECTION_HEADER.FromBinaryReader(reader); while (section != null) { ret.SectionHeaders.Add(section); section = IMAGE_SECTION_HEADER.FromBinaryReader(reader); } return(ret); } catch { return(null); } }
private bool readHeader() { startPosition = reader.BaseStream.Position; streamLength = reader.BaseStream.Length - startPosition; char[] identifier = reader.ReadChars(4); if (identifier.Length < 4) { return(false); } reader.BaseStream.Seek(startPosition, SeekOrigin.Begin); if ((identifier[0] == 'M') && (identifier[1] == 'Z')) { Win32ExeHeader winHeader = Win32ExeHeader.FromBinaryReader(reader); if (winHeader == null) { return(false); } startPosition += winHeader.EndOfExecutableRegion; streamLength = reader.BaseStream.Length - startPosition; reader.BaseStream.Seek(startPosition, SeekOrigin.Begin); identifier = reader.ReadChars(4); if (identifier.Length < 4) { return(false); } } if (!((identifier[0] == 'D') && (identifier[1] == 'P') && (identifier[2] == 'M') && (identifier[3] == 'X'))) { return(false); } reader.BaseStream.Seek(startPosition, SeekOrigin.Begin); reader.ReadInt32(); reader.ReadInt32(); int fileCount = reader.ReadInt32(); reader.ReadInt32(); files.Capacity = fileCount; fileOffsetStart = startPosition + 0x10 + fileCount * 0x20; for (int i = 0; i < fileCount; i++) { DpmFileState file = new DpmFileState(); Char[] chars = reader.ReadChars(16); int stringLength = 16; for (int j = 0; j < 16; j++) { if (chars[j] == '\0') { stringLength = j; break; } } file.FileName = new string(chars, 0, stringLength); file.unknown = reader.ReadInt32(); file.Encryptionkey = reader.ReadInt32(); file.FileOffset = reader.ReadInt32(); file.FileSize = reader.ReadInt32(); file.Parent = this; if ((file.FileOffset + file.FileSize) > (streamLength)) { return(false); } files.Add(file); } return(true); }