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. DRF的限流组件(源码分析)

    DRF限流组件(源码分析) 限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷. 对于匿名用户,使用用户IP作为唯一标识. 对于登录用户,使用 ...

  2. 云原生时代崛起的编程语言Go并发编程实战

    @ 目录 概述 基础理论 并发原语 协程-Goroutine 通道-Channel 多路复用-Select 通道使用 超时-Timeout 非阻塞通道操作 关闭通道 通道迭代 定时器-TimerAnd ...

  3. 【Docker】网络管理

    一.容器默认网络通信 Usage: dockerd [OPTIONS] Options: --icc Enable inter-container communication (default tru ...

  4. 2020-10-31:java中LinkedTransferQueue和SynchronousQueue有什么区别?

    福哥答案2020-11-01:SynchronousQueue:线程A使用put将数据添加到队列,如果没有其他线程使用take去获取数据,那么线程A阻塞,直到数据被其他线程获取,同理 如果线程B从队列 ...

  5. Kerberos协议原理

    本文主要介绍Kerberos认证协议的原理以及解决了什么问题 Kerberos是什么 Kerberos是计算机网络世界中的一种身份认证协议. 身份认证是我们日常生活中经常进行的活动,比如我们要去银行取 ...

  6. Python安装部署 - virtualenv虚拟环境配置(Windows)

    Python安装部署 - virtualenv虚拟环境 目录 Python安装部署 - virtualenv虚拟环境 前言 安装virtualenv 搭建虚拟环境 搭建虚拟环境指定路径 PyCharm ...

  7. 这10个Lambda表达式必须掌握,简化你的代码,提高生产力

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名 ...

  8. L3-017 森森快递

    一.题目: 7-2 森森快递 (30 分) 森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由于道路限 ...

  9. Error in render: “TypeError: Cannot read property ‘0‘ of null“

    我们web的同学运行程序时经常会遇到如下错误,而查找起来却相当费劲 看错误提示第一反应会想到是不是我的js 方法中的某个对象取值错误了,如: 但完全错了,当你把方法里的js 翻来覆去找了一遍又一遍,任 ...

  10. Must use destructuring props assignmenteslint

    eslint 检测提示Must use destructuring props assignmenteslint 使用对象结构就可以解决了