天天看點

PE檔案結構功能和具體代碼參數分析

PE檔案結構:

介紹: PE格式是windows下最常用的可執行檔案格式,有些應用必須建立在了解PE檔案的基礎上,如可執行檔案的加解密、檔案型病毒的清除等。

分析PE檔案,必須要了解檔案是如何從磁盤被裝載到記憶體中去的。是以,讓我們先熟悉一下PE檔案的基本結構。

PE檔案結構功能和具體代碼參數分析

DOS_HEADER

介紹: 該結構體大小為40h位元組,e_magic辨別了頭部,e_lfanew指明PE檔案頭在檔案中的位置,這個位置以8位元組為機關對齊

PE檔案結構功能和具體代碼參數分析

NT_HEADER

介紹: 整個NT_HEADER結構體大小為F8,NT_HEADER結構包含了FILE_HEADER結構和OPTIONAL_HEADER32結構

PE檔案結構功能和具體代碼參數分析
  • FILE_HEADER結構
    PE檔案結構功能和具體代碼參數分析

其中 Characteristics字段:它的不同資料位(16位)定義了不同的檔案屬性,不同的定義影響系統對檔案的裝入方式;

當13位為1:表示這是DLL檔案,系統将使用調用DLL入口函數的方式調用檔案入口。對于普通可執行PE檔案,該字段值為010fh,對于DLL檔案來說,這個字段通常為210eh。

  • OPTIONAL_HEADER32結構
    PE檔案結構功能和具體代碼參數分析

    其中一些重要字段代表的含義:

    Address of entrypoint: 程式執行EP的RVA

    ImageBase:表示檔案的優先裝入位址。

    通常預設EXE(00400000h),DLL(10000000h)。若優先裝入位址被其他子產品使用,需要進行重定位操作,例如DLL檔案。

    FileAlignment: 節區存儲在硬碟檔案中時的最小機關

    SectionAlignment: 節區被裝入記憶體後的最小機關

    SizeofImage: 加載PE檔案到記憶體時,占用的虛拟記憶體空間大小

    data_directory結構體數組個數: 16

  • DATA_DIRECTORY結構
    PE檔案結構功能和具體代碼參數分析
    PE檔案結構功能和具體代碼參數分析
    各字段介紹:
    PE檔案結構功能和具體代碼參數分析

PE檔案到記憶體映射的幾個問題

  • 裝載PE檔案時,不同節區對應記憶體頁的屬性需要根據節的屬性來設定;
  • 節的起始位址在磁盤檔案中是按照FileAlignment字段的值對齊的;而被載入到記憶體中時,是按照Section Alignment字段的值對齊的
  • Windows系統中對記憶體屬性的設定是以頁為機關進行的,故節在記憶體中的對齊機關至少為一個頁的大小。對于win32,該值為4KB(1000h),對于win64,該值為8KB。磁盤檔案的對齊機關沒有限制,小于記憶體頁的對齊機關,通常FileAlignment為200h。
  • 節尺寸的處理:

    由于磁盤映像和記憶體映像在對齊機關上的差别,導緻節區長度變化;

    未初始化資料的節的處理,磁盤檔案未預留白間,裝載到記憶體時需要為其配置設定空間

  • 重定位資料.reloc節僅供windows裝載器使用,不會被映射到記憶體

節區頭(節表)

介紹: 節表定義了各節區的屬性,每一個節區由一個資料結構體描述,結構體總數等于節區總數

PE檔案結構功能和具體代碼參數分析

VirtulAddress: 對應節區在記憶體中的偏移位址(RVA)記憶體頁對齊,sectionaligment整數倍

SizeOfRawData: 節區在硬碟中所占大小,等于Virtualsize按照filealigment對齊後的大小

PointerToRawDate: 節區在硬碟檔案中的偏移量,從檔案頭算起

RVA 的計算

介紹: RVA,相對虛拟位址,是一個偏移量。PE檔案中大部分資料結構涉及的位址均用RVA表示。RVA是檔案加載到記憶體後,某個資料的位置相對于檔案頭的偏移量。

例如:某個PE檔案被加載到處的記憶體中,某個節區中某個資料被裝入0040xxxxh處,那麼該資料的RVA= 0040xxxxh- 00400000h=xxxxh

是以,RVA加上檔案被裝載的記憶體基位址,就等于資料在記憶體中的實際位址。

注意: RVA僅用于确定節中資料的位置,而對檔案頭和節表無意義

PE檔案結構功能和具體代碼參數分析

學習PE檔案格式核心是學習PE頭中的結構體

主要圍繞着以下四個問題來學:

  1. 檔案如何加載到記憶體
  2. 從何處開始運作
  3. 運作中需要哪些DLL
  4. 需要多大的棧/記憶體