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. OpenHarmony SystemUI开发记录

    背景介绍 最近学习OpenHarmony应用开发, SDK版本是3.2.9.2 Beta4,IDE版本是3.1.0.200.参考官方文档,做了个Demo应用,调试.运行非常顺利.启动应用后,状态栏和导 ...

  2. 深度学习--全连接层、高阶应用、GPU加速

    深度学习--全连接层.高阶应用.GPU加速 MSE均方差 Cross Entropy Loss:交叉熵损失 Entropy 熵: 1948年,香农将统计物理中熵的概念,引申到信道通信的过程中,从而开创 ...

  3. OpenAI-GPT

    操作系统:CentOS 7.6 安装依赖软件 进入 root 账号: sudo -i 安装部署 ChatGPT 必备的软件,并且启动 nginx : yum install git nginx -y ...

  4. 文章学习:TPRE:分布式门限代理重加密

    学习文章:TPRE:分布式门限代理重加密 前言 成方金科新技术实验室与隐语团队合作,构建了"基于国密的分布式门限代理重加密算法TPRE",为用户提供了一种安全.高效.自主可控的数据 ...

  5. Pwn系列之Protostar靶场 Stack3题解

    (gdb) disass main Dump of assembler code for function main: 0x08048438 <main+0>: push ebp 0x08 ...

  6. 做了个vscode 小插件,用于修改window 的颜色以区分同时打开的不同工作区,快用起来吧!

    Coralize marketplace/coralize 以高效且便捷的方式自定义Visual Studio Code工作区窗口的状态栏.标题栏以及活动边栏等颜色!这将对那些需要同时打开多个vsco ...

  7. Web进阶LNMP网站部署

    Web进阶LNMP网站部署 目录 Web进阶LNMP网站部署 LNMP架构工作流程 部署LNMP架构 1.安装nginx 2.安装php 3.安装数据库 将Nginx和PHP建立连接 1.修改ngin ...

  8. 2022-07-26:以下go语言代码输出什么?A:5;B:hello;C:编译错误;D:运行错误。 package main import ( “fmt“ ) type integer in

    2022-07-26:以下go语言代码输出什么?A:5:B:hello:C:编译错误:D:运行错误. package main import ( "fmt" ) type inte ...

  9. 2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出。如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接

    2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出.如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接 ...

  10. 沁恒 CH32V208(五): CH32V208 运行FreeRTOS示例的说明

    目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟 沁恒 CH32V208 ...