Windows编程系列:PE文件结构

您所在的位置:网站首页 pe的主要结构 Windows编程系列:PE文件结构

Windows编程系列:PE文件结构

2024-06-13 16:28| 来源: 网络整理| 查看: 265

最近在参考OpenShell为任务栏设置图片背景时,发现里面使用了IAT Hook,这一块没有接触过,去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解,索性将PE文件结构的资料找出来,系统学习一下。

 

PE文件结构

Portable Executable (PE),可移植的可执行文件。在Windows平台下,所有的可执行文件(包括.exe, .dll, .sys, .ocx, .com等)均使用PE文件结构。这些使用了PE文件结构的可执行文件也称为PE文件。

 

PE结构包含的结构体有DOS头,PE标识 、文件头、可选头、目录头、目录结构、节表等。

整体结构如下

 

从上图可以看出PE结构分为4大部分,其中每个部分又进行了细分。

从数据管理的角度来看,可以把PE文件大致分为两部分,

1、DOS头、PE头和节表属于PE文件的数据管理结构或数据组织结构部分,

2、节表数据才是PE文件真正的数据部分,其中包含着代码、数据、资源等内容。

 

DOS头

DOS头分为“MZ头部”和"DOS存根“。

”MZ头部“是真正的DOS头部,由于其开始处的两个字节为"MZ",因此DOS头也可以叫作MZ头部。

这个我们用十六进制编辑器随便打开一个exe就可以看到

该部分用于程序在DOS系统下加载,它的结构被定义为IMAGE_DOS_HEADER

 

IMAGE_DOS_HEADER定义 1 //大小为: 0x40(64)字节 2 #define IMAGE_DOS_SIGNATURE 0x5A4D // MZ 3 4 typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header 5 WORD e_magic; // MZ标记 0x5a4d 6 WORD e_cblp; // 最后(部分)页中的字节数 7 WORD e_cp; // 文件中的全部和部分页数 8 WORD e_crlc; // 重定位表中的指针数 9 WORD e_cparhdr; // 头部尺寸以段落为单位 10 WORD e_minalloc; // 所需的最小附加段 11 WORD e_maxalloc; // 所需的最大附加段 12 WORD e_ss; // 初始的SS值(相对偏移量) 13 WORD e_sp; // 初始的SP值 14 WORD e_csum; // 补码校验值 15 WORD e_ip; // 初始的IP值 16 WORD e_cs; // 初始的SS值 17 WORD e_lfarlc; // 重定位表的字节偏移量 18 WORD e_ovno; // 覆盖号 19 WORD e_res[4]; // 保留字 20 WORD e_oemid; // OEM标识符(相对m_oeminfo) 21 WORD e_oeminfo; // OEM信息 22 WORD e_res2[10]; // 保留字 23 LONG e_lfanew; // NT头(PE标记)相对于文件的偏移地址 24 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

 

DOS存根是一段简单的程序,主要用于输出“This program cannot be run in DOS mode.”类似的提示字符串。

 

为什么PE结构的最开始位置有这样一段DOS头部呢?

为了该可执行程序可以兼容DOS系统。通常情况下,Win32下的PE程序不能在DOS下运行,因此保留了这样一个简单的DOS程序用于提示“不能运行于DOS模式下”。

 

DOS头部IMAGE_DOS_HEADER详解

IMAGE_DOS_HEADER的定义在前面我们列出来了,该结构体中需要掌握的字段 只有两个分别是第一个字段 e_magic和最后一个字段e_lfanew。

e_magic:DOS可执行文件的标识,占用2字节,该位置保存着字符是“MZ",该标识符在Winnt.h头文件中有一个宏定义,如下所示:

1 #define IMAGE_DOS_SIGNATURE 0x5A4D

 

我们创建一个简单的控制台程序

1 #include 2 3 int main() 4 { 5 std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3