PE文件 是微软 Win32 环境下可执行文件的标准格式。

所谓的可执行文件并不仅仅是常见的 EXE 文件,DLL,SYS,VXD 等文件也都属于 PE 格式。

|-------> DOS_MZ_Header ------> 结构体:IMAGE_DOS_HEADER

|-------> DOS_Header ------|

|                                        |-------> DOS_Stub ------->"This program cannot be run in DOS mode."

|

PE 文件格式        |-------> PE_Header -------> 结构体:IMAGE_NT_HEADERS

|

|

|-------> Section_Table --------> 结构体:IMAGE_SECTION_HEADER

IMAGE_DOS_HEADER 结构体:

typedef struct _IMAGE_DOS_HEADER  // 该结构体大小为 64byte。
{
WORD e_magic;
// DOS 可执行文件标记。值为 0x5A4D,由于低位在前高位在后,所以存储为 0x4D5A。即 ASCII 字符为"MZ"。
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
// DOS 代码的初始化堆栈。
WORD e_sp; // DOS 代码的初始化堆栈指针SP。
WORD e_csum;
WORD e_ip;
// DOS 代码的初始化指令入口[指针IP]
WORD e_cs;
// DOS 代码的初始化堆栈入口。
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[];
LONG e_lfanew;
// PE 文件头偏移位置。
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

IMAGE_NT_HEADERS 结构体:

typedef struct _IMAGE_NT_HEADERS
{
DWORD Signature; // 标识 PE 文件头部。值为 0x00004550,ASCII 码即 "PE00"。
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

IMAGE_FILE_HEADER 结构体:

typedef struct _IMAGE_FILE_HEADER
{
WORD Machine; // 计算机的体系结构类型。
WORD NumberOfSections; // 节数。这指示节表的大小, 它紧跟在标题后面。
DWORD TimeDateStamp; // 图像的时间戳的低32位。这表示链接器创建映像的日期和时间。
DWORD PointerToSymbolTable; // 符号表的偏移量
DWORD NumberOfSymbols; // 符号表中的符号数。
WORD SizeOfOptionalHeader; // 紧跟在该结构体后面的 IMAGE_OPTIONAL_HEADER32 结构体的大小。
WORD Characteristics; // 图像的特征。
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

IMAGE_OPTIONAL_HEADER32 结构体:

typedef struct _IMAGE_OPTIONAL_HEADER 
{
WORD Magic; // 图像文件的状态。
BYTE MajorLinkerVersion; // 链接器的主要版本号。
BYTE MinorLinkerVersion; // 链接器的次要版本号。
DWORD SizeOfCode; // 代码节的大小。
DWORD SizeOfInitializedData; // 初始化数据节的大小。
DWORD SizeOfUninitializedData; // 未初始化数据节的大小。
DWORD AddressOfEntryPoint; // 指向入口点函数的指针。
DWORD BaseOfCode; // 指向代码节的开头的指针
DWORD BaseOfData; // 指向数据节开头的指针
DWORD ImageBase; // 在内存中加载图像的第一个字节的首选地址。
DWORD SectionAlignment; // 在内存中加载的节的对齐方式。
DWORD FileAlignment; // 图像文件中各节的原始数据的对齐方式
WORD MajorOperatingSystemVersion; // 所需操作系统的主要版本号。
WORD MinorOperatingSystemVersion; // 所需操作系统的次要版本号。
WORD MajorImageVersion; // 图像的主要版本号。
WORD MinorImageVersion; // 图像的次要版本号。
WORD MajorSubsystemVersion; // 子系统的主要版本号。
WORD MinorSubsystemVersion; // 子系统的次要要版本号。
DWORD Win32VersionValue; // 必须为 0。
DWORD SizeOfImage; // 图像的大小。
DWORD SizeOfHeaders; // 头结构体的总大小,
DWORD CheckSum; // 图像文件校验和。
WORD Subsystem; // 运行此映像所需的子系统。
WORD DllCharacteristics; // 图像的 DLL 特征。
DWORD SizeOfStackReserve; // 要为堆栈保留的字节数。
DWORD SizeOfStackCommit; // 要为堆栈提交的字节数。
DWORD SizeOfHeapReserve; // 要为本地堆保留的字节数。
DWORD SizeOfHeapCommit; // 要为本地堆提交的字节数。
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

IMAGE_DATA_DIRECTORY 结构体:

typedef struct _IMAGE_DATA_DIRECTORY
{
DWORD VirtualAddress; // 表的相对虚拟地址。
DWORD Size; // 表的大小。
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

IMAGE_SECTION_HEADER 结构体:

typedef struct _IMAGE_SECTION_HEADER
{
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // 用了定义区块名。
union {
DWORD PhysicalAddress; // 文件地址。
DWORD VirtualSize; // 加载到内存中的节的总大小
} Misc;

DWORD VirtualAddress; // 加载到内存中的节的第一个字节的地址 (相对于映像基)。
DWORD SizeOfRawData; // 磁盘上初始化数据的大小。
DWORD PointerToRawData; // 指向 COFF 文件中第一页的文件指针。
DWORD PointerToRelocations; // 指向该节的重新定位项开头的文件指针。如果没有迁移, 则此值为零。
DWORD PointerToLinenumbers; // 指向该节的行号条目开头的文件指针。如果没有 COFF 行号, 则此值为零。
WORD NumberOfRelocations; // 该节的搬迁条目数。此值为可执行图像的零。
WORD NumberOfLinenumbers; // 节的行号条目数。
DWORD Characteristics; // 图像的特征。
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

PE 文件格式详解的更多相关文章

  1. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  2. PE文件格式详解,第二讲,NT头文件格式,以及文件头格式

    PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...

  3. PE文件格式详解,第三讲,可选头文件格式,以及节表

    PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...

  4. PE文件格式详解(七)

    PE文件格式详解(七)   Ox00 前言 前面好几篇在讲输入表,今天要讲的是输出表和地址的是地址重定位.有了前面的基础,其实对于怎么找输出表地址重定位的表已经非常熟悉了.   0x01 输出表结构 ...

  5. PE文件格式详解(下)

    作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata ...

  6. PE文件格式详解(上)

    作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...

  7. PE文件格式详解(六)

    0x00 前言 前面两篇讲到了输出表的内容以及涉及如何在hexWorkShop中找到输出表及输入DLL,感觉有几个地方还是没有理解好,比如由数据目录表DataDirectory[16]找到输出表表后以 ...

  8. PE文件格式详解(一)

    PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...

  9. PE文件格式详解(八)

    0x00 前言 前面了解了PE文件的输入和输出,今天来看看另一个重要的结构——资源.资源结构是很典型的树形结构,层层查找,最终找到资源位置. 0x01 资源结构介绍 Windows程序的各种界面成为资 ...

随机推荐

  1. 【深入浅出-JVM】(77):SPI

    概念 Service Provider Interface 规则 在resource/META-INF/services 创建一个以接口全限定名为命名的文件,内容写上实现类的全限定名 接口实现类在cl ...

  2. 一次写文,多平台直接粘贴&打造最流畅的写作流程

    文字爱好者的痛点 这一段可以跳过,解决办法在后面.因为大家既然痛过,也就懂了. 对于很多文字爱好者来说,都希望写一篇文章后,可以实现多平台发布. 国内的很多平台都开始支持 Markdown,除了微信公 ...

  3. Java定时发送邮件

    背景 甲方爸爸:新接入业务在国庆以及军运会期间需要每天巡检业务并发送邮件告知具体情况! 我司:没问题. 甲方爸爸:假期也要发噢. 我司:没问题(...). 刚开始计划指定几个同事轮流发送,业务只要不被 ...

  4. 55 (OC)* 图片圆角处理

    iOS图片设置圆角性能优化   问题 圆角虽好,但如果使用不当,它就是你的帧数杀手,特别当它出现在滚动列表的时候.下面来看圆角如何毁掉你的流畅度的. 实测 layer.cornerRadius 我创建 ...

  5. NN and the Optical Illusion-光学幻觉 CodeForce1100C 几何

    题目链接:NN and the Optical Illusion 题目原文 NN is an experienced internet user and that means he spends a ...

  6. Linux 部署vsftp服务及详解

    一.FTP服务概述: FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP(File Transf ...

  7. echarts使用——柱状图

    开发中,做报表统计的时候,很容易用到echarts实现折线图.饼状图.柱状图的绘制,使用echarts插件很简单,官网有教程实例,但主要是这些图需要的数据格式的转换. 我的柱状图实现效果: 第一部分 ...

  8. 07-简单认识margin

    margin 外边距,表示边框到最近盒子的距离. 对于左右两边 <!DOCTYPE html> <html lang="en"> <head> ...

  9. Chrome浏览器启动报错:应用程序无法启动,因为应用程序的并行配置不正确。

    因为国庆节了,难得关一次机(可能搞IT的习惯吧),结果给祖国庆祝完70寿辰之后归来,启动电脑,就打不开Chrome浏览器了,报错如下: 应用程序无法启动,因为应用程序的并行配置不正确.有关详细信息,请 ...

  10. MongoDB 学习笔记之 检测存储引擎

    检测存储引擎: db.serverStatus().storageEngine db.serverStatus().wiredTiger (转)WiredTiger测试结果 单纯写的测试结果 结论:W ...