没有合适的资源?快使用搜索试试~ 我知道了~
PE 的意思是 Portable Executable(可移植的执行体)。它是 Win32 环境自身所带的 执行文件格式。它的一些特性继承自 Unix 的 Coff(common object file format)文件格式。 同时为了保证与旧版本 MS-DOS 及 Windows 操作系统的兼容,PE 文件格式也保 留了 MS-DOS 中那熟悉的 MZ 头部。“Portable Executable”(可移植的执行体)意 味着此文件格式是跨 Win32 平台的;即使 Windows 运行在非 Intel 的 CPU 上,任何 win32 平台的 PE 装载器都能识别和使用该文件格式。
资源推荐
资源详情
资源评论
第 1 页 共 35 页
作者:太虚野老
第 2 页 共 35 页
目录
PE 文件格式详解 ...................................................................................................................... 3
PE 介绍: ..................................................................................................................................... 3
DOS header ................................................................................................................................ 3
DOS stub: ............................................................................................................................ 5
PE header ................................................................................................................................... 6
IMAGE_OPTIONAL_HEADER 结构: ..................................................................................... 7
DataDirectory 结构: ......................................................................................................... 11
区段表(Secton Table): .......................................................................................................... 13
.bss ....................................................................................................................................... 15
.textbss ................................................................................................................................ 15
.text ...................................................................................................................................... 15
.rdata ................................................................................................................................... 16
.data ..................................................................................................................................... 18
.idata .................................................................................................................................... 19
.edata ................................................................................................................................... 19
.rsrc ...................................................................................................................................... 19
.reloc .................................................................................................................................... 20
Export Table(导出函数表): ............................................................................................. 20
输出转送(Export Forwarding): ................................................................................... 24
输入部分(Import Section): ................................................................................................... 25
Import Table(导入函数表): .............................................................................................. 25
IAT: .................................................................................................................................... 30
Bound Imports(绑定输入): ............................................................................................. 32
加载运行 PE 文件的步骤模拟 ............................................................................................. 34
第 3 页 共 35 页
PE 文件格式详解
本文使用的工具软件为:“WinHex”和“Stud_PE”。
本文使用的测试软件为:“Roll.exe”和“msvcrt.dll”。
PE 介绍:
PE 的意思是 Portable Executable(可移植的执行体)。它是 Win32 环境自身所带的
执行文件格式。它的一些特性继承自 Unix 的 Coff(common object file format)文件格式。
同时为了保证与旧版本 MS-DOS 及 Windows 操作系统的兼容,PE 文件格式也保
留了 MS-DOS 中那熟悉的 MZ 头部。“Portable Executable”(可移植的执行体)意
味着此文件格式是跨 Win32 平台的;即使 Windows 运行在非 Intel 的 CPU 上,任何 win32
平台的 PE 装载器都能识别和使用该文件格式。
所有 Win32 执行体都是用 PE 文件格式,其中包括 SYS、DLL、EXE、COM、OCX 等。
相对虚拟地址(Relative Virtual Address,RVA):PE 文件中的许多域是用 RVA 来指
定的。简单地说,RVA 就是文件中某项内容相对于文件加载地址的偏移。
PE 文件结构的总体层次分布:
DOS MZ
header
DOS stub
PE header
Section
table
Section 1
Section 2
Section ...
Section n
DOS header
一个 PE 程序总是以一个 64 字节的 DOS header 结构开头,目的就是为了如果程序在 D
OS 中运行,DOS 会识别它为正确的 EXE 并进而运行 DOS stub。
第 4 页 共 35 页
下面就是 DOS Header 在 C 语言中的结构表示(来自 MinGW 的 winnt.h)
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; // Magic DOS 签名 MZ (4Dh 5Ah)
WORD e_cblp; // 文件最后一页的字节数
WORD e_cp; // 文件中的页数
WORD e_crlc; // 重定位的个数
WORD e_cparhdr; // 段落中以 16 字节为单位的头的长度
WORD e_minalloc; // 额外段落需要的最小分配值,16 字节单位
WORD e_maxalloc; // 额外段落需要的最大分配值,16 字节单位
WORD e_ss; // 初始 SS 寄存器值
WORD e_sp; // 初始 SP 寄存器值
WORD e_csum; // 校验和
WORD e_ip; // 初始 IP 寄存器值
WORD e_cs; // 初始 CS 寄存器值
WORD e_lfarlc; // 重定位表在文件中的地址
WORD e_ovno; // 覆盖数量
WORD e_res[4]; // 保留字
WORD e_oemid; // OEM 标识符
WORD e_oeminfo; // OEM 信息
WORD e_res2[10]; // 保留字
LONG e_lfanew; // PE header 的起始偏移量
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
首先声明, WORD 表示 unsigned short int(2bytes), 而 LONG 和后面会出现的 D
WORD 表示 unsigned int(4 bytes),其定义符合 C99 标准。
我们只关心其中两个成员,e_magic 是 Magic Number,它总是等于 0x4D5A,也就是 MZ
这两个字符,这是为了几纪念 Mark Zbikowsky,MS-DOS 设计者之一。
对于 MS-DOS 操作系统来说,许多其他的域都是有用的。例如:
512 ×(e_cp - 1) + e_cblp = (头部 + 代码部分)的长度。
在 PE 文件中 e_cp 总是 0003h,e_cblp 总是 0090h,没有实际意义。
但是对于 Windows NT 来说,只有最后一个域 e_lfnew 是有用的。
_lfanew 指向的是 PE header,这才是 PE 文件真正的开始,Win32EXE 加载器会读取其
中的地址并找到 PE header,DOS stub 因此被跳过。
如果在 DOS 下执行 PE 格式文件就会执行后面的 DOS Stup,显示字符串“This program
cannot be run in DOS mode.”然后退出。如果在 Window 下执行 PE 格式文件,PE 加载器就
会读取 e_lfanew 中的地址并找到 PE header,跳过 DOS stub。
在 WinHex 中打开 Roll.exe。
64 字节的 DOS header 结构:
64 字节的 DOS header 结构对应数据
成员 数据 含义
第 5 页 共 35 页
e_magic
5A4Dh
字符“MZ”
e_cblp
0090h
文件最后一页的字节数
e_cp
0003h
文件中的页数
e_crlc
0000h
重定位的个数
e_cparhdr
0004h
段落中以 16 字节为单位的头的长度(64 字节)
e_minalloc
0000h
额外段落需要的最小分配值,16 字节单位
e_maxalloc
FFFFh
额外段落需要的最大分配值,16 字节单位
e_ss
0000h
初始 SS 寄存器值
e_sp
00B8h
初始 SP 寄存器值
e_csum
0000h
校验和
e_ip
0000h
初始 IP 寄存器值
e_cs
0000h
初始 CS 寄存器值
e_lfarlc
0040h
重定位表在文件中的地址
e_ovno
0000h
覆盖数量
e_res[4]
00000000h
保留字
e_oemid
0000h
OEM 标识符
e_oeminfo
0000h
OEM 信息
e_res2[10]
0000000000000000000h
保留字
e_lfanew
00000118h
PE header 的起始偏移量
可以看到前两个 byte,确 实 是 MZ 表示一个合法的 EXE 文件,e_lfanew 是最后四个字节,
从图中我们可以读出,位于 3Ch~3Fh 的依次是 18,01,00,00,因为机器中整型存放遵循高位
在高地址处的原则,所以实际的值是 00,00,01,18。即 PE header 的起始偏移量为 0000011
8h。
DOS stub:
在 DOS header 后面的是 DOS Stup。
在 WinHex 中打开 Roll.exe。DOS Stup 如下所示:
实模式残余程序( DOS Stup) 是一个在装载时能够被 MS-DOS 运行的实际程
序。对于一个 MS-DOS 的可执行映像文件,应用程序就是从这里执行的。对于
剩余34页未读,继续阅读
资源评论
gqming
- 粉丝: 2
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 为ChatGLM设计的微调数据集生成工具,速来制作自己的猫娘 .zip
- 如何在 Ubuntu 20.04 上安装 Anaconda
- 人像matting数据集,包含34427张图像和对应的matting结果图 .zip
- 人员佩戴口罩检测数据集.zip
- 人工精调的中文对话数据集和一段chatglm的微调代码.zip
- 全国公共汽车站点和车次信息
- 人脸数据集(datasets of face).zip
- 从小说中提取对话数据集.zip
- 使用Scrapy采集淘宝数据,Flask展示.zip
- 使用Storm实时处理交通大数据(数据源kafka,集群管理zookeeper).zip
- 供AI训练的中文数据集(持续更新 )与AI公司图谱,目前的数据集餐饮行业8000问,百度知道,Alpaca中文数据集,计算机领域数据集,Vicuna数据集,RedPajama数据集,Wik.zip
- 利用预训练的中文模型实现基于bert的语义匹配模型 数据集为LCQMC官方数据.zip
- 制作自己的VOC2007数据集用于faster-rcnn目标检测模型训练.zip
- 前端数据采集,前端异常数据采集,用户行为监控采集,用户前端异常监控,图形化分析插件dataAcquisition(附demo).zip
- 原神抽卡记录数据集-Genshin Impact gacha data.zip
- 各大交易所的行情数据收集服务 .zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功