pe文件经历了从16位系统到32位系统的过度。因此32系统下的每一个PE文件都可以在16位系统下运行。

16位系统下的PE结构

在16位系统下,PE结构可以大致分为两个部分:DOS头和一些其他数据



## DOS MZ 头(16位)

#

32位系统下,PE结构示意图

32位系统下的PE文件结构被划分为5个部分:** DOS MZ 头 、 DOS Stub 、 PE 头部、 节表、节内容 **
节表和节内容两部分都是PE数据区,DOS MZ头大小是64个字节,PE头的大小是456个字节(由于数据目录表项不一定是16个,所以准确地说,PE头也是一个不能确定大小的结构)节表的大小之所以不固定,是因为每个PE中节的数量是不固定的。每个节的描述信息则是个固定值,共40个字节,节表由不确定数量的节描述信息组成,其大小等于节的数量*40,节的数量由字段-IMAGE_FILE_HEADER_NumberOfSection来定义。
其中DOS Stub和节内容都是大小不确定的。
PE文件头部等于DOS头+PE头。
![](https://img2020.cnblogs.com/blog/2069956/202108/2069956-20210806093807716-1448109415.png)
![](https://img2020.cnblogs.com/blog/2069956/202108/2069956-20210806093821305-1872202657.png)

一个标准的PE文件一般由四大部分组成:

1.DOS头

2.PE头(IMAGE_NT_HEADERS)

3.节表(多个IMAGE_SECTION_HEADER结构)

4.4个字节的标识符号(Signature)

5.20个字节的基本头部信息(IMAGE_FILE_HEADER)

6.216个字节的扩张头信息(IMAGE_OPTION_HEADER32)

总结 头部+身体等于一个人

PE文件头部 = DOS头+PE文件头+节表

PE文件身体 = 节内容

DOS MZ 头的下面是DOS Stub.整个DOS Stub是一个字节快,其内容随着链接时使用的连接器不同而不同,PE中并没有与之对应的相关数据结构

PE头标识Signature

紧跟在DOS Stub后面的时PE头标识Signature.与大部分文件格式的头部yi'yang,PE头部信息中有一个四字节的标识,该标识位于指针

IMAGE_DOS_HEADER.e.lfanew 指向的位置,其内容固定,对应与ASCII码的字符串PE\0\0#

标准PE头IMAGE_FILE_HEADER

标准PE头IMAGE_FILE_HEADER紧跟在PE头标识后,即位于IMAGE_DOS_HEADER的e_lfanew值+4的位置。由此位置开始的20个字节为数据结构标准PE头IMAGE_FILE_HEADER的内容。该结构在微软的官方文档中被称为标准通用对象文件格式(Common Object File Format,COFF)头。它记录了PE文件的全部属性,如PE文件运行的平台、PE文件类型(EXE文件还是DLL文件)文件中存在的节的总数等。

扩展PE头IMAGE_OPTION_HEADER32

尽管从名字上看好像部分数据时可选的(optional)的,但在PE文件结构中,它却有着比标准PE头更多的内容,让人感觉似乎它才是真正的PE头,其详细定义如下:



文件执行时的入口地址,文件被操作系统装入内存后的默认地址,以及节在磁盘和内存中的对齐单位等信息均可在此结构中找到,。对该结构中的某些数值的随意改动可能会造成 PE文件的加载或运行失败。

PE头IMAGE_NT_HEADERS

这个结构是广义上的PE头,在标准的PE文件中其大小为456个字节即IMAGE_NT_HEADERS = 4个字节的PE标识+IMAGE_FILE_HEADER+IMAGE_OPTIONAL_HEADER32 如图所示



数据目录项IMAGE_DATA_DIRECTORY

IMAGE_OPTIONAL_HEADER32(扩张PE头)结构的最后一个字段DataDirectory。

该字段定义了PE文件中出现的所有不同类型的数据的目录信息。如导出表,导入表,资源表,重定位表等这些数据被操作系统以页为单位组织起来,并赋予不同的访问属性;在文件中,这些数据也同样组织起来,按照不同类别分别存放在文件的指定位置。

数据目录项IMAGE_DATA_DIRECTORY的数据结构来定义每种数据。该结构只有两个字段:





节表项IMAGE_SECTION_HEADER

PE头IMAGE_NT_HEADER后紧跟着节表。它有许多节表项(IMAGE_SECTION_HEADER)组成,每个节表项记录了PE中与某个特定的节有关信息。如节的属性、节的大小、在文件和内存中的起始位置等。节表中节的数量有字段IMAGE_FILE_HEADER_NumberOfSections来定义。

节表项的数据结构详细定义如下:



节表后面就是节的内容。截至节表,PE文件头部涉及的所有数据结构已经全部介绍完毕。

PE结构总览的更多相关文章

  1. 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)

    0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...

  2. PE结构学习笔记--关于AddressOfEntryPoint位置在文件中怎么确定问题

    第一次学习PE结构,也不知道有没有更好的办法. 1.AddressOfEntryPoint 这个成员在OptionalHeader里面,OptionalHeader的类型是一个IMAGE_OPTION ...

  3. OD 实验(五) - 对 PE 结构的简单分析

    载入程序,按 Alt+M 查看内存空间 双击进入程序的 PE 头 这些为 DOS 环境下才会运行的 这个执行 PE 的地址,PE 结构的偏移地址为 C0 找到这个地址 以 PE 开头 SizeOfCo ...

  4. 仿LordPE获取PE结构

    乍一看LordPE一个小工具一般般,真的动手做起来才知道技术含量高的很. 当前只是获取到PE结构并打印,仅此而已. PE.h #pragma once #include <stdio.h> ...

  5. 编写自定义PE结构的程序(如何手写一个PE,高级编译器都是编译好的PE头部,例如MASM,TASM等,NASM,FASM是低级编译器.可以自定义结构)

    正在学PE结构...感谢个位大哥的文章和资料...这里先说声谢谢 一般高级编译器都是编译好的PE头部,例如MASM,TASM等一直都说NASM,FASM是低级编译器.可以自定义结构但是苦于无人发布相关 ...

  6. 手写PE结构解析工具

    PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...

  7. 关于pe结构

    每一种操作系统它最重要的格式就是它的可执行文件格式, 因为操作系统就是为了支持这些文件而生成的,内核里面有很多机制,也是配合这种文件格式设计的. 换句话说,这种文件格式也是适合操作系统设计的. 比如: ...

  8. 【转】pe结构详解

    (一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是 ...

  9. Win32汇编-编写PE结构解析工具

    汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...

  10. 羽夏笔记——PE结构(不包含.Net)

    写在前面   本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...

随机推荐

  1. 去中心化金融-Lec3

    区块链 (什么是区块链?)区块链提供了一种无需可信的参与方,能够让多个参与方实现合作的方式(若存在可信的第三方,则不需要区块链:但是金融系统中往往没有可信的第三方) 终端用户工具:user inter ...

  2. python+folium

    建模时无意中发现了一个很好用的交互式画地图的库!!

  3. Go windows 环境搭建

    下载地址 官网下载地址:https://golang.google.cn/dl/ 1.下载完之后 双击msi进行安装 路径可以不用改, 继续next 安装完之后就需要配置环境变量, 找到环境变量 GO ...

  4. 2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个, 操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之

    2022-06-06:大妈一开始手上有x个鸡蛋,她想让手上的鸡蛋数量变成y, 操作1 : 从仓库里拿出1个鸡蛋到手上,x变成x+1个, 操作2 : 如果手上的鸡蛋数量是3的整数倍,大妈可以直接把三分之 ...

  5. 2021-05-22:假设所有字符都是小写字母, 大字符串是str,arr是去重的单词表, 每个单词都不是空字符串且可以使用任意次。使用arr中的单词有多少种拼接str的方式。 返回方法数。

    2021-05-22:假设所有字符都是小写字母, 大字符串是str,arr是去重的单词表, 每个单词都不是空字符串且可以使用任意次.使用arr中的单词有多少种拼接str的方式. 返回方法数. 福大大 ...

  6. vue/cli3整合Cesium,加载离线arcgis 切片

    最開始使用webpack進行cesium 集成, 出现了问题一大堆,最后只好选择传统的方法直接引入了,具体操作如下 目录 一.安装cesium 二.使用script引用cesium 1.切换到 nod ...

  7. STM32H5移植zbar记录

    ZBar是一种流行的二维码扫描和解码工具,它在嵌入式系统中拥有广泛的应用.在嵌入式系统中,我们面临着有限的资源和更严格的性能要求,因此,选择适当的库来完成特定的任务非常重要. ZBar适用于各种嵌入式 ...

  8. adb知识

    一.原理: adb客户端:能够对adb服务下发指令或命令的工具 server服务端:adb.exe执行之后的进程,表示adb的服务端,通过服务端与手机上的adb守护进程进行通信 adb守护进程 : 随 ...

  9. 数据库SQL复习

    数据库SQL介绍 Def:SQL是一种极其高效的数据库系统语言:可以实现对数据库中的数据进行增删改查等操作 增加操作:使用create命令: 可以create table 可以create View ...

  10. 【python基础】基本数据类型-数字类型

    Python3 支持int(整型数据).float(浮点型数据).bool(布尔类型) 1.int(整型数据) 在Python 3里,只有一种整数类型 int,表示为长整型.像大多数语言一样,数值类型 ...