PE 的意思是 Portable Executable(可移植的執行體)。它是 Win32環境自身所帶的執行文件格式。它的一些特性繼承自Unix的Coff(common object file format)文件格式。“Portable Executable”(可移植的執行體)意味著此文件格式是跨Win32平臺的;即使Windows運行在非Intel的CPU上,任何win32平臺的PE裝載器都能識別和使用該文件格式。
PE文件在文件系統中,與存貯在磁盤上的其它文件一樣,都是二進制數據,對于操作系統來講,可以認為是特定信息的一個載體,如果要讓計算機系統執行某程序,則程序文件的載體必須符合某種特定的格式。要分析特定信息載體的格式,要求分析人員有數據分析、編碼分析的能力。在Win32系統中,PE文件可以認為.exe、.dll、.sys 、.scr類型的文件,這些文件在磁盤上存貯的格式都是有一定規律的。
一、PE格式基礎
下表列出了PE的總體結構
|
一個完整的PE文件,前五項是必定要有的,如果缺少或者數據出錯,系統會拒絕執行該文件如下圖
![]() |
圖1 文件頭格式錯誤 |
![]() |
圖2 格式數據錯誤 |
![]() |
圖3 代碼錯誤 |
DOS MZ header部分是DOS時代遺留的產物,是PE文件的一個遺傳基因,一個Win32程序如果在DOS下也是可以執行,只是提示:“This program cannot be run in DOS mode.”然后就結束執行,提示執行者,這個程序要在Win32系統下執行。
DOS stub 部分是DOS插樁代碼,是DOS下的16位程序代碼,只是為了顯示上面的提示數據。這段代碼是編譯器在程序編譯過程中自動添加的。
PE header 是真正的Win32程序的格式頭部,其中包括了PE格式的各種信息,指導系統如何裝載和執行此程序代碼。
Section table部分是PE代碼和數據的結構數據,指示裝載系統代碼段在哪里,數據段在哪里等。對于不同的PE文件,設計者可能要求該文件包括不同的數據的Section。所以有一個Section Table 作為索引。Section多少可以根據實際情況而不同。但至少要有一個Section。如果一個程序連代碼都沒有,那么他也不能稱為可執行代碼。在Section Table后,Section數目的多少是不定的。
二、程序的裝入
當我們在explorer.exe(資源管理器)中雙擊某文件,執行一個可執行程序,系統會根據文件擴展名啟動一個程序裝載器,稱之為Loader。Loader會首先檢查DOS MZ Header,如果存在,就繼續尋找PE header,如果這兩項都不存在,就認為是DOS 16位代碼,如果只存在DOS MZ Header,而其中又指示了而其中又指示了PE Header 的位置,那么Loader 就判定此文件不一個有效的PE文件,拒絕執行。
如果DOS Header 和PE Header都正常有效,那么Loader就會根據PE Header 及Section Table的指示,將相應的代碼和數據映射到內存中,然后根據不同的Section進行數據的初始化,最后開始執行程序段代碼。
共4頁: 1 [2] [3] [4] 下一頁 | ||||||
|