/// <summary> /// Constructor /// </summary> /// <param name="reader">PE file reader pointing to the start of this section</param> /// <param name="verify">Verify section</param> /// <exception cref="BadImageFormatException">Thrown if verification fails</exception> public ImageNTHeaders(IImageStream reader, bool verify) { SetStartOffset(reader); this.signature = reader.ReadUInt32(); if (verify && this.signature != 0x4550) throw new BadImageFormatException("Invalid NT headers signature"); this.imageFileHeader = new ImageFileHeader(reader, verify); this.imageOptionalHeader = CreateImageOptionalHeader(reader, verify); SetEndoffset(reader); }
/// <summary> /// Constructor /// </summary> /// <param name="reader">PE file reader pointing to the start of this section</param> /// <param name="verify">Verify section</param> /// <exception cref="BadImageFormatException">Thrown if verification fails</exception> public ImageNTHeaders(IImageStream reader, bool verify) { SetStartOffset(reader); this.signature = reader.ReadUInt32(); if (verify && this.signature != 0x4550) { throw new BadImageFormatException("Invalid NT headers signature"); } this.imageFileHeader = new ImageFileHeader(reader, verify); this.imageOptionalHeader = CreateImageOptionalHeader(reader, verify); SetEndoffset(reader); }
/// <summary> /// Constructor /// </summary> /// <param name="reader">PE file reader pointing to the start of this section</param> /// <param name="verify">Verify section</param> /// <exception cref="BadImageFormatException">Thrown if verification fails</exception> public ImageNTHeaders(ref DataReader reader, bool verify) { SetStartOffset(ref reader); signature = reader.ReadUInt32(); // Mono only checks the low 2 bytes if (verify && (ushort)signature != 0x4550) { throw new BadImageFormatException("Invalid NT headers signature"); } imageFileHeader = new ImageFileHeader(ref reader, verify); imageOptionalHeader = CreateImageOptionalHeader(ref reader, verify); SetEndoffset(ref reader); }
private void SetupValues() { if (_loaded_values) { return; } _loaded_values = true; _image_sections = new List <ImageSection>(); IntPtr base_ptr = GetBasePointer(); if (base_ptr == IntPtr.Zero) { return; } IntPtr header_ptr = GetHeaderPointer(base_ptr); if (header_ptr == IntPtr.Zero) { return; } ImageNtHeaders header = (ImageNtHeaders)Marshal.PtrToStructure(header_ptr, typeof(ImageNtHeaders)); var buffer = header_ptr + Marshal.SizeOf(header) + header.FileHeader.SizeOfOptionalHeader; ImageSectionHeader[] section_headers = new ImageSectionHeader[header.FileHeader.NumberOfSections]; int header_size = Marshal.SizeOf(typeof(ImageSectionHeader)); for (int i = 0; i < header.FileHeader.NumberOfSections; ++i) { ImageSectionHeader section = (ImageSectionHeader)Marshal.PtrToStructure(buffer + i * header_size, typeof(ImageSectionHeader)); _image_sections.Add(new ImageSection(section, MappedAsImage, base_ptr)); } IImageOptionalHeader optional_header = GetOptionalHeader(header_ptr); if (optional_header == null) { return; } _image_base_address = optional_header.GetImageBase(); _image_entry_point = optional_header.GetAddressOfEntryPoint(); _is_64bit = optional_header.GetMagic() == IMAGE_NT_OPTIONAL_HDR_MAGIC.HDR64; _dll_characteristics = optional_header.GetDllCharacteristics(); }