示例#1
0
        /// <summary>
        /// </summary>
        public void ReadHeaders()
        {
            if (!open)
            {
                throw new Exception("You must open image before trying to read it.");
            }

            dosHdr.Read(reader);
            reader.BaseStream.Position = dosHdr.Lfanew;
            ExeSignature peSig = (ExeSignature)reader.ReadUInt16();

            if (peSig != ExeSignature.NT)
            {
                throw new Exception("Invalid image format: cannot find PE signature.");
            }
            peSig = (ExeSignature)reader.ReadUInt16();
            if (peSig != ExeSignature.NT2)
            {
                throw new Exception("Invalid image format: cannot find PE signature.");
            }

            coffHdr.Read(reader);
            peHdr.Read(reader);

            sectionsPos = reader.BaseStream.Position;
            ReadSections();

            if (this.IsCLI)
            {
                reader.BaseStream.Position = RVAToVA(peHdr.CLIHdrDir.virtAddr);
                corHdr.Read(reader);

                mdRoot = new MetaDataRoot(this);
                reader.BaseStream.Position = RVAToVA(corHdr.MetaData.virtAddr);
                mdRoot.Read(reader);
            }
        }
示例#2
0
        public static uint Calc(string peFile)
        {
            uint res = 0;

            FileInfo pe = new FileInfo(peFile);

            if (!pe.Exists)
            {
                throw new Exception("CheckSum : Invalid file path.");
            }

            using (BinaryReader reader = new BinaryReader(pe.OpenRead())) {
                if (!reader.BaseStream.CanSeek)
                {
                    throw new Exception("Can't seek.");
                }

                DOSHeader  dosHdr  = new DOSHeader();
                COFFHeader coffHdr = new COFFHeader();
                PEHeader   peHdr   = new PEHeader();

                dosHdr.Read(reader);
                reader.BaseStream.Position = dosHdr.Lfanew;
                ExeSignature peSig = (ExeSignature)reader.ReadUInt16();
                if (peSig != ExeSignature.NT)
                {
                    throw new BadImageException("Checksum : Invalid image format, cannot find PE signature.");
                }

                peSig = (ExeSignature)reader.ReadUInt16();
                if (peSig != ExeSignature.NT2)
                {
                    throw new BadImageException("Checksum : Invalid image format, cannot find PE signature.");
                }

                coffHdr.Read(reader);
                peHdr.Read(reader);

                uint oldSum = peHdr.CheckSum;
                reader.BaseStream.Position = 0;
                long len = pe.Length;
                long whole = len >> 1;
                uint sum = 0;
                uint hi, lo;
                for (long i = whole; --i >= 0;)
                {
                    sum += reader.ReadUInt16();
                    hi   = sum >> 16;
                    if (hi != 0)
                    {
                        sum = hi + (sum & 0xFFFF);
                    }
                }
                if ((len & 1L) != 0)
                {
                    sum += (uint)reader.ReadByte();
                    hi   = sum >> 16;
                    if (hi != 0)
                    {
                        sum = hi + (sum & 0xFFFF);
                    }
                }

                // fix low word of checksum
                lo = oldSum & 0xFFFF;
                if ((sum & 0xFFFF) >= lo)
                {
                    sum -= lo;
                }
                else
                {
                    sum = (((sum & 0xFFFF) - lo) & 0xFFFF) - 1;
                }

                // fix high word of checksum
                hi = oldSum >> 16;
                if ((sum & 0xFFFF) >= hi)
                {
                    sum -= hi;
                }
                else
                {
                    sum = (((sum & 0xFFFF) - hi) & 0xFFFF) - 1;
                }
            }

            return(res);
        }