当前位置: 首页 > 科技观察

网络安全编程:PE文件结构概述

时间:2023-03-18 22:44:00 科技观察

PE结构是Windows下可执行文件的标准结构。可执行文件的加载、内存分配和执行都依赖于PE结构,要想更高效的理解程序,就必须掌握PE结构。PE(PortableExecutable),即可移植的可执行文件。Windows平台下(包括Win9x、WinNT、WinCE……),所有的可执行文件(包括EXE文件、DLL文件、SYS文件、OCX文件、COM文件……)都使用PE文件结构。这些使用PE文件结构的可执行文件也称为PE文件。普通程序员可能不需要掌握PE文件结构,因为他们大多是开发服务、决策、辅助软件,如MIS、HIS、CRM等软件。但是对于学习黑客编程和学习安全编程的Hacker、Cracker、Programmer来说,掌握PE文件结构的知识是非常重要的。一、PE文件结构概述Windows系统下的可执行文件包含各种数据,包括代码、数据、资源等。Windows系统下的可执行文件虽然包含了这么多类型的数据,但是它们的存储是有序的、结构化的,这完全取决于通过PE文件结构管理各种数据。同样,PE结构是由若干个复杂的结构组成,而不是单一结构那么简单。它的结构就像一个由多个结构组成的文件系统的结构。PE结构中包含的结构包括DOS头、PE标识、文件头、可选头、目录结构、节表等。要想掌握PE结构,就必须对PE结构有一个整体的了解。你必须知道PE结构分为哪些部分,这些部分起到什么作用。有了宏观的概念之后,就可以深入研究PE结构的各种结构。下面给出一张图,让大家对PE结构有一个大概的了解,如图1所示。图1PE结构概览从图1可以看出,PE结构分为四大部分,每一部分又细分分成几个小部分。从数据管理的角度来看,PE文件大致可以分为两部分。DOS头、PE头和节表属于PE文件的数据管理结构或数据组织结构,而节表数据是PE文件的真实数据。部分,其中包含代码、数据、资源等。在进行逆向分析时,就是分析其代码、数据、资源等具体数据,也就是图1中的“节表数据”部分。程序在内存中或者文件中的组织结构是如何规划的,我没有去详细了解,这部分内容就是图1上面三部分的内容。2.简介PE结构的各个部分根据图1给出的PE结构的概览,我们先对各个部分的作用有个大概的认识。(1)DOS头DOS头分为两部分,即“MZ头”和“DOS存根”。MZ标头是一个真正的DOS标头。由于开头的两个字节是“MZ”,所以DOS头也可以称为MZ头。该部分用于DOS系统下的程序加载,其结构定义为IMAGE_DOS_HEADER。DOSRemnant是一个简单的程序,主要用于输出类似于“该程序不能在DOS模式下运行”的提示字符串。为什么PE结构的最开头会有这样一个DOS头?关键是可执行程序要与DOS系统兼容。通常Win32下的PE程序是不能在DOS下运行的,所以保留这么一个简单的DOS程序提示“不能在DOS模式下运行”。(2)PE头PE头存放着Windows系统加载可执行文件的重要信息。PE标头由IMAGE_NT_HEADERS定义。从结构体的定义名称可以看出,IMAGE_NT_HEADERS由多个结构体组成,包括IMAGE_NT_SIGNATRUE、IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER。PE头在PE文件中的位置是不固定的,PE头的位置是由DOS头的某个字段给定的。(3)段表程序的组织结构,根据不同的属性,存放在不同的段中。PE头之后是一个数组结构的节表。描述节表的结构是IMAGE_SECTION_HEADER。如果PE文件中有N个节,节表就是一个由N个IMAGE_SECTION_HEADER组成的数组。节表存储与每个节的属性、文件位置和内存位置相关的信息。(4)段表数据PE文件的真正程序部分存储在段数据中。在PE结构中,有若干个节表,对应着若干个节表的数据。根据节表的属性、地址等信息,将程序的数据分布在节表指定的位置。