PE檔案格式詳解(三)――DOS Header & PE Header

來源:互聯網
上載者:User

上一節中我們對PE檔案的各個部分的作用有了一個總體的認識,從這節起我們會對PE檔案的每個部分作更進一步的解釋,當然別忘記了上一節中我提出的兩個問題。

1.DOS MZ header 和 DOS Stub:

        所有 PE檔案(甚至32位的 DLLs) 必須以一個簡單的 DOS MZ header 開始。我們通常對此結構沒有太大興趣。有了它,一旦程式在DOS下執行,DOS就能識別出這是有效執行體,然後運行緊隨 MZ header 之後的 DOS stub。DOS stub實際上是個有效 EXE,在不支援 PE檔案格式的作業系統中,它將簡單顯示一個錯誤提示,類似於字串 "This program requires Windows" 或者程式員可根據自己的意圖實現完整的 DOS代碼。通常我們也不對 DOS stub 太感興趣: 因為大多數情況下它是由彙編器/編譯器自動產生。通常,它簡單調用中斷21h服務9來顯示字串"This program cannot run in DOS mode"。在Window95下運行32位程式的時候這個部分並不會被載入器映射的線性地址空間,當Win32 載入器把一個可攜式執行檔映像到記憶體,記憶體映像檔案(memory mapped file)的第一個位元組對應到DOS Stub 的第一個位元組。WINNT.H 為DOS stub 表頭DOS MZ header定義了一個結構,第一個域 e_magic ,被稱為魔術數字,它被用於表示一個MS-DOS相容的檔案類型,其作用類似於PE header中的Signature域,所有MS-DOS相容的可執行檔都將這個值設為0x5A4D,表示ASCII字元MZ。MS-DOS頭部之所以有的時候被稱為MZ頭部,就是這個緣故。還有許多其它的域對於MS-DOS作業系統來說都有用,但是對於Windows NT來說,這個結構中只有一個有用的域——最後一個域 e_lfnew ,PE頭部就是由它定位的。循此我們將非常容易找到PE頭部,它是一個相對位移值(或說是RVA),指向真正的PE頭部(PE header)。為了獲得指標,你必須為RVA 加上image 的基地址:

   pNTHeader = dosHeader + dosHeader->e_lfanew;

有了這個指向PE Header的指標我們就可以取得很多有用的資訊了,既然我們研究的是PE檔案格式,因此PE Header才是我們研究的重點。總之,DOS MZ header和 DOS Stub之間的關係相當於PE header和 EXE或者DLL之間的關係。

    2.PE Header:

         PE header 是PE相關結構 IMAGE_NT_HEADERS 的簡稱,其中包含了許多PE裝載器用到的重要域。當我們更加深入研究PE檔案格式後,將對這些重要域耳目能詳。執行體在支援PE檔案結構的作業系統中執行時,PE裝載器將從 DOS MZ header 中找到 PE header 的起始位移量。因而跳過了 DOS stub 直接定位到真正的檔案頭 PE header。PE頭部整個是個IMAGE_NT_HEADERS 結構,定義於WINNT.H。這個結構正是Windows 95 的module database(“模組”的概念在第一節中說過了,作業系統就是利用這個結構感知“模組”的存在、獲得“模組”的資訊等;這個結構我會在以後的“模組”學習當中提及)。每一個被載入的EXE 或DLL 都以一個IMAGE_NT_HEADERS 結構表現出來。此結構有一個DWORD 和兩個子結構:

DWORD Signature;

IMAGE_FILE_HEADER FileHeader;

IMAGE_OPTIONAL_HEADER OptionalHeader;

(1) 對於PE格式的檔案Signature 欄位內容應該是ASCII 的PE/0/0。

(2) IMAGE_FILE_HEADER FileHeader:

Field name

Meanings

Machine

該檔案運行所要求的CPU。對於Intel平台,該值是IMAGE_FILE_MACHINE_I386 (14Ch)。我們嘗試了LUEVELSMEYER的pe.txt聲明的14Dh和14Eh,但Windows不能正確執行。看起來,除了禁止程式執行之外,本域對我們來說用處不大。

NumberOfSections

檔案的節數目。如果我們要在檔案中增加或刪除一個節,就需要修改這個值。

TimeDateStamp

檔案建立日期和時間。我們不感興趣。

PointerToSymbolTable

用於調試。

NumberOfSymbols

用於調試。

SizeOfOptionalHeader

指示緊隨本結構之後的 OptionalHeader 結構大小,必須為有效值。

Characteristics

關於檔案資訊的標記,比如檔案是exe還是dll。

      IMAGE_FILE_HEADER結構比較簡單,也比較容易理解,在此不做過多的解釋;簡言之,只有三個域對我們有一些用: Machine, NumberOfSections 和 Characteristics。通常不會改變 Machine 和Characteristics 的值,但如果要遍曆節表就得使用 NumberOfSections。

(3)   比較複雜也更有趣的是第三個東東即:IMAGE_OPTIONAL_HEADER,現在我們學習 IMAGE_NT_HEADERS 中的最後成員optional header 結構,它包含了PE檔案的邏輯分布資訊。該結構共有31個域,一些是很關鍵,另一些不太常用。這裡只介紹那些真正有用的域。

Field

Meanings

AddressOfEntryPoint

PE裝載器準備啟動並執行PE檔案的第一個指令的RVA。若您要改變整個執行的流程,可以將該值指定到新的RVA,這樣新RVA處的指令首先被執行。

ImageBase

PE檔案的優先裝載地址。比如,如果該值是400000h,PE裝載器將嘗試把檔案裝到虛擬位址空間的400000h處。字眼"優先"表示若該地址地區已被其他模組佔用,那PE裝載器會選用其他空閑地址。

SectionAlignment

記憶體中節對齊的粒度。例如,如果該值是4096 (1000h),那麼每節的起始地址必須是4096的倍數。若第一節從401000h開始且大小是10個位元組,則下一節必定從402000h開始,即使401000h和402000h之間還有很多空間沒被使用。

FileAlignment

檔案中節對齊的粒度。例如,如果該值是(200h),,那麼每節的起始地址必須是512的倍數。若第一節從檔案位移量200h開始且大小是10個位元組,則下一節必定位於位移量400h: 即使位移量512和1024之間還有很多空間沒被使用/定義。

MajorSubsystemVersion
MinorSubsystemVersion

win32子系統版本。若PE檔案是專門為Win32設計的,該子系統版本必定是4.0否則對話方塊不會有3維立體感。

SizeOfImage

記憶體中整個PE映像體的尺寸。它是所有頭和節經過節對齊處理後的大小。

SizeOfHeaders

所有頭+節表的大小,也就等於檔案尺寸減去檔案中所有節的尺寸。可以以此值作為PE檔案第一節的檔案位移量。

Subsystem

NT用來識別PE檔案屬於哪個子系統。 對於大多數Win32程式,只有兩類值: Windows GUI 和 Windows CUI (控制台)。

SizeOfStackReserve

線程初始堆棧的保留大小。

SizeOfStackCommit

一開始即被提交(committed)給線程初始堆棧的記憶體數量。

SizeOfHeapReserve

保留給最初的process heap 的虛擬記憶體數量。

SizeOfHeapCommit

一開始即被提交(committed)給process heap 的記憶體數量。

DataDirectory

IMAGE_DATA_DIRECTORY 結構數組。每個結構給出一個重要資料結構的RVA,比如引入地址表等。

上面表格裡最難理解的也是很重要的一個域是最後一個,即:DataDirectory;它是一個結構數組,它一共包含16個元素即共含16個結構;每一個結構對應於一個section(注意這裡的section是按照第一節中按作用進行劃分的section,不是最終產生的PE檔案中包含的節),結構中的兩個域分別描述了該section的 RVA 和 SIZE; 這樣一來載入器就能夠通過這個數組迅速在image 中找到特定的section,後面講到的匯入表,引出表都要用到這個數組中相應的元素,到時候還會有進一步的解釋。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.