Пример #1
0
        public CoffOptionalHeader32Plus(PE32Magic magic, BinaryReader rdr)
        {
            Magic = magic;

            StandardFields = new CoffStandardFields32Plus(rdr);
            WindowsFields  = new CoffWindowsFields32Plus(rdr);

            DataDirectories = new CoffImageDataDirectory[WindowsFields.NumberOfRvaAndSizes];

            for (var i = 0; i < WindowsFields.NumberOfRvaAndSizes; i++)
            {
                DataDirectories[i].VirtualAddress = rdr.ReadUInt32();
                DataDirectories[i].Size           = rdr.ReadUInt32();
            }
        }
Пример #2
0
        private void Load(Stream stream)
        {
            BinaryReader rdr = new BinaryReader(stream);

            ////////////////////////////////////
            // The DOS Stub and PE Offset marker

            DosHeader = new DosHeader(rdr);

            PEOffset = DosHeader.NewExeHeaderAddress;             // this is at 0x3C

            rdr.BaseStream.Seek(PEOffset, SeekOrigin.Begin);

            ////////////////////////////////////
            // The COFF File Header

            PESignature = rdr.ReadBytes(4);

            if (!IsPESignature(PESignature))
            {
                throw new FormatException("The specified file does not contain a PE signature.");
            }

            CoffFileHeader = new CoffFileHeader(rdr);

            long offsetEndOfCoffFileHeader = rdr.BaseStream.Position;

            ////////////////////////////////////
            // The Optional Header

            PE32Magic magic = (PE32Magic)rdr.ReadUInt16();

            switch (magic)
            {
            case PE32Magic.PE32:

                // Ensure the Optional Header is big enough for the minimum amount of data
                // Standard fields: 28 bytes
                // Windows fields: 68 bytes
                // Total: 92 bytes
                if (CoffFileHeader.SizeOfOptionalHeader < 96)
                {
                    String msg = String.Format("The specified file's declared Optional Header size of {0} bytes is smaller than the minimum of 96 required bytes.", CoffFileHeader.SizeOfOptionalHeader);
                    throw new FormatException(msg);
                }

                OptionalHeader32 = new CoffOptionalHeader32(magic, rdr);

                break;

            case PE32Magic.PE32Plus:

                // Standard fields: 24 bytes
                // Windows fields: 88 bytes
                // Total: 112 bytes
                if (CoffFileHeader.SizeOfOptionalHeader < 112)
                {
                    String msg = String.Format("The specified file's declared Optional Header size of {0} bytes is smaller than the minimum of 112 required bytes.", CoffFileHeader.SizeOfOptionalHeader);
                    throw new FormatException(msg);
                }

                OptionalHeader32Plus = new CoffOptionalHeader32Plus(magic, rdr);

                break;

            case PE32Magic.RomImage:
            default:
                OptionalHeader = rdr.ReadBytes(CoffFileHeader.SizeOfOptionalHeader);
                break;
            }

            long offsetEndOfOptionalHeader = rdr.BaseStream.Position;

            // by now we're at the end of the Optional Header, but let's make sure

            if (offsetEndOfOptionalHeader != offsetEndOfCoffFileHeader + CoffFileHeader.SizeOfOptionalHeader)
            {
                // error condition
            }

            ///////////////////////////////
            // The Section Table

            SectionTable = new SectionTableEntry[CoffFileHeader.NofSections];
            for (int i = 0; i < SectionTable.Length; i++)
            {
                SectionTable[i] = new SectionTableEntry(rdr);
            }
        }