PE文件格式笔记

 
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 格式规范中找到。
定义
0x00000020
代码段
0x00000040
已初始化数据段
0x00000080
未初始化数据段
0x04000000
该段数据不能被缓存
0x08000000
该段不能被分页
0x10000000
共享段
0x20000000
可执行段
0x40000000
可读段
0x80000000
可写段
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 文件中也会有一个标志来表示调试数据被分离了出去。
 
 
 
参考:
PE 文件格式详解  http://blog.csdn.net/titilima/archive/2003/12/25/21442.aspx 

你可能感兴趣的:(PE文件格式笔记)