uint GetTimeDateStamp() { var td = TheOptions.PEHeadersOptions.TimeDateStamp; if (td.HasValue) { return((uint)td); } TheOptions.PEHeadersOptions.TimeDateStamp = PEHeadersOptions.CreateNewTimeDateStamp(); return((uint)TheOptions.PEHeadersOptions.TimeDateStamp); }
/// <inheritdoc/> public void WriteTo(BinaryWriter writer) { startOffset = writer.BaseStream.Position; // DOS header writer.Write(dosHeader); // PE magic writer.Write(0x00004550); // Image file header writer.Write((ushort)GetMachine()); writer.Write((ushort)sections.Count); writer.Write(options.TimeDateStamp ?? PEHeadersOptions.CreateNewTimeDateStamp()); writer.Write(0); writer.Write(0); writer.Write((ushort)(Use32BitOptionalHeader() ? 0xE0U : 0xF0)); writer.Write((ushort)GetCharacteristics()); var sectionSizes = new SectionSizes(fileAlignment, sectionAlignment, length, () => GetSectionSizeInfos()); // Image optional header uint ep = StartupStub == null ? 0 : (uint)StartupStub.EntryPointRVA; if (Use32BitOptionalHeader()) { writer.Write((ushort)0x010B); writer.Write(options.MajorLinkerVersion ?? PEHeadersOptions.DEFAULT_MAJOR_LINKER_VERSION); writer.Write(options.MinorLinkerVersion ?? PEHeadersOptions.DEFAULT_MINOR_LINKER_VERSION); writer.Write(sectionSizes.SizeOfCode); writer.Write(sectionSizes.SizeOfInitdData); writer.Write(sectionSizes.SizeOfUninitdData); writer.Write(ep); writer.Write(sectionSizes.BaseOfCode); writer.Write(sectionSizes.BaseOfData); writer.Write((uint)imageBase); writer.Write(sectionAlignment); writer.Write(fileAlignment); writer.Write(options.MajorOperatingSystemVersion ?? 4); writer.Write(options.MinorOperatingSystemVersion ?? 0); writer.Write(options.MajorImageVersion ?? 0); writer.Write(options.MinorImageVersion ?? 0); writer.Write(options.MajorSubsystemVersion ?? 4); writer.Write(options.MinorSubsystemVersion ?? 0); writer.Write(options.Win32VersionValue ?? 0); writer.Write(sectionSizes.SizeOfImage); writer.Write(sectionSizes.SizeOfHeaders); checkSumOffset = writer.BaseStream.Position; writer.Write(0); // CheckSum writer.Write((ushort)(options.Subsystem ?? PEHeadersOptions.DEFAULT_SUBSYSTEM)); writer.Write((ushort)(options.DllCharacteristics ?? PEHeadersOptions.DefaultDllCharacteristics)); writer.Write((uint)(options.SizeOfStackReserve ?? 0x00100000)); writer.Write((uint)(options.SizeOfStackCommit ?? 0x00001000)); writer.Write((uint)(options.SizeOfHeapReserve ?? 0x00100000)); writer.Write((uint)(options.SizeOfHeapCommit ?? 0x00001000)); writer.Write(options.LoaderFlags ?? 0x00000000); writer.Write(options.NumberOfRvaAndSizes ?? 0x00000010); } else { writer.Write((ushort)0x020B); writer.Write(options.MajorLinkerVersion ?? PEHeadersOptions.DEFAULT_MAJOR_LINKER_VERSION); writer.Write(options.MinorLinkerVersion ?? PEHeadersOptions.DEFAULT_MINOR_LINKER_VERSION); writer.Write(sectionSizes.SizeOfCode); writer.Write(sectionSizes.SizeOfInitdData); writer.Write(sectionSizes.SizeOfUninitdData); writer.Write(ep); writer.Write(sectionSizes.BaseOfCode); writer.Write(imageBase); writer.Write(sectionAlignment); writer.Write(fileAlignment); writer.Write(options.MajorOperatingSystemVersion ?? 4); writer.Write(options.MinorOperatingSystemVersion ?? 0); writer.Write(options.MajorImageVersion ?? 0); writer.Write(options.MinorImageVersion ?? 0); writer.Write(options.MajorSubsystemVersion ?? 4); writer.Write(options.MinorSubsystemVersion ?? 0); writer.Write(options.Win32VersionValue ?? 0); writer.Write(sectionSizes.SizeOfImage); writer.Write(sectionSizes.SizeOfHeaders); checkSumOffset = writer.BaseStream.Position; writer.Write(0); // CheckSum writer.Write((ushort)(options.Subsystem ?? PEHeadersOptions.DEFAULT_SUBSYSTEM)); writer.Write((ushort)(options.DllCharacteristics ?? PEHeadersOptions.DefaultDllCharacteristics)); writer.Write(options.SizeOfStackReserve ?? 0x0000000000400000); writer.Write(options.SizeOfStackCommit ?? 0x0000000000004000); writer.Write(options.SizeOfHeapReserve ?? 0x0000000000100000); writer.Write(options.SizeOfHeapCommit ?? 0x0000000000002000); writer.Write(options.LoaderFlags ?? 0x00000000); writer.Write(options.NumberOfRvaAndSizes ?? 0x00000010); } writer.WriteDataDirectory(null); // Export table writer.WriteDataDirectory(ImportDirectory); writer.WriteDataDirectory(Win32Resources); writer.WriteDataDirectory(null); // Exception table writer.WriteDataDirectory(null); // Certificate table writer.WriteDataDirectory(RelocDirectory); writer.WriteDataDirectory(DebugDirectory, DebugDirectory.HEADER_SIZE); writer.WriteDataDirectory(null); // Architecture-specific data writer.WriteDataDirectory(null); // Global pointer register RVA writer.WriteDataDirectory(null); // Thread local storage writer.WriteDataDirectory(null); // Load configuration table writer.WriteDataDirectory(null); // Bound import table writer.WriteDataDirectory(ImportAddressTable); writer.WriteDataDirectory(null); // Delay import descriptor writer.WriteDataDirectory(ImageCor20Header); writer.WriteDataDirectory(null); // Reserved // Sections uint rva = Utils.AlignUp(sectionSizes.SizeOfHeaders, sectionAlignment); foreach (var section in sections) { rva += section.WriteHeaderTo(writer, fileAlignment, sectionAlignment, rva); } }