網絡安全編程:PE文件結構概述
PE結構是Windows下可執行文件的標準結構,可執行文件的裝載、內存分布、執行等都依賴于PE結構,而在逆向分析軟件時,為了有目的、更高效地了解程序,必須掌握PE結構。
PE(Portable Executable),即可移植的執行體。在Windows平臺(包括Win 9x、Win NT、Win CE……)下,所有的可執行文件(包括EXE文件、DLL文件、SYS文件、OCX文件、COM文件……)均使用PE文件結構。這些使用PE文件結構的可執行文件也稱為PE文件。
普通的程序員也許沒有必要掌握PE文件結構,因為其大多是開發服務性、決策性、輔助性的軟件,比如MIS、HIS、CRM等軟件。但是對于學習黑客編程和學習安全編程的Hacker、Cracker和Programmer的人而言,掌握PE文件結構的知識就非常重要了。
1. PE文件結構全貌
Windows系統下的可執行文件中包含著各種數據,包括代碼、數據、資源等。雖然Windows系統下的可執行文件中包含著如此眾多類型的數據,但是其存放都是有序、結構化的,這完全依賴于PE文件結構對各種數據的管理。同樣,PE結構是由若干個復雜的結構體組合而成的,不是單單的一個結構體那么簡單,它的結構就像文件系統的結構是由多個結構體組成的。
PE結構包含的結構體有DOS頭、PE標識、文件頭、可選頭、目錄結構、節表等。要掌握PE結構必須對PE結構有一個整體上的認識,要知道PE結構分為哪些部分,這些部分大概是起什么作用的。有了宏觀上的概念以后,就可以深入地對PE結構的各個結構體進行細致的學習了。下面給出一張圖,讓大家對PE結構有個大概的了解,如圖1所示。
圖1 PE結構總覽圖
從圖1中可以看出,PE結構分為4大部分,其中每個部分又進行了細分,存在若干個小的部分。從數據管理的角度來看,可以把PE文件大致分為兩部分,DOS頭、PE頭和節表屬于PE文件的數據管理結構或數據組織結構部分,而節表數據才是PE文件真正的數據部分,其中包含著代碼、數據、資源等內容。
在進行逆向分析時,是對其代碼、數據、資源等具體數據進行分析,也就是圖1的“節表數據”部分。程序在內存中或文件中的組織結構是如何規劃的,并沒有去具體了解,而這部分內容正是圖1的上面3部分內容。
2. PE結構各部分簡介
根據圖1給出的PE結構總覽圖先來大致了解一下每部分的作用。
(1)DOS頭
DOS頭分為兩部分,分別是“MZ頭部”和“DOS存根”。MZ頭部是真正的DOS頭部,由于其開始處的兩個字節為“MZ”,因此DOS頭也可以叫作MZ頭。該部分用于程序在DOS系統下加載,它的結構被定義為IMAGE_DOS_HEADER。
DOS殘留是一段簡單的程序,主要用于輸出“This program cannot be run in DOS mode.”類似的提示字符串。
為什么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_OPTIO NAL_HEADER三部分。PE頭部在PE文件中的位置不是固定不變的,PE頭部的位置由DOS頭部的某個字段給出。
(3)節表
程序的組織按照各屬性的不同而被保存在不同的節中,在PE頭部之后就是一個數組結構的節表。描述節表的結構體是IMAGE_SECTION_HEADER,如果PE文件中有N個節,那么節表就是由N個IMAGE_SECTION_HEADER組成的數組。節表中存儲了各個節的屬性、文件位置、內存位置等相關的信息。
(4)節表數據
PE文件的真正程序部分就保存在節數據中。在PE結構中,有幾個節表,就對應有幾個節表的數據。根據節表的屬性、地址等信息,程序的數據就分布在節表指定的位置中。