internal DWORD e_lfanew; // File address of new exe header internal static IMAGE_DOS_HEADER FromBinaryReader(BinaryReader reader) { IMAGE_DOS_HEADER ret = new IMAGE_DOS_HEADER(); try { ret.e_magic = reader.ReadUInt16(); // Magic number if (ret.e_magic != IMAGE_DOS_SIGNATURE) { return(null); } ret.e_cblp = reader.ReadUInt16(); // Bytes on last page of file ret.e_cp = reader.ReadUInt16(); // Pages in file ret.e_crlc = reader.ReadUInt16(); // Relocations ret.e_cparhdr = reader.ReadUInt16(); // Size of header in paragraphs ret.e_minalloc = reader.ReadUInt16(); // Minimum extra paragraphs needed ret.e_maxalloc = reader.ReadUInt16(); // Maximum extra paragraphs needed ret.e_ss = reader.ReadUInt16(); // Initial (relative) SS value ret.e_sp = reader.ReadUInt16(); // Initial SP value ret.e_csum = reader.ReadUInt16(); // Checksum ret.e_ip = reader.ReadUInt16(); // Initial IP value ret.e_cs = reader.ReadUInt16(); // Initial (relative) CS value ret.e_lfarlc = reader.ReadUInt16(); // File address of relocation table ret.e_ovno = reader.ReadUInt16(); // Overlay number for (int i = 0; i < 4; i++) { ret.e_res[i] = reader.ReadUInt16(); } ret.e_oemid = reader.ReadUInt16(); ret.e_oeminfo = reader.ReadUInt16(); for (int i = 0; i < 10; i++) { ret.e_res2[i] = reader.ReadUInt16(); } ret.e_lfanew = reader.ReadUInt32(); } catch { return(null); } return(ret); }
internal static Win32ExeHeader FromBinaryReader(BinaryReader reader) { try { long startPosition = reader.BaseStream.Position; long length = reader.BaseStream.Length - startPosition; if (length < 0x1000) { return(null); } Win32ExeHeader ret = new Win32ExeHeader(); ret.DosHeader = IMAGE_DOS_HEADER.FromBinaryReader(reader); if (ret.DosHeader == null) { return(null); } if (ret.DosHeader.e_lfanew <= 0) { return(ret); } reader.BaseStream.Seek(startPosition + ret.DosHeader.e_lfanew, SeekOrigin.Begin); ret.NtHeader = IMAGE_NT_HEADERS.FromBinaryReader(reader); if (ret.NtHeader == null) { return(null); } IMAGE_SECTION_HEADER section = IMAGE_SECTION_HEADER.FromBinaryReader(reader); while (section != null) { ret.SectionHeaders.Add(section); section = IMAGE_SECTION_HEADER.FromBinaryReader(reader); } return(ret); } catch { return(null); } }