Windows PE文件(Portable Executable file)是一种可执行文件格式,用于Windows操作系统中的可执行程序、动态链接库(DLL)和驱动程序等。它是一种规范化的文件格式,定义了文件的结构和组织方式,以便操作系统能够正确加载和执行这些文件。
本节必须掌握的知识点:
PE文件特征和组成
初识PE文件
2.1.1 PE文件特征和组成
图2-1 PE结构划分
如图2-1所示,Windows PE文件的主要特征和组成部分包括:
■DOS头
DOS头由两部分组成:
●DOS MZ头(DOS Header): 这是一个用于兼容DOS环境的头部,包含了DOS程序的执行入口和其他相关信息。
●DOS块(DOS Stub):DOS驻留程序。是Windows可执行文件(PE文件)中的一个特殊部分,位于文件头之后、PE头之前的位置。它是为了兼容DOS环境而保留的一个小段程序代码,用于在DOS环境下执行一些简单的操作或显示一些特定信息。
■PE头
PE头由3部分组成:
●PE头标识(Signature):即“50 45 00 00”4个字节二进制数,为“PE\0\0”的ASCII码字符,用于标识该文件为PE文件。
●PE文件头(PE Header): 这是PE文件的主要头部,包含了PE文件的标识和一些基本信息,如机器类型、节表(Section Table)的位置和大小等。
●PE扩展头(OptionalHeader):位于PE文件头(PE Header)之后的一个可选部分,用于存储一些额外的信息和数据。扩展头的存在取决于PE文件的特定配置和需要。扩展头包括扩展头(Optional Header)和数据目录表(Data Directory Table)。
其中数据目录表中包含了16个数据目录项:
1.导入表(Import Table)和导出表(Export Table): 这些表用于描述PE文件中的导入和导出函数。导入表记录了PE文件所依赖的外部函数和库,而导出表记录了PE文件中自己提供给其他模块使用的函数。
2.重定位表(Relocation Table): 当PE文件被加载到内存中时,由于地址空间的不同,可能需要对其中的地址进行重定位。重定位表记录了需要进行地址重定位的位置和相关信息。
3.资源表(Resource Table): 资源表包含了PE文件中的资源,如图标、位图、字符串等。它们可以被应用程序或操作系统使用。
4.IAT表(Import Address Table)是Windows可执行文件中的一个重要数据结构,用于存储程序所依赖的外部函数的地址。它是在链接和加载过程中由操作系统动态填充的。
5.其他数据部分(Data Sections): PE文件还包括一些其他数据部分,如调试信息、TLS(Thread Local Storage)初始化数据等。
DOS头和PE头构成了PE文件的头部。接下来就是PE文件的数据部分。
■PE数据区
PE数据区包含节表和节区内容两个部分组成。每个具体PE文件中节区的数量是不同的。
●节表(Section Table): 节表定义了PE文件中各个节(Section)的位置、大小和属性等信息。每个节都对应着PE文件中的一个逻辑部分,如代码节、数据节、资源节等。
●节内容:节表以下的部分就是各个节区的具体内容了,如.text、.rdata、.data节区等。
Windows PE文件格式是Windows操作系统的核心之一,了解它的结构和使用方式对于开发和分析Windows应用程序和驱动程序非常重要。
【注意】 PE文件格式的细节和特性可能会因不同的Windows版本和编译器而有所差异。
2.1.2 初识PE文件
我们借助WinHex工具来初步认识一下一个简单的PE文件HelloWorld.exe。
实验一:静态分析32位PE文件
我们将32位程序HelloWorld.exe拖入WinHex,如图1-2所示:
图2-2 初识PE文件
图1-2清晰的显示了一个真实的、在磁盘上的PE文件的基本结构。一个PE文件可以划分为DOS头、DOS块、PE头、节表和节区几个大区块。
每个PE文件的DOS头的大小都是64个字节,都具有“4D5A”两个字节的DOS头特征字符“MZ”。而DOS块的大小却是可变的。
每个PE文件都有PE 文件标识“PE\0\0”,即0x00004550。PE头的大小也同样是可变的。通常绝大多数32位PE文件的PE头的大小是相同的,为248字节。而64位PE文件的PE头大小为264个字节。在一些特例中,有可能会人为的修改扩展头的大小。
每个PE文件节表的大小和节区的大小都有可能不相同。每个节表项都对应一个节区。在图2-2中,HelloWorld.exe包含.text、.rdata和.data 3个节区,分别对应3个节区。
实验二:静态分析64位PE文件
将64位程序notepad64.exe拖入WinHex,如图2-3所示:
图2-3 64位PE静态分析
64位PE文件格式与32位PE文件格式几乎相同,同样包含DOS头、DOS块、PE头、节表和节区。也同样包含”MZ”和”PE/0/0”特征。如果仔细观察就会发现,64位PE文件的PE头的大小为264个字节,而32位PE文件的PE头大小为248个字节。我们将在下一章详细讲解具体的区别。