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. [Pytorch框架] 1.4 Autograd:自动求导

    文章目录 Autograd: 自动求导机制 张量(Tensor) 梯度 Autograd: 自动求导机制 PyTorch 中所有神经网络的核心是 autograd 包. 我们先简单介绍一下这个包,然后 ...

  2. Java SE 20 新增特性

    Java SE 20 新增特性 作者:Grey 原文地址: 博客园:Java SE 20 新增特性 CSDN:Java SE 20 新增特性 源码 源仓库: Github:java_new_featu ...

  3. 2023-02-17:sdl是跨平台的多媒体开发库,请问用go语言如何调用?

    2023-02-17:sdl是跨平台的多媒体开发库,请问用go语言如何调用? 答案2023-02-17: 用 github.com/moonfdd/sdl2-go 这个库. 这是我自己写的golang ...

  4. UCOS II 源码分析一

    再进行ucos操作系统源码分析前,先对ucos源码文件结构说个简单说明,只有掌握了源码文件结构才能在接下来的源码分析中逐渐感受到会当凌绝顶, 一览众山小,最后的感受就是RTOS也不是很神秘!下面以正点 ...

  5. GIT使用的记录

    使用的是win7下的git 安装就不赘述了下面的文档说的很详细 Git客户端图文详解如何安装配置GitHub操作流程攻略 http://www.ihref.com/read-16377.html 到下 ...

  6. ClickHouse进阶|如何自研一款企业级高性能网关组件?

    使用原生ClickHouse集群进行节点数据查询和写入时,离不开第三方开源网关组件chproxy支持.但由于chproxy缺少TCP协议支持,导致性能.查询能力等受限.这也成为困扰众多ClickHou ...

  7. 谈谈ChatGPT是否可以替代人

    起初我以为我是搬砖的,最近发现其实只是一块砖,哪里需要哪里搬. 这两天临时被抽去支援跨平台相关软件开发,帮忙画几个界面.有了 ChatGPT 之后就觉得以前面向 Googel 编程会拉低我滴档次和逼格 ...

  8. 利用jira及confluence的API进行批量操作(查找/更新/导出/备份/删除等)

    前言: 近期因为某些原因需要批量替换掉 jira 和 confluence中的特定关键字,而且在替换前还希望进行备份(以便后续恢复)和导出(方便查看)atlassian官方的api介绍文档太简陋,很多 ...

  9. 【Python&目标识别】labelimg报错IndexError: list index out of range

            博主在使用labelimg选取深度学习样本时,命令行报错IndexError: list index out of range,几经周折终于解决了,所以跟大家分享一下.         ...

  10. “古老”编程语言的最新选择!华为云发布CodeArts IDE for C/C++

    摘要:华为云CodeArts IDE for C/C++正式上线,欢迎体验. 本文分享自华为云社区<"古老"编程语言的最新选择!华为云发布CodeArts IDE for C ...