/// <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); } }
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); }
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; }