PE
文件格式
结构名
(winnt.h
中定义
)
|
说明
| |||||||||||||||||||||
IMAGE_DOS_HEADER
|
DOS
的.EXE头部, 占64字节
e_lfanew(0x3C); //
新exe头部的文件地址
| |||||||||||||||||||||
实模式残余程序
|
| |||||||||||||||||||||
SIZE_OF_NT_SIGNATURE
|
占4字节, 前两字节为PE标志, 起始地址
e_lfanew
的值, 该值在winnt.h中没有定义
| |||||||||||||||||||||
IMAGE_FILE_HEADER
|
PE
文件头, 占20字节
| |||||||||||||||||||||
IMAGE_OPTIONAL_HEADER
|
PE
可选头部,占224字节, 虽然它的名字是“可选头部”,但是请确信:这个头部并非“可选”,而是“必需”的。
.AddressOfEntryPoint
表示应用程序入口点的位置
.BaseOfCode:
已载入映像的代码(“.text”段)的相对偏移量。
.BaseOfData:
已载入映像的未初始化数据(".bss"段)的相对偏移量。
.SizeOfHeaders:
表示文件中有多少空间用来保存所有的文件头部
,
文件中所有的段实体就开始于这个位置。
.DataDirectory:
IMAGE_DATA_DIRECTORY
结构的数组
,
标识了
16
种数据目录的相对虚拟地址和大小
.(
导出目录
,
导入目录
,
资源目录
,
异常目录
,
安全目录
,
重定位基本表
,
调试目录
,
描述字串
……).
.
AddressOfEntryPoint:
表示应用程序入口点的位置
,
这个位置就是导入地址表(
IAT
)的末尾。
| |||||||||||||||||||||
IMAGE_SECTION_HEADER
… …
|
IMAGE_OPTIONAL_HEADER
.DataDirectory
个
|
多个连续的段头部,占40字节,数量由IMAGE_OPTIONAL_HEADER.DataDirectory数组得到.
段没有特定的顺序,通过.Name取得段的名字.
.Characteristics:
定义了段的特征,
PE
格式规范中找到。
| ||||||||||||||||||||
IMAGE_EXPORT_DIRECTORY
|
导出数据段,.edata;
AddressOfFunctions
域是一个到导出函数入口列表的偏移量。AddressOfNames域是到一个导出函数名称列表起始处偏移量的地址,这个列表是由null分隔的。AddressOfNameOrdinals是一个到相同导出函数顺序值(每个值2字节长)列表的偏移量。
| |||||||||||||||||||||
IMAGE_IMPORT_MODULE_DIRECTORY
|
导入数据段,.idata;
| |||||||||||||||||||||
IMAGE_DEBUG_DIRECTORY
|
调试信息段,.debug
| |||||||||||||||||||||
|
|
PE
文件格式总结
Windows NT
的
PE
文件格式向熟悉
Windows
和
MS-DOS
环境的开发者引入了一种全新的结构。然而熟悉
UNIX
环境的开发者会发现
PE
文件格式与
COFF
规范很相像(如果它不是以
COFF
为基础的话)。
整个格式的组成:一个 MS-DOS 的 MZ 头部,之后是一个实模式的残余程序、 PE 文件标志、 PE 文件头部、 PE 可选头部、所有的段头部,最后是所有的段实体。
可选头部的末尾是一个数据目录入口的数组,这些相对虚拟地址指向段实体之中的数据目录。每个数据目录都表示了一个特定的段实体数据是如何组织的。
PE 文件格式有 11 个预定义段,这是对 Windows NT 应用程序所通用的,但是每个应用程序可以为它自己的代码以及数据定义它自己独特的段。
.debug 预定义段也可以分离为一个单独的调试文件。如果这样的话,就会有一个特定的调试头部来用于解析这个调试文件, PE 文件中也会有一个标志来表示调试数据被分离了出去。
整个格式的组成:一个 MS-DOS 的 MZ 头部,之后是一个实模式的残余程序、 PE 文件标志、 PE 文件头部、 PE 可选头部、所有的段头部,最后是所有的段实体。
可选头部的末尾是一个数据目录入口的数组,这些相对虚拟地址指向段实体之中的数据目录。每个数据目录都表示了一个特定的段实体数据是如何组织的。
PE 文件格式有 11 个预定义段,这是对 Windows NT 应用程序所通用的,但是每个应用程序可以为它自己的代码以及数据定义它自己独特的段。
.debug 预定义段也可以分离为一个单独的调试文件。如果这样的话,就会有一个特定的调试头部来用于解析这个调试文件, PE 文件中也会有一个标志来表示调试数据被分离了出去。
参考:
PE
文件格式详解
http://blog.csdn.net/titilima/archive/2003/12/25/21442.aspx