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