PE详解之IMAGE_NT_HEADERS结构定义即各个属性的做用(PE详解02)

首先是IMAGE_NT_HEADERS 结构的定义:(啥?结构不会,先看看小甲鱼童鞋的 《零基础入门学习C语言》关于结构方面的章节吧~)

IMAGE_NT_HEADERS STRUCT php

+0hDWORDSignature  //
+4h  IMAGE_FILE_HEADER FileHeader //
+18hIMAGE_OPTIONAL_HEADER32OptionalHeader   //
} 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 Itaniumapp

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。)小甲鱼舒适提示:多种属性能够经过 “或运算” 使得同时拥有!
 
Value Meaning
IMAGE_FILE_RELOCS_STRIPPED   
0x0001

Relocation information was stripped from the 学习

file. The file must be loaded at its preferredui

base address. If the base address is not spa

available, the loader reports an error.翻译

IMAGE_FILE_EXECUTABLE_IMAGE
0x0002

The file is executable (there are no unresolved 调试

external references).orm

IMAGE_FILE_LINE_NUMS_STRIPPED
0x0004

COFF line numbers were stripped from the 

file.

IMAGE_FILE_LOCAL_SYMS_STRIPPED
0x0008

COFF symbol table entries were stripped from 

file.

IMAGE_FILE_AGGRESIVE_WS_TRIM
0x0010

Aggressively trim the working set. This value is 

obsolete as of Windows 2000.

IMAGE_FILE_LARGE_ADDRESS_AWARE
0x0020

The application can handle addresses larger 

than 2 GB.

IMAGE_FILE_BYTES_REVERSED_LO
0x0080

The bytes of the word are reversed. This flag

 is obsolete.

IMAGE_FILE_32BIT_MACHINE
0x0100

The computer supports 32-bit words.

IMAGE_FILE_DEBUG_STRIPPED
0x0200

Debugging information was removed and stored 

separately in another file.

IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
0x0400

If the image is on removable media, copy it to

and run it from the swap file.

IMAGE_FILE_NET_RUN_FROM_SWAP
0x0800

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

run it from the swap file.

IMAGE_FILE_SYSTEM
0x1000

The image is a system file.

IMAGE_FILE_DLL
0x2000

The image is a DLL file. While it is an executable

 file, it cannot be run directly.

IMAGE_FILE_UP_SYSTEM_ONLY
0x4000

The file should be run only on a uniprocessor

 computer.

IMAGE_FILE_BYTES_REVERSED_HI
0x8000

The bytes of the word are reversed. This flag

 is obsolete.

相关文章
相关标签/搜索