Example #1
0
 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);
     }
 }
Example #2
0
        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);
        }