导图社区 PE结构学习
在学习PE文件时的学习笔记,PE结构的学习:DOS头、PE头及节表
编辑于2020-02-22 11:22:57PE结构
DOS部分
DOS头IMAGE_DOS_HEADER
64字节
2字节 e_magic
DOS标识MZ
. . .
中间的内容不重要,不影响程序运行
最后4字节 e_lfanew
PE头的文件偏移位置
DOS块
直到PE头文件位置,编译器自动填充,内容不重要,不影响程序运行
PE部分
PE标识
4字节,不能被破坏,操作系统在启动一个程序时会检测这个标识
标准PE头IMAGE_FILE_HEADER
20字节
2字节 Machine
可以运行在什么样的CPU上(任意:0; intel386以及后续: 14C; x64:664)
2字节 NumberOfSections
表示节的数量
4字节 TimeDateStamp
编译器填写的时间戳,与文件属性里面(创建时间、修改时间)无关
4字节 PointerToSymbolTable
调试相关
4字节 NumberOfSymbols
调试相关
2字节 SizeOfOptionalHeader
扩展PE头的大小(32位PE文件:0xE0; 64位PE文件:0xF0)
2字节 Characteristics
文件属性
0 IMAGE_FILE_RELOCS_STRIPPED
文件中不存在重定位信息
1 IMAGE_FILE_EXECUTABLE_IMAGE
文件是可执行的
2 IMAGE_FILE_LINE_NUMS_STRIPPED
不存在行信息
3 MAGE_FILE_LOCAL_SYMS_STRIPPED
不存在符号信息
4 MAGE_FILE_AGGRESSIVE_WS_TRIM
调整工作集
5 MAGE_FILE_LARGE_ADDRESS_AWARE
应用程序可处理大于2GB的地址
6
此标志保留
7 MAGE_FILE_BYTES_REVERSED_LO
小尾方式
8 MAGE_FILE_32BIT_MACHINE
只在32位平台上运行
9 MAGE_FILE_DEBUG_STRIPPED
不包含调试信息
10 MAGE_FILE_REMOVABLE_RUN_FROM_SWAP
不能从可移动盘运行
11 MAGE_FILE_NET_RUN_FROM_SWAP
不能从网络运行
12 MAGE_FILE_SYSTEM
系统文件(如驱动程序),不能直接运行
13 MAGE_FILE_DLL
这是一个DLL文件
14 MAGE_FILE_UP_SYSTEM_ONLY
文件不能在多处理器计算机上运行
15 MAGE_FILE_BYTES_RRVERSED_HI
大尾方式
16进制转2进制按小端位取值
扩展PE头IMAGE_OPTIONAL_HEADER32
224字节
2字节 Magic
PE32:10B;PE32+:20B
1字节 MajorLinkerVersion
链接器版本
1字节 MinorLinkerVersion
链接器版本
4字节 SizeOfCode
所有代码节的总和,文件对齐后的大小
4字节 SizeOfInitializedData
包含所有已经初始化数据的节的总大小,文件对齐后的大小
4字节 SizeOfUninitializedData
包含未初始化数据的节的总大小,文件对齐后的大小
编译器填写,没用
4字节 AddressOfEntryPoint
程序入口
4字节 BaseOfCode
代码开始的基地址
4字节 BaseOfData
数据开始的基地址
编译器填写,没用
4字节 ImageBase
内存镜像基址
4字节 SectionAlignment
内存对齐
4字节 FileAlignment
文件对齐
2字节 MajorOperatingSystemVersion
标识操作系统版本号 主版本号
2字节 MinorOperatingSystemVersion
标识操作系统版本号 次版本号
2字节 MajorImageVersion
PE文件自身的版本号
2字节 MinorImageVersion
PE文件自身的版本号
2字节 MajorSubsystemVersion
运行所需子系统版本号
2字节 MinorSubsystemVersion
运行所需子系统版本号
4字节 Win32VersionValue
子系统版本的值,必须为0
4字节 SizeOfImage
内存中整个PE文件的映射的尺寸,可比实际的值大,必须是SectionAlignment(内存对齐)的整数倍
4字节 SizeOfHeaders
所有头+节表 按照文件对齐后的大小,没有对齐加载会出错
4字节 CheckSum
校验和,一些系统文件有要求,用来判断文件是否被修改
2字节 Subsystem
子系统,驱动程序(1);图形界面(2);控制台、DLL(3)
2字节 DllCharacteristics
文件特性 不是针对DLL文件的
0
保留,必须为0
1
保留,必须为0
2
保留,必须为0
3
保留,必须为0
6 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
DLL可以在加载时被重定位
7 IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY
强制代码实施完整性验证
8 IMAGE_DLLCHARACTERISTICS_NX_COMPAT
该映像兼容DEP(硬件补漏洞的功能)
9 IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
可以隔离,但不隔离此映像
10 IMAGE_DLLCHARACTERISTICS_NO_SEH
映象不使用SEH
11 IMAGE_DLLCHARACTERISTICS_NO_BIND
不绑定映像
12
保留,必须为0
13 IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
该映像为一个WDM driver
14
保留,必须为0
15 IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
可用于终端服务器
16进制转2进制按小端位取值
4字节 SizeOfStackReserve
初始化时保留的栈的大小
4字节 SizeOfStackCommit
初始化时实际提交的栈的大小
4字节 SizeOfHeapReserve
初始化时保留的堆的大小
4字节 SizeOfHeapCommit
初始化时实际提交的堆得大小
4字节 LoaderFlags
调试相关
4字节 NumberOfRvaAndSizes
目录项数目
数组 IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]
16张表
节表部分
节表 IMAGE_SECTION_HEADER
结构体数组,每个结构体大小是40字节
8字节 BYTE Name[IMAGE_SIZEOF_SHORT_NAME]
ASCII字符串,可自定义,只截取8字节
4字节 union{DWORD PhysicalAddress; DWORD VirtualSize;}Misc
Misc 双字(四字节)是该节在没有对齐前的真实尺寸,该值可以不准
4字节 VirtualAddress
在内存中的偏移地址,加上ImageBase才是在内存中的真正地址
4字节 SizeOfRawData
节在文件中对齐后的尺寸
4字节 PointerToRawData
节区在文件中的偏移
4字节 PointerToRelocations
4字节 PointerToLinenumbers
2字节 NumberOfRelocations
2字节 NumberOfLinenumbers
调试相关
4字节 Characteristics
节的属性
5 IMAGE_SCN_CNT_CODE
节中包含代码
6 IMAGE_SCN_CNT_INITIALIZED_DATA
节中包含已初始化数据
7 IMAGE_SCN_CNT_UNINITIALIZED_DATA
节中包含未初始化数据
8 IMAGE_SCN_LNK_OTHER
保留供将来使用
25 IMAGE_SCN_MEM_DISCARDABLE
节中的数据在进程开始以后将被丢弃,如.reloc
26 IMAGE_SCN_MEM_NOT_CACHED
节中的数据不会经过缓存
27 IMAGE_SCN_MEM_NOT_PAGED
节中的数据不会被交换到磁盘
28 IMAGE_SCN_MEM_SHARED
表示节中的数据将被不同的进程所共享
29 IMAGE_SCN_MEM_EXECUTE
映射到内存后的页面包含可执行属性
30 IMAGE_SCN_MEM_READ
映射到内存后的页面包含可读属性
31 IMAGE_SCN_MEM_WRITE
映射到内存后的页面包含可写属性
16进制转2进制按小端位取值
代码节的属性一般为60000020h,也 就是可执行、可读和“节中包含代码”; 数据节的属性一般为c0000040h,也 就是可读、可写和“包含已初始化数据”; 常量节(.const段)为40000040h,也就 是可读和“包含已初始化数据”; 资源节的属性和常量节的属性一般是相同的
扩展PE头大小可能有变化,可以被修改 32位和64位系统大小也不一样,如果想 确定扩展PE头大小是否被修改,可以看 标准PE头SizeOfOptionalHeader大小 是否为E0