PE 文件是一种格式 :DOS头 PE头 区块 这些组成了PE文件
在这里插入图片描述
传送门:C++代码解析DOS头和NT头

什么是PE文件

指某 一种格式的文件,可执行文件 exe 动态链接库(dll)驱动文件(sys) 都是PE文件格式

| DOS头部 | 为了兼容DOS程序设计 |
| - | - |
| NT头部 | 存储PE文件的全部属性,初始信息化等 |
| 区段头表 | 对于PE文件主体属性的分段描述,个数不定 |
| 各个区段 | PE文件的主题,分段存储着可执行代码,各个数据资源等 |

DOS头

在DOS头中 有用的只有 e_mageic来比对此文件是否位 PE文件 而 e_lfanew用来指向NT头的偏移
在这里插入图片描述

在使用 010Edit 查看PE文件

4D 5A 是在文件的存储方式 ,而在内存中存储的方式小端 为 5A 4D 对应ASCII码 Z M,而 00 01 00 00 对应结构体里的 e_lfnew ,指向的是 NT头的文件偏移
在这里插入图片描述
然后做一个小实验,除了标识和e_lfnew全部归0
在这里插入图片描述
发现还是可以运行的
在这里插入图片描述
继续把标志也给擦除
在这里插入图片描述
==这时候图标就变了,文件闪退,(太快了没办法截图 大家可以自己试一下)==
所以Windows,分别是否是可执行程序,就是读取了PE结构的信息。一些图片隐写,就是利用了字段的无用或者是文件对齐的填充在其中覆盖自己的数据,达到了不影响文件大小的前提下 对文件修改
在这里插入图片描述

NT 头

==NT 头存储着PE头的全部属性==
在有些时候 可以利用DOS头距离NT头的空间(因为这些数据存在的意义不大),可以将NT头重叠到DOS块中
在这里插入图片描述
在这里插入图片描述

Signature 标识

和DOS中的e_magic 一样 判断是否是PE文件
如上图 50 45 对应 ASCII 中 的PE

FileHeader 文件头

==一共20个字节==
在这里插入图片描述
按照C++中的可以对应
word = 2字节 DWORD = 4字节
文件头没有什么说的,这里有个SizeOfOptionalHeader 变量指的是OPTIONAL_HANDLE头的大小
在这里插入图片描述

扩展头

在这里插入图片描述

敲黑板:扩展存储着非常有用的信息 可以在里面找到非常有用的信息
==数据目录表在下面==
在这里插入图片描述
imageBase默认的加载地址(默认400000地址上!但是每个程序都会争抢这个地址所以会发生重定位,很大概率会加载到别的地址上)

| AddressOfEntryPoint | 程序开始执行的相对虚拟地址 | |
| - | - | - |
| ImageBase | 默认加载地址(未加载发生重定位 | |
| SectionAlignment | 块对其,映射到内存中的区段对齐,必须大于文件对其书 0x1000 | |
| FileAlignment | 文件对其数,就是在硬盘中的文件区段对齐。0x200 | |
| SizeOfImage | 文件夹在内存,所需要的内存大小 ,对齐后的 | |
| SizeIfHeader | 所有头部大小,文件主体相对文件起始发生偏移 DOS NT + 区段 | |
| 在这里插入图片描述 | | |
| 下面是几个常用的表: | | |
| 导出表:提供的函数,可以供别的程序调用【exe文件中很少有导出表的,大多数dll都有导出表,某些存放资源文件的dll就没有导出表】 | | |

导入表:记录了一个exe或者一个dll所用到的其他模块导出的函数

资源表:Windows程序的各种界面称为资源,包括加速键,位图,光标,对话框,图标,菜单,串表,工具栏和版本信息等。
资源对于可执行文件而言是一个非常重要的存在,例如一个窗口,一个菜单都是一项资源信息,在PE文件的所有结构中。

重定位表
生成程序的时候,很多涉及到地址的代码,都使用一个绝对的虚拟内存地址(这个虚拟内存地址是假设程序加载到0x400000的地方时才能够使用的),但是当程序的加载基址产生变化的时候,加载基址和默认的加载基址就不一样了,那些涉及到地址的代码就不能运行了,此时就需要将那些涉及到地址的代码,把他们的操作数修改(去掉默认加载基址,再加上新的加载基址)才能够使程序运行起来。而重定位表就是记录了重定位之后的信息

暂时介绍这么几个表后续会更新

最后修改:2021 年 01 月 21 日 03 : 22 PM