对比
左边的是文件中.exe中的数据.右边的是 内存中的数据.
俩者数据一样. 但是最旁边的编号不一样.
在文件中有一段空白区域,断开了. 之后才继续有数据.
文件保存在硬板上
而在内存中,空白区域较多.
加载之后保存在内存中
开头
一些文件都是 4D 5A 开头的.
分节
PE分成一段一段的.
- 节省硬盘空间: 在内存中程序之间分隔较大. 在硬盘中存储分隔较小
- 硬盘对齐,内存对齐
对齐
硬盘对齐和内存对齐.
硬盘和内存中存储,程序段之间的分隔大小一致. 是对了硬盘对齐,加快读写速度
硬盘对齐是 200h,内存对齐是1000h
多开应用
PE头可以实现多开.
例如:
多开QQ. 数据分布如下
一个QQ的情况
俩个QQ的情况:
因为 只读数据是不能修改的. 在多开的情况下, 只需要复制 一份 可读可写的数据部分即可.
节省了空间
映射
pe与内存的映射关系
PE磁盘文件的 .data块 与 内存中的 .data 对应. 内存中的.data块额外添加了 1000h做分隔.
PE文件的 块表和 内存中的块表相对应
PE文件头 -> 内存PE文件头
DOS头-> 内存DOS头
块表
块表 记录了 各个块的起始和结束位置
其他
PE文件头和DOS头是 概要性的描述.
描述了 exe 运行在内存之后到底有多大,
练习
查找 PE头,DOS头,可选PE头
打开exe 数据. 对着 DOS头文件记录的内容一个个的查找.按宽度查找
DOS头
16位系统下使用
需要记住 e_magic 和 e_ifanew这俩个标记
e_ifanew 指向了真正的PE文件开始的地方
标准PE头
标准PE头和可选PE头在 NT_HEADERS 中.
开始的地方
从DOS头最后的 e_ifanew 开始. 最后一个字节是e8. 代表着从文件开始的地方算,数e8个字节,就是PE开始的地方
垃圾部分
从 e8 到 50有一部分是有数据的.这一部分是垃圾数据.可以随意更改填写覆盖
查询
对照着 NT_HEADERS ,找到PE头
DWORD Signature
_IMAGE_FILE_HEADER FIleHeader;
_IMAGE_OPTIONAL_HEADER OptionalHeader;
上图中的 50 45 00 00 和 NT 头总的 Signature 对应
标准PE头
具体的PE头详细字段查找和可选PE头详细字段查找的话. 请自行完成