认识PE文件
?
?Windows下的EXE可執(zhí)行文件都是屬于PE格式。PE是英文Portable Executable的縮寫,它是一種針對于微軟Windows NT、Windows 95和Win32系統(tǒng),由微軟公司設(shè)計(jì)的可執(zhí)行的二進(jìn)制文件格式,EXE、DLL都是屬于PE格式的文件。
?
下面是一個(gè)PE文件結(jié)構(gòu)的圖
?
?
?
DOS MZ Header
??? 所有 PE文件(甚至32位的DLLs)必須以簡單的DOS MZ header開始,它是一個(gè)IMAGE_DOS_HEADER結(jié)構(gòu)。有了它,一旦程序在DOS下執(zhí)行,DOS就能識別出這是有效的執(zhí)行體,然后運(yùn)行緊隨MZ Header之后的DOS Stub。
?
??? DOS Stub?
DOS Stub實(shí)際上是個(gè)有效的EXE,在不支持PE文件格式的操作系統(tǒng)中,它將簡單顯示一個(gè)錯(cuò)誤提示,類似于字符串“This program requires Windows”或者程序員可根據(jù)自己的意圖實(shí)現(xiàn)完整的DOS代碼。大多數(shù)情況下DOS Stub由匯編器/編譯器自動(dòng)生成。
?
PE Header
???? 緊接著DOS Stub的是PE Header。它是一個(gè)IMAGE_NT_HEADERS結(jié)構(gòu)。其中包含了很多PE文件被載入內(nèi)存時(shí)需要用到的重要域。執(zhí)行體在支持PE文件結(jié)構(gòu)的操作系統(tǒng)中執(zhí)行時(shí),PE裝載器將從DOS MZ header中找到PE header的起始偏移量。因而跳過DOS Stub直接定位到真正的文件頭 PE header。
?
Section Table
??? PE Header之后是數(shù)組結(jié)構(gòu)Section Table(節(jié)表)。如果PE文件里有5個(gè)節(jié),那么此Section Table結(jié)構(gòu)數(shù)組內(nèi)就有5個(gè)(IMAGE_SECTION_HEADER)成員,每個(gè)成員包含對應(yīng)節(jié)的屬性、文件偏移量、虛擬偏移量等。排在節(jié)表中的最前面的第一個(gè)默認(rèn)成員是text,即代碼節(jié)頭。通過遍歷查找方法可以找到其他節(jié)表成員(節(jié)表頭)。
?
Sections
??? PE文件的真正內(nèi)容劃分成塊,稱為Sections(節(jié))。每個(gè)標(biāo)準(zhǔn)節(jié)的名字均以圓點(diǎn)開頭,但也可以不以圓點(diǎn)開頭,節(jié)名的最大長度為8個(gè)字節(jié)。Sections是以其起始位址來排列,而不是以其字母次序來排列。通過節(jié)表提供的信息,可以找到這些節(jié)。程序的代碼,資源等就放在這些節(jié)中。
??? 節(jié)的劃分是基于各組數(shù)據(jù)的共同屬性,而不是邏輯概念。每節(jié)是一塊擁有共同屬性的數(shù)據(jù),比如代碼/數(shù)據(jù)、讀/寫等。如果PE文件中的數(shù)據(jù)/代碼擁有相同屬性,它們就能被歸入同一節(jié)中。節(jié)名稱僅僅是個(gè)區(qū)別不同節(jié)的符號而已,類似“data”,“code”的命名只為了便于識別,唯有節(jié)的屬性設(shè)置決定了節(jié)的特性和功能。
總結(jié)
- 上一篇: ADO连接ACCESS数据库
- 下一篇: MS-DOS头部