吾爱-路人甲 发表于 2014-1-8 13:49

PE文件格式分析与解释

如果觉得有用希望大家多给点评分,谢谢。

偏移      大小  含义      说明
00000000    2    MZ签名     'MZ'字符
00000002    2    文件长度%512
00000004    2    文件长度/512
00000006    2    重定位项数   重定位表的表项计数
00000008    2    文件头所需段数 文件头的大小。文件头后面就是指令。
0000000A    2    运行需最小段数
0000000C    2    运行需最大段数
0000000E    2    初始SS
00000010    2    初始SP
00000012    2    校验和     为0
00000014    2    初始IP
00000016    2    初始CS
00000018    2    重定位表位置  为0x40是因为没有重定向表。
0000001A    2    覆盖号
000000XX    XX   重定位表    每个重定位表项即为一个远指针。
000000XX    XX   程序入口点   偏移位置等于文件头大小。Win32程序在这里
                    打印一句“This program cannot be run in
                    DOS mode.”后退出。
Win32特有:
0000001C    8    保留字     为0
00000024    2    OEM标识符
00000026    2    OEM信息
00000028    20   保留字     为0
0000003C    4    PE文件头偏移  指定了PE文件头的位置



以下偏移从PE文件头开始
PE文件头:共24字节
00000000    4    PE签名     'PE'字符。0填充共4字节。4个可能的值:'MZ'(DOS的,
                    2字节),'NE'(OS/2的,2字节),'LE'(也是OS/2的,2字
                    节),'PE'(0填充,4字节,Win32的)
00000004    2    机器类型    即CPU类型,0x14C=I386;详见WINNT.H第5117行
00000006    2    区段数     区段的数目,PE区段头部的数目。
00000008    4    时期/日期戳   链接的时间
0000000C    4    符号表的位置  符号表用于调试
00000010    4    符号数
00000014    2    可选标头大小
00000016    2    特性      详见WINNT.H第5100行


PE可选标头:
00000018    2    类型      010B=32位可执行,020B=64位可执行,0107=ROM映像
0000001A    1    链接器主版本号
0000001B    1    链接器副版本号
0000001C    4    .text段大小
00000020    4    .data段大小
00000024    4    .bss段大小
00000028    4    程序入口点RVA  VA是虚拟地址,RVA是相对虚拟地址。虚拟地址等于实际
                    地址减去EXE基址(hInstance)
0000002C    4    .text段基址   RVA
00000030    4    .data段基址   RVA
00000034    4    镜像基址    即hInstance
00000038    4    分段对齐    每个段的起始地址必须是这个值的整数倍。
0000003C    4    文件对齐    文件每个段的偏移必须是这个值的整数倍。
00000040    2    操作系统主版本 针对的OS的主版本号
00000042    2    操作系统副版本 针对的OS的副版本号
00000044    2    文件主版本   即这个程序的主版本号
00000046    2    文件副版本   即这个程序的副版本号
00000048    2    最低操作系统  需求的操作系统的最低主版本号
0000004A    2    最低操作系统  需求的操作系统的最低副版本号
0000004C    4    保留      为0
00000050    4    镜像大小    映像的全部大小,按照分段对齐的值对齐。不包括PE头。
00000054    4    头大小     整个PE头的大小(包括EXE头)。
00000058    4    校验和     为0。“信任服务”必须有一个合法的校验和
0000005C    2    子系统     1=不需要子系统,2=Windows GUI,3=控制台,5=OS/2控制台
                    7=POSIX控制台,8=Win9x驱动程序,9=Windows CE
0000005E    2    DllMain调用条件 1:LoadLibrary的时候调用DllMain;2:FreeLibrary的时候
                    调用;4:线程开始时调用;8:线程结束时调用;0x2000:这个
                    驱动程序是WDM模型的。
00000060    4    初始线程栈总数 给初始线程保留的栈总数,但并不是所有都给初始线程。
00000064    4    提交栈总数   提交给初始线程的栈大小。
00000068    4    堆总数     给进程保留的堆总数。但并不是所有都给进程。
0000006C    4    提交堆总数   提交给进程的堆大小。
00000070    4    加载器标记   为0
00000074    4    数据目录数   一般为0x10
00000078    XX   数据目录    每个数据目录为8字节(4字节RVA+4字节大小)。目录的排
                    序决定了目录的意义。详见WINNT.H第5324行


后面紧接着PE区段头部。
以下偏移从PE区段头部开始
PE区段头部(多个):
00000000    8    区段名字    8字节以内。
00000008    4    虚拟大小    实际使用的段大小。
0000000C    4    RAW数据大小   RAW数据大小(已初始化数据大小)。
00000010    4    RAW数据的RVA  RAW数据的位置
00000014    4    重定位表RVA   重定位表的位置(主要出现在OBJ)
00000018    4    行号表RVA    行号表的位置
0000001C    2    重定位表项数  重定位表的项数
0000001E    2    行号表项数   行号表的项数
00000020    4    特性      定义段的读写、执行情况。详见WINNT.H第5368行


重定位表结构:
以下偏移从重定位表开始
00000000    4    重定向RVA    如果段特性有IMAGE_SCN_LNK_NRELOC_OVFL,则为重定向
                    数量。
00000004    4    符号表索引   符号表对应的索引。
00000008    2    类型      详见WINNT.H第5645行


PE文件主要结构:
1、16位EXE头
2、PE头
3、各个段的镜像(4KB对齐)

cheseack 发表于 2014-1-8 14:25

不错,虽然自己还没太了解,最近一直在看 windows pe 权威指南

1354669803 发表于 2014-1-8 19:29

好像还是不懂这到底是什么

boyljx 发表于 2014-1-10 11:21

我记得看过一个视频教程教门讲PE文件头, 完全靠填HEX来生成hello world程序.

jomin 发表于 2014-6-19 16:29

不错,在网上找了几个都是不全的,有没有英文版的,或者官方的呢?
页: [1]
查看完整版本: PE文件格式分析与解释