概述
基本結構
DOS-stub(DOS-頭)
DOS-根的概念很早從16位
windows的
執行檔(當時是“
NE”格式)時就廣為人知了。根原來是用於OS/2系統的執行檔的,也用於自解壓檔案檔案和其它的應用程式。對於PE檔案來說,它是一個總是由大約100個位元組所組成的和
MS-DOS 2.0兼容的可執行體,用來輸出像“This program needs windows NT”之類的錯誤信息。
你可以通過確認DOS-頭部分是否為一個IMAGE_DOS_HEADER(DOS頭)結構來認出DOS-根,它的前兩個位元組必須為連續的兩個字母“MZ”(有一個#define IMAGE_DOS_SIGNATURE的定義是針對這個WORD單元的)。
你可以通過跟在後面的簽名來將一個PE二進制檔案和其它含有根的二進制檔案區分開來,跟在後面的簽名可由頭成員'e_lfanew'(它是從位元組偏移地址60處開始的,有32位元組長)所設定的偏移地址找到。對於OS/2系統和Windows系統的二進制檔案來說,簽名是一個16位的word單元;對於PE檔案來說,它是一個按照8位位元組邊界對齊的32位的longword單元,並且IMAGE_NT_SIGNATURE(NT簽名)的值已由#defined定義為0x00004550(即字母“PE/0/0”)。
file-header(檔案頭)
要到達IMAGE_FILE_HEADER(檔案頭)結構,請先確認DOS-頭“MZ”(起始的2個位元組),然後找出DOS-根的頭部的成員“e_lfanew”,並從檔案開始處跳過那么多的位元組。在核實你在那裡找到的簽名後,IMAGE_FILE_HEADER(檔案頭)結構的檔案頭就緊跟其後開始了。
optional header(可選頭)
緊跟在檔案頭後面的就是IMAGE_OPTIONAL_HEADER(儘管它名叫“可選頭”,它卻一直都在那裡)。它包含有怎樣去準確處理PE檔案的信息。
data directories(數據目錄)
IMAGE_NUMBEROF_DIRECTORY_ENTRIES (16)(映象檔案目錄項數目)個
IMAGE_DATA_DIRECTORY(映象檔案數據目錄)數組。這些目錄中的每一個目錄都描述了一個特定的、位於目錄項後面的某一節中的信息的位置(32位的RVA,叫“VirtualAddress(虛擬地址)”)和大小(也是32位,叫“Size(大小)”)。
例如,安全目錄能在索引4中給定的RVA處發現並具有索引4中給定的大小。
section headers(節頭)
節由兩個主要部分組成:首先,是一個節描述(IMAGE_SECTION_HEADER[意為“節頭”]類型的),然後是原始的節數據。因此,我們會在數據目錄後發現一“NumberOfSections”個節頭組成的數組,它們按照各節的
RVA排序。
sections(節數據)
所有的節在載入記憶體後都按“SectionAlignment”(節對齊)對齊,在檔案中則以“FileAlignment”(檔案對齊)對齊。節由節頭中的相關項來描述:在檔案中你可通過“PointerToRawData”(原始數據指針)來找到,在記憶體中你可通過“VirtualAddress”(虛擬地址)來找到;長度由“SizeOfRawData”(原始數據長度)決定。
根據節中包含的內容,可分為好幾種節。大多數(並非所有)情況下,節中至少由一個數據目錄,並在可選頭的數據目錄數組中有一個指針指向它。