PE结构总览
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头。


一个标准的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结构总览的更多相关文章
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- PE结构学习笔记--关于AddressOfEntryPoint位置在文件中怎么确定问题
第一次学习PE结构,也不知道有没有更好的办法. 1.AddressOfEntryPoint 这个成员在OptionalHeader里面,OptionalHeader的类型是一个IMAGE_OPTION ...
- OD 实验(五) - 对 PE 结构的简单分析
载入程序,按 Alt+M 查看内存空间 双击进入程序的 PE 头 这些为 DOS 环境下才会运行的 这个执行 PE 的地址,PE 结构的偏移地址为 C0 找到这个地址 以 PE 开头 SizeOfCo ...
- 仿LordPE获取PE结构
乍一看LordPE一个小工具一般般,真的动手做起来才知道技术含量高的很. 当前只是获取到PE结构并打印,仅此而已. PE.h #pragma once #include <stdio.h> ...
- 编写自定义PE结构的程序(如何手写一个PE,高级编译器都是编译好的PE头部,例如MASM,TASM等,NASM,FASM是低级编译器.可以自定义结构)
正在学PE结构...感谢个位大哥的文章和资料...这里先说声谢谢 一般高级编译器都是编译好的PE头部,例如MASM,TASM等一直都说NASM,FASM是低级编译器.可以自定义结构但是苦于无人发布相关 ...
- 手写PE结构解析工具
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...
- 关于pe结构
每一种操作系统它最重要的格式就是它的可执行文件格式, 因为操作系统就是为了支持这些文件而生成的,内核里面有很多机制,也是配合这种文件格式设计的. 换句话说,这种文件格式也是适合操作系统设计的. 比如: ...
- 【转】pe结构详解
(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是 ...
- Win32汇编-编写PE结构解析工具
汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...
- 羽夏笔记——PE结构(不包含.Net)
写在前面 本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...
随机推荐
- MySQL 主从延迟的常见原因及解决方法
承蒙大家的支持,刚上市的<MySQL实战>已经跃居京东自营数据库图书热卖榜第 1 名,收到的反馈也普遍不错.对该书感兴趣的童鞋可通过右边的链接购买.目前,京东自营有活动,只需 5 折. 主 ...
- 云原生2.0网关API标准发展趋势
摘要:Gateway API希望取代Ingress API. 本文分享自华为云社区<云原生2.0网关API标准发展趋势>,作者:华为云云原生团队 . 云原生网关API标准背景及发展现状 G ...
- 区块链——Lab2
区块链的典型数据结构 比特币:UTXO模型,以交易后找零为中心 ETH:Account 模型,以账户余额为中心(就是账户的形式) 区块链交易 用户发起交易 矿工验证交易(能够得到 区块奖励) 验证成功 ...
- Network Science:巴拉巴西网络科学学习笔记3——第二章随机网络
第二章:随机网络Erdős-Rényi Network (ER网络) 随机网络的两种定义形式: \(G(N,L)\)模型:N个节点,L条边随机链接. \(G(N,p)\)模型:N个节点,每个节点之间以 ...
- java LocalDateTime的使用
1.LocalDateTime的基本使用 //获取当前时间 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println( ...
- 笔记:C++学习之旅---泛型算法
标准库并未给每个容器定义成员函数来实现这些操作,而是定义了一组泛型算法(generic algorithm):称他们为"算法",是因为他们实现了一些经典算法的公共接口 ...
- js对象方法大全
JavaScript中Object构造函数的方法 Object构造函数的方法节 Object.assign() 通过复制一个或多个对象来创建一个新的对象. Object.create() 使用指定的原 ...
- Locust 界面简介(非使用级)
一.认识Locust 1.简介 Locust是一款易于使用的分布式负载测试工具,完全基于事件,即一个locust节点也可以在一个进程中支持数千并发用户,不使用回调,通过gevent使用轻量级过程(即在 ...
- SQL语句获取数据表结构定义,适合导出EXCEL为文档
SELECT 表名 = Case When A.colorder=1 Then D.name Else '' End, 表说明 = Case When A.colorder=1 Then isnull ...
- 2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A、B两个区域,第 i 个司机去A可得收入为income[i][0],第 i 个司机去B可得收入为income[i][1],返回所有调
2021-06-22:现有司机N*2人,调度中心会将所有司机平分给A.B两个区域,第 i 个司机去A可得收入为income[i][0],第 i 个司机去B可得收入为income[i][1],返回所有调 ...