e_lfanew是相对实际PE头标的相对偏移量或RVA。要得到内存中一个指向PE头标的指针只需将该域的值与映像的基相加//Ignoring typecasts and pointer conversion issues for clarity…pNTHeader dosHeader dosHeader-e_lfanew;其他字段的意义是和DOS头有关的字节这里没有什么大的作用就不做介绍了。2. IMAGE_NT_HEADERS主PE头标是一个IMAGE_NT_HEADERS类型的结构该类型在WINNT.H中定义。在内存中Windows中把IMAGE_NT_HEADERS结构作为它内存中的模块数据库。在Windows中每个被装入的EXE或DLL都用一个IMAGE_NT_HEADERS结构来说明。其结构如下typedef struct _IMAGE_NT_HEADERS {DWORD Signature;IMAGE_FILE_HEADER FileHeader;IMAGE_OPTIONAL_HEADER32 OptionalHeader;} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;Signature表示此文件所表示的类型其意义定义如下#define IMAGE_DOS_SIGNATURE 0x4D5A // MZ#define IMAGE_OS2_SIGNATURE 0x4E45 // NE#define IMAGE_OS2_SIGNATURE_LE 0x4C45 // LE#define IMAGE_NT_SIGNATURE 0x50450000 // PE00如果是PE格式则Signature为PE\0\0PE后跟两个0。3. IMAGE_FILE_HEADERPE头标中紧随PE的WORD记号的是一个IMAGE_FILE_HEADER类型的结构如下所示typedef struct _IMAGE_FILE_HEADER {WORD Machine;WORD NumberOfSections;DWORD TimeDateStamp;DWORD PointerToSymbolTable;DWORD NumberOfSymbols;WORD SizeOfOptionalHeader;WORD Characteristics;} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;这个结构的域只包含了关于文件的最基本的信息。Machine表示该文件运行所要求的CPU有如下的CPU ID定义#define IMAGE_FILE_MACHINE_UNKNOWN 0#define IMAGE_FILE_MACHINE_I386 0x014c// Intel 386.#define IMAGE_FILE_MACHINE_R3000 0x0162// MIPS little-endian, 0x160 big-endian#define IMAGE_FILE_MACHINE_R4000 0x0166// MIPS little-endian#define IMAGE_FILE_MACHINE_R10000 0x0168// MIPS little-endian#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169// MIPS little-endian WCE v2#define IMAGE_FILE_MACHINE_ALPHA 0x0184// Alpha_AXP#define IMAGE_FILE_MACHINE_POWERPC 0x01F0// IBM PowerPC Little-Endian#define IMAGE_FILE_MACHINE_SH3 0x01a2// SH3 little-endian#define IMAGE_FILE_MACHINE_SH3E 0x01a4// SH3E little-endian#define IMAGE_FILE_MACHINE_SH4 0x01a6// SH4 little-endian#define IMAGE_FILE_MACHINE_ARM 0x01c0// ARM Little-Endian#define IMAGE_FILE_MACHINE_THUMB 0x01c2#define IMAGE_FILE_MACHINE_IA64 0x0200// Intel 64#define IMAGE_FILE_MACHINE_MIPS16 0x0266// MIPS#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366// MIPS#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466// MIPS#define IMAGE_FILE_MACHINE_ALPHA64 0x0284// ALPHA64#define IMAGE_FILE_MACHINE_AXP64//IMAGE_FILE_MACHINE_ALPHA64NumberOfSection表示在EXE或OBJ中的节数。这个很重要因为它直接表示节表数组的大小。TimeDateStamp表示连接器生成该文件的时间。该值是指从1969年12月31日下午4点整开始至文件生成时之间的秒数。PointerToSymbolTable表示文件的COFF符号表的偏移量。该域只用在OBJ文件和带有COFF调试信息的PE文件中此信息只在调试文件中有用。NumberOfSymbols表示在COFF符号表中的符号数目参见前一个域此信息只在调试文件中有用。SizeOfOptionalHeader表示紧跟该结构之后的一个可选头标的大小。在可执行文件中它是紧随该结构的image_file_header结构的大小。这个值必须有效。Characteristics表示文件的信息化标记。一些重要的域描述如下// Relocation info stripped from file.#define IMAGE_FILE_RELOCS_STRIPPED 0x0001// File is executable (i.e. no unresolved external references).#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002// Line nunbers stripped from file.#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004// Local symbols stripped from file.#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008// Agressively trim working set#define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010// App can handle 2gb addresses#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020// Bytes of machine word are reversed.#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080// 32 bit word machine.#define IMAGE_FILE_32BIT_MACHINE 0x0100// Debugging info stripped from file in .DBG file#define IMAGE_FILE_DEBUG_STRIPPED 0x0200// If Image is on removable media, copy and run from the swap file.#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400// If Image is on Net, copy and run from the swap file.#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800// System File.#define IMAGE_FILE_SYSTEM 0x1000// File is a DLL.#define IMAGE_FILE_DLL 0x2000// File should only be run on a UP machine#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000// Bytes of machine word are reversed.#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000我们常见的意义如下。 0x0001该文件中没有重定位。 0x0002文件是一个可执行的映像即不是一个OBJ或LIB。 0x2000文件是一个动态连接库不是一个程序。