private void BuildTextMap() { TextMap textMap = text_map; textMap.AddMap(TextSegment.Code, metadata.code.length, (!pe64) ? 4 : 16); textMap.AddMap(TextSegment.Resources, metadata.resources.length, 8); textMap.AddMap(TextSegment.Data, metadata.data.length, 4); if (metadata.data.length > 0) { metadata.table_heap.FixupData(textMap.GetRVA(TextSegment.Data)); } textMap.AddMap(TextSegment.StrongNameSignature, GetStrongNameLength(), 4); BuildMetadataTextMap(); int length = 0; if (debug_header != null && debug_header.HasEntries) { int num = debug_header.Entries.Length * 28; int num2 = (int)textMap.GetNextRVA(TextSegment.BlobHeap) + num; int num3 = 0; for (int i = 0; i < debug_header.Entries.Length; i++) { ImageDebugHeaderEntry imageDebugHeaderEntry = debug_header.Entries[i]; ImageDebugDirectory directory = imageDebugHeaderEntry.Directory; directory.AddressOfRawData = ((imageDebugHeaderEntry.Data.Length != 0) ? num2 : 0); imageDebugHeaderEntry.Directory = directory; num3 += imageDebugHeaderEntry.Data.Length; num2 += num3; } length = num + num3; } textMap.AddMap(TextSegment.DebugDirectory, length, 4); if (!has_reloc) { uint nextRVA = textMap.GetNextRVA(TextSegment.DebugDirectory); textMap.AddMap(TextSegment.ImportDirectory, new Range(nextRVA, 0u)); textMap.AddMap(TextSegment.ImportHintNameTable, new Range(nextRVA, 0u)); textMap.AddMap(TextSegment.StartupStub, new Range(nextRVA, 0u)); } else { uint nextRVA2 = textMap.GetNextRVA(TextSegment.DebugDirectory); uint num4 = nextRVA2 + 48; num4 = (uint)((int)(num4 + 15) & -16); uint num5 = num4 - nextRVA2 + 27; uint num6 = nextRVA2 + num5; num6 = (uint)((module.Architecture == TargetArchitecture.IA64) ? ((int)(num6 + 15) & -16) : (2 + ((int)(num6 + 3) & -4))); textMap.AddMap(TextSegment.ImportDirectory, new Range(nextRVA2, num5)); textMap.AddMap(TextSegment.ImportHintNameTable, new Range(num4, 0u)); textMap.AddMap(TextSegment.StartupStub, new Range(num6, GetStartupStubLength())); } }
private TextMap BuildTextMap() { TextMap textMap = this.metadata.text_map; textMap.AddMap(TextSegment.Code, this.metadata.code.length, (!this.pe64 ? 4 : 16)); textMap.AddMap(TextSegment.Resources, this.metadata.resources.length, 8); textMap.AddMap(TextSegment.Data, this.metadata.data.length, 4); if (this.metadata.data.length > 0) { this.metadata.table_heap.FixupData(textMap.GetRVA(TextSegment.Data)); } textMap.AddMap(TextSegment.StrongNameSignature, this.GetStrongNameLength(), 4); textMap.AddMap(TextSegment.MetadataHeader, this.GetMetadataHeaderLength()); textMap.AddMap(TextSegment.TableHeap, this.metadata.table_heap.length, 4); textMap.AddMap(TextSegment.StringHeap, this.metadata.string_heap.length, 4); textMap.AddMap(TextSegment.UserStringHeap, (this.metadata.user_string_heap.IsEmpty ? 0 : this.metadata.user_string_heap.length), 4); textMap.AddMap(TextSegment.GuidHeap, 16); textMap.AddMap(TextSegment.BlobHeap, (this.metadata.blob_heap.IsEmpty ? 0 : this.metadata.blob_heap.length), 4); int length = 0; if (!this.debug_data.IsNullOrEmpty <byte>()) { this.debug_directory.AddressOfRawData = (int)(textMap.GetNextRVA(TextSegment.BlobHeap) + 28); length = (int)this.debug_data.Length + 28; } textMap.AddMap(TextSegment.DebugDirectory, length, 4); if (!this.has_reloc) { uint nextRVA = textMap.GetNextRVA(TextSegment.DebugDirectory); textMap.AddMap(TextSegment.ImportDirectory, new Range(nextRVA, 0)); textMap.AddMap(TextSegment.ImportHintNameTable, new Range(nextRVA, 0)); textMap.AddMap(TextSegment.StartupStub, new Range(nextRVA, 0)); return(textMap); } uint num = textMap.GetNextRVA(TextSegment.DebugDirectory); uint num1 = num + 48; num1 = num1 + 15 & -16; uint num2 = num1 - num + 27; uint num3 = num + num2; num3 = (this.module.Architecture == TargetArchitecture.IA64 ? num3 + 15 & -16 : 2 + (num3 + 3 & -4)); textMap.AddMap(TextSegment.ImportDirectory, new Range(num, num2)); textMap.AddMap(TextSegment.ImportHintNameTable, new Range(num1, 0)); textMap.AddMap(TextSegment.StartupStub, new Range(num3, this.GetStartupStubLength())); return(textMap); }
private TextMap BuildTextMap() { TextMap map = this.metadata.text_map; map.AddMap(TextSegment.Code, this.metadata.code.length, !this.pe64 ? 4 : 0x10); map.AddMap(TextSegment.Resources, this.metadata.resources.length, 8); map.AddMap(TextSegment.Data, this.metadata.data.length, 4); if (this.metadata.data.length > 0) { this.metadata.table_heap.FixupData(map.GetRVA(TextSegment.Data)); } map.AddMap(TextSegment.StrongNameSignature, this.GetStrongNameLength(), 4); map.AddMap(TextSegment.MetadataHeader, this.GetMetadataHeaderLength()); map.AddMap(TextSegment.TableHeap, this.metadata.table_heap.length, 4); map.AddMap(TextSegment.StringHeap, this.metadata.string_heap.length, 4); map.AddMap(TextSegment.UserStringHeap, this.metadata.user_string_heap.IsEmpty ? 0 : this.metadata.user_string_heap.length, 4); map.AddMap(TextSegment.GuidHeap, 0x10); map.AddMap(TextSegment.BlobHeap, this.metadata.blob_heap.IsEmpty ? 0 : this.metadata.blob_heap.length, 4); int length = 0; if (!this.debug_data.IsNullOrEmpty <byte>()) { this.debug_directory.AddressOfRawData = (int)(map.GetNextRVA(TextSegment.BlobHeap) + 0x1c); length = this.debug_data.Length + 0x1c; } map.AddMap(TextSegment.DebugDirectory, length, 4); if (!this.has_reloc) { uint num2 = map.GetNextRVA(TextSegment.DebugDirectory); map.AddMap(TextSegment.ImportDirectory, new Range(num2, 0)); map.AddMap(TextSegment.ImportHintNameTable, new Range(num2, 0)); map.AddMap(TextSegment.StartupStub, new Range(num2, 0)); return(map); } uint nextRVA = map.GetNextRVA(TextSegment.DebugDirectory); uint index = (uint)(((nextRVA + 0x30) + 15) & -16); uint num5 = (index - nextRVA) + ((uint)0x1b); uint num6 = nextRVA + num5; map.AddMap(TextSegment.ImportDirectory, new Range(nextRVA, num5)); map.AddMap(TextSegment.ImportHintNameTable, new Range(index, 0)); map.AddMap(TextSegment.StartupStub, new Range((this.module.Architecture == TargetArchitecture.IA64) ? ((uint)((num6 + 15) & -16)) : ((uint)(2 + ((num6 + 3) & -4))), this.GetStartupStubLength())); return(map); }
void WriteOptionalHeaders() { WriteUInt16((ushort)(!pe64 ? 0x10b : 0x20b)); // Magic WriteUInt16(module.linker_version); WriteUInt32(text.SizeOfRawData); // CodeSize WriteUInt32((reloc != null ? reloc.SizeOfRawData : 0) + (rsrc != null ? rsrc.SizeOfRawData : 0)); // InitializedDataSize WriteUInt32(0); // UninitializedDataSize var startub_stub = text_map.GetRange(TextSegment.StartupStub); WriteUInt32(startub_stub.Length > 0 ? startub_stub.Start : 0); // EntryPointRVA WriteUInt32(text_rva); // BaseOfCode if (!pe64) { WriteUInt32(0); // BaseOfData WriteUInt32((uint)image_base); // ImageBase } else { WriteUInt64(image_base); // ImageBase } WriteUInt32(section_alignment); // SectionAlignment WriteUInt32(file_alignment); // FileAlignment WriteUInt16(4); // OSMajor WriteUInt16(0); // OSMinor WriteUInt16(0); // UserMajor WriteUInt16(0); // UserMinor WriteUInt16(4); // SubSysMajor WriteUInt16(0); // SubSysMinor WriteUInt32(0); // Reserved var last_section = LastSection(); WriteUInt32(last_section.VirtualAddress + Align(last_section.VirtualSize, section_alignment)); // ImageSize WriteUInt32(text.PointerToRawData); // HeaderSize WriteUInt32(0); // Checksum WriteUInt16(GetSubSystem()); // SubSystem WriteUInt16((ushort)module.Characteristics); // DLLFlags const ulong stack_reserve = 0x100000; const ulong stack_commit = 0x1000; const ulong heap_reserve = 0x100000; const ulong heap_commit = 0x1000; if (!pe64) { WriteUInt32((uint)stack_reserve); WriteUInt32((uint)stack_commit); WriteUInt32((uint)heap_reserve); WriteUInt32((uint)heap_commit); } else { WriteUInt64(stack_reserve); WriteUInt64(stack_commit); WriteUInt64(heap_reserve); WriteUInt64(heap_commit); } WriteUInt32(0); // LoaderFlags WriteUInt32(16); // NumberOfDataDir WriteZeroDataDirectory(); // ExportTable WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportDirectory)); // ImportTable if (rsrc != null) // ResourceTable { WriteUInt32(rsrc.VirtualAddress); WriteUInt32(rsrc.VirtualSize); } else { WriteZeroDataDirectory(); } WriteZeroDataDirectory(); // ExceptionTable WriteZeroDataDirectory(); // CertificateTable WriteUInt32(reloc != null ? reloc.VirtualAddress : 0); // BaseRelocationTable WriteUInt32(reloc != null ? reloc.VirtualSize : 0); if (text_map.GetLength(TextSegment.DebugDirectory) > 0) { WriteUInt32(text_map.GetRVA(TextSegment.DebugDirectory)); WriteUInt32((uint)(debug_header.Entries.Length * ImageDebugDirectory.Size)); } else { WriteZeroDataDirectory(); } WriteZeroDataDirectory(); // Copyright WriteZeroDataDirectory(); // GlobalPtr WriteZeroDataDirectory(); // TLSTable WriteZeroDataDirectory(); // LoadConfigTable WriteZeroDataDirectory(); // BoundImport WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportAddressTable)); // IAT WriteZeroDataDirectory(); // DelayImportDesc WriteDataDirectory(text_map.GetDataDirectory(TextSegment.CLIHeader)); // CLIHeader WriteZeroDataDirectory(); // Reserved }
void WriteOptionalHeaders() { Section text = GetSection(".text"); WriteUInt16((ushort)(!pe64 ? 0x10b : 0x20b)); // Magic WriteByte(8); // LMajor WriteByte(0); // LMinor WriteUInt32(text.SizeOfRawData); // CodeSize uint dataSize = 0; foreach (Section sect in sections) { sect.PointerToRawData += Align(GetHeaderSize(), file_alignment); if (sect.Name != ".text") { dataSize += sect.SizeOfRawData; } } WriteUInt32(dataSize); // InitializedDataSize WriteUInt32(0); // UninitializedDataSize var entry_point_rva = text_map.GetRVA(TextSegment.StartupStub); if (module.Architecture == TargetArchitecture.IA64) { entry_point_rva += 0x20; } WriteUInt32(entry_point_rva); // EntryPointRVA WriteUInt32(text_rva); // BaseOfCode if (!pe64) { WriteUInt32(0); // BaseOfData WriteUInt32((uint)image_base); // ImageBase } else { WriteUInt64(image_base); // ImageBase } WriteUInt32(section_alignment); // SectionAlignment WriteUInt32(file_alignment); // FileAlignment WriteUInt16(4); // OSMajor WriteUInt16(0); // OSMinor WriteUInt16(0); // UserMajor WriteUInt16(0); // UserMinor WriteUInt16(4); // SubSysMajor WriteUInt16(0); // SubSysMinor WriteUInt32(0); // Reserved Section reloc = GetSection(".reloc"); Section last = sections[sections.Count - 1]; foreach (Section sect in sections) { if (sect.VirtualAddress > last.VirtualAddress) { last = sect; } } WriteUInt32(last.VirtualAddress + Align(last.VirtualSize, section_alignment)); // ImageSize WriteUInt32(text.PointerToRawData); // HeaderSize WriteUInt32(0); // Checksum WriteUInt16(GetSubSystem()); // SubSystem WriteUInt16(0x8540); // DLLFlags const ulong stack_reserve = 0x100000; const ulong stack_commit = 0x1000; const ulong heap_reserve = 0x100000; const ulong heap_commit = 0x1000; if (!pe64) { WriteUInt32((uint)stack_reserve); WriteUInt32((uint)stack_commit); WriteUInt32((uint)heap_reserve); WriteUInt32((uint)heap_commit); } else { WriteUInt64(stack_reserve); WriteUInt64(stack_commit); WriteUInt64(heap_reserve); WriteUInt64(heap_commit); } WriteUInt32(0); // LoaderFlags WriteUInt32(16); // NumberOfDataDir WriteZeroDataDirectory(); // ExportTable WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportDirectory)); // ImportTable Section rsrc = GetSection(".rsrc"); if (rsrc != null) // ResourceTable { WriteUInt32(rsrc.VirtualAddress); WriteUInt32(rsrc.VirtualSize); } else { WriteZeroDataDirectory(); } WriteZeroDataDirectory(); // ExceptionTable WriteZeroDataDirectory(); // CertificateTable WriteUInt32(reloc.VirtualAddress); // BaseRelocationTable WriteUInt32(reloc.VirtualSize); if (text_map.GetLength(TextSegment.DebugDirectory) > 0) { WriteUInt32(text_map.GetRVA(TextSegment.DebugDirectory)); WriteUInt32(28u); } else { WriteZeroDataDirectory(); } WriteZeroDataDirectory(); // Copyright WriteZeroDataDirectory(); // GlobalPtr WriteZeroDataDirectory(); // TLSTable WriteZeroDataDirectory(); // LoadConfigTable WriteZeroDataDirectory(); // BoundImport WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportAddressTable)); // IAT WriteZeroDataDirectory(); // DelayImportDesc WriteDataDirectory(text_map.GetDataDirectory(TextSegment.CLIHeader)); // CLIHeader WriteZeroDataDirectory(); // Reserved }
private void WriteOptionalHeaders() { base.WriteUInt16((ushort)((!pe64) ? 267 : 523)); base.WriteUInt16(module.linker_version); base.WriteUInt32(text.SizeOfRawData); base.WriteUInt32(((reloc != null) ? reloc.SizeOfRawData : 0) + ((rsrc != null) ? rsrc.SizeOfRawData : 0)); base.WriteUInt32(0u); Range range = text_map.GetRange(TextSegment.StartupStub); base.WriteUInt32((range.Length != 0) ? range.Start : 0); base.WriteUInt32(8192u); if (!pe64) { base.WriteUInt32(0u); base.WriteUInt32(4194304u); } else { base.WriteUInt64(4194304uL); } base.WriteUInt32(8192u); base.WriteUInt32(512u); base.WriteUInt16(4); base.WriteUInt16(0); base.WriteUInt16(0); base.WriteUInt16(0); base.WriteUInt16(4); base.WriteUInt16(0); base.WriteUInt32(0u); Section section = LastSection(); base.WriteUInt32(section.VirtualAddress + Align(section.VirtualSize, 8192u)); base.WriteUInt32(text.PointerToRawData); base.WriteUInt32(0u); base.WriteUInt16(GetSubSystem()); base.WriteUInt16((ushort)module.Characteristics); if (!pe64) { base.WriteUInt32(1048576u); base.WriteUInt32(4096u); base.WriteUInt32(1048576u); base.WriteUInt32(4096u); } else { base.WriteUInt64(1048576uL); base.WriteUInt64(4096uL); base.WriteUInt64(1048576uL); base.WriteUInt64(4096uL); } base.WriteUInt32(0u); base.WriteUInt32(16u); WriteZeroDataDirectory(); base.WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportDirectory)); if (rsrc != null) { base.WriteUInt32(rsrc.VirtualAddress); base.WriteUInt32(rsrc.VirtualSize); } else { WriteZeroDataDirectory(); } WriteZeroDataDirectory(); WriteZeroDataDirectory(); base.WriteUInt32((reloc != null) ? reloc.VirtualAddress : 0); base.WriteUInt32((reloc != null) ? reloc.VirtualSize : 0); if (text_map.GetLength(TextSegment.DebugDirectory) > 0) { base.WriteUInt32(text_map.GetRVA(TextSegment.DebugDirectory)); base.WriteUInt32((uint)(debug_header.Entries.Length * 28)); } else { WriteZeroDataDirectory(); } WriteZeroDataDirectory(); WriteZeroDataDirectory(); WriteZeroDataDirectory(); WriteZeroDataDirectory(); WriteZeroDataDirectory(); base.WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportAddressTable)); WriteZeroDataDirectory(); base.WriteDataDirectory(text_map.GetDataDirectory(TextSegment.CLIHeader)); WriteZeroDataDirectory(); }