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对齐)
页:
[1]