小甲鱼PE详解之IMAGE_NT_HEADERS结构定义即各个属性的作用(PE详解02)

IMAGE_NT_HEADERSSTRUCT 
+0h DWORDSignature    //
+4h  IMAGE_FILE_HEADER  FileHeader  //
+18h IMAGE_OPTIONAL_HEADER32 OptionalHeader  //
} IMAGE_NT_HEADERS ENDS

Signature 字段:
在一个有效的 PE 文件里,Signature 字段被设置为00004550h, ASCII码字符是“PE00”。标志这PE 文件头的开始。
“PE00” 字符串是 PE 文件头的开始,DOS 头部的 e_lfanew字段正是指向这里。
如下图所示:



IMAGE_FILE_HEADER 结构

typedef      struct _IMAGE_FILE_HEADER 
{
+04h    WORD        Machine;                               // 运行平台
+06h     WORD         NumberOfSections;                    // 文件的区块数目 
+08h    DWORD       TimeDateStamp;                       // 文件创建日期和时间 
+0Ch       DWORD        PointerToSymbolTable;   // 指向符号表(主要用于调试) 
+10h     DWORD        NumberOfSymbols;      // 符号表中符号个数(同上)
 +14h      WORD         SizeOfOptionalHeader;   // IMAGE_OPTIONAL_HEADER32 结构大小 
+16h      WORD          Characteristics;     // 文件属性 } IMAGE_FILE_HEADER,  *PIMAGE_FILE_HEADER;


该结构如下图所示:



下边,小甲鱼童鞋为大家详细解释各个成员的含义和用法:



(1)Machine:可执行文件的目标CPU类型。

Value Meaning
IMAGE_FILE_MACHINE_I386 0x014c  

x86

IMAGE_FILE_MACHINE_IA64 0x0200

Intel Itanium

IMAGE_FILE_MACHINE_AMD64 0x8664

x64


(2)NumberOfSection: 区块的数目。(注:区块表是紧跟在IMAGE_NT_HEADERS 后边的)
(3)TimeDataStamp: 表明文件是何时被创建的。
这个值是自1970年1月1日以来用格林威治时间(GMT)计算的秒数,这个值是比文件系统(FILESYSTEM)的日期时间更加精确的指示器。如何将这个值翻译请看:http://home.fishc.com/space.php?uid=9&do=blog&id=555
提示:VC的话可以用_ctime 函数或者 gmtime函数。

(4)PointerToSymbolTable: COFF符号表的文件偏移位置,现在基本没用了。
(5)NumberOfSymbols: 如果有COFF符号表,它代表其中的符号数目,COFF符号是一个大小固定的结构,如果想找到COFF符号表的结束位置,则需要这个变量。

(6)SizeOfOptionalHeader: 紧跟着IMAGE_FILE_HEADER后边的数据结构(IMAGE_OPTIONAL_HEADER)的大小。(对于32位PE文件,这个值通常是00E0h;对于64位PE32+文件,这个值是00F0h)。
(7)Characteristics: 文件属性,有选择的通过几个值可以运算得到。(这些标志的有效值是定义于 winnt.h 内的 IMAGE_FILE_** 的值,具体含义见下表。普通的EXE文件这个字段的值一般是0100h,DLL文件这个字段的值一般是 210Eh。)小甲鱼温馨提示:多种属性可以通过 “或运算”使得同时拥有!

The characteristics of the image. This member can be one or more ofthe following values.

Value Meaning
IMAGE_FILE_RELOCS_STRIPPED   0x0001

Relocation information wasstripped from the 

file. The file must be loaded at itspreferred

baseaddress. Ifthe base address is not 

available, theloader reports an error.

IMAGE_FILE_EXECUTABLE_IMAGE 0x0002

The file is executable (there areno unresolved 

external references).

IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004

COFF line numbers were strippedfrom the 

file.

IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008

COFF symbol table entries werestripped from 

file.

IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010

Aggressively trim the workingset. This value is 

obsolete as of Windows 2000.

IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020

The application can handleaddresses larger 

than 2 GB.

IMAGE_FILE_BYTES_REVERSED_LO 0x0080

The bytes of the word arereversed. This flag

 isobsolete.

IMAGE_FILE_32BIT_MACHINE 0x0100

The computer supports 32-bitwords.

IMAGE_FILE_DEBUG_STRIPPED 0x0200

Debugging information was removedand stored 

separately in another file.

IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400

If the image is on removablemedia, copy it to

and runit from the swapfile.

IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800

If the image is on the network,copy it to and 

run itfrom the swapfile.

IMAGE_FILE_SYSTEM 0x1000

The image is a systemfile.

IMAGE_FILE_DLL 0x2000

The image is a DLL file. While itis an executable

 file, itcannot be run directly.

IMAGE_FILE_UP_SYSTEM_ONLY 0x4000

The file should be run only on auniprocessor

 computer.

IMAGE_FILE_BYTES_REVERSED_HI 0x8000

The bytes of the word arereversed. This flag

 isobsolete.


你可能感兴趣的:(小甲鱼PE详解之IMAGE_NT_HEADERS结构定义即各个属性的作用(PE详解02))