PE知識總結(小甲魚教程)

一、PE的基本概念:

   1)PE文件中的數據結構一般都有32位 和 64位 之分,一般會在名稱上表現出來。

   2)PE文件使用的是一個平面地址空間,線性的,所有的代碼和數據合併在一起。

   3)文件的內容被劃分成區塊,以 頁邊界 對齊

   4)每個塊有自己在內存中的一套屬性——是否可讀 或 只讀。

   5)PE文件不是作爲單一內存映射文件被裝入內存

   6)Windows加載器(PE加載器)遍歷PE文件,決定文件的哪一部分被映射,這種映射方式是將文件較高的偏移位置映射到較高的內存地址中。

   7)當磁盤文件一旦被裝入內存中,磁盤上的數據結構佈局和內存中的數據結構佈局是一致的。

   8)基地址、相對虛擬地址、文件偏移地址

基地址   —— 在Windows NT上是模塊的句柄

虛擬地址 —— 某一虛擬地址相對基地址的偏移

偏移地址 —— 從0開始

    Ps:   分析PE,就是了解結構體的構造,成員,它們是怎麼存放,怎麼索引,我們就能瞭解什麼是PE感染、PE變位、如何僞裝PE、如何在PE文件里加入隱祕的東西,如何加密、解密。

 

二、MS-DOS頭部

每個PE文件是以一個DOS程序開始的,爲了適應在DOS下執行。

PE文件的第一個字節起始於一個傳統的MS-DOS頭部,被稱作IMAGE_DOS_HEADER(事實上它是一個結構體)

IMAGE_DOS_HEADER有兩個重要的結構體。

①e_magic      ;//MZ(4Dh 5Ah) DOS可執行文件標記

②e_lfanew     ;//32位指針 指向PE文件頭,這個成員相對於DOS的偏移永遠是3ch

 

三、PE文件頭

PE文件頭是PE相關結構NT映像頭(IMAGE_NT_HEADER)的簡稱,裏面包含着許多PE裝載器用到的重要字段。

程序在執行時,PE裝載器將從IMAGE_DOS_HEADER結構中的e_lfanew字段裏找到 PEHeader的起始偏移量,加上基地址就得到PE文件頭的指針。

IMAGE_NT_HEADER結構

①Signature   //在一個有效的PE文件裏,Signature字段被設置位00004550h,ASCII碼字符是“PE00”.標誌着PE文件頭的開始。

②IMAGE_FILE_HEADER    FileHeader  //

    1.WORD    Machine               ;//運行平臺    

     2.WORD    NumberOfSections      ;//文件的區塊數目

     3.DWORD   TimeDateStamp         ;//文件創建日期和時間(以秒來算,VC的話可以用_ctime函數 或者 gmtime函數)

     4.DWORD   PointerToSymbolTable  ;//指向符號表(主要用於調試)

     5.DWORD   NumberOfSymbols       ;//符號表中符號個數(主要用於調試)

     6.WORD SizeOfOptionalHeader  ;//IMAGE_OPTIONAL_HEADER32結構大小。

     7.WORD    Characteristics       ;//文件屬性

③IMAGE_OPTIONAL_HEADER32    OptionalHeader

https://www.cnblogs.com/kuangke/p/5393514.html

在這個結構體中需要注意的成員,這些值是文件運行必需的,設置錯誤將導致文件無法正常運行。

       1.Magic  爲IMAGE_OPTIONAL_HEADER32結構體是,Magic碼爲10B;爲IMAGE_OPTIONAL_HEADER64結構體時,Magic碼爲20B。

       2.AddressOfEntryPoint     持有EP的RVA值。該值指出程序最先執行的代碼起始地址。

       3.ImageBase     進程虛擬內存的範圍是0~FFFFFFFF(32位系統)。PE文件被加載到如此大的內存中時,ImageBase指出文件的優先裝入地址。

 

 

  4.SectionAlignment,FileAlignment     PE文件的Body部分劃分若干節區,這些節存儲着不同類別的數據。FileAlignment指定了節區在磁盤文件中的最小單位,而SectionAlignment則指定了節區在內存中的最小單位(一個文件中,FileAlignment和SectionAlignment的值可能相同,也可能不同)。磁盤文件或內存的節區大小必定位FileAlignment或SectionAlignment值的整數倍。

IMAGE_OPTIONAL_HEADER32成員1

9.DataDirectory是由IMAGE_DATA_DIRECTORY結構體組成的數組,最重要的字段之一,由16個相同的IMAGE_DATA_DIRECTORY結構體組成。其定義很簡單,只有兩個,僅僅指出了某種數據塊的位置和,其用途是用來定義多種不同用途的數據塊的位置和長度。例如導出表、導入表、資源、重定位表等數據塊。

IMAGE_DATA_DIRECTORY STRUCT

VirtualAddress    DWORD    ?    ;數據的起始RVA

isize    DWORD    ?    ;數據塊的長度

IMAGE_DATA_DIRECTORY end

圖片:數據目錄列表

 

 

四、塊表

1.PE文件到內存的映射

①系統裝載可執行文件的方法又不完全等同於內存映射文件。

②當使用內存映射文件的時候,系統對“原著”相當忠實。如果將磁盤文件和內存影響比較的話,可以發現不管是數據本身還是數據之間的相對位置都是完全相同的。

③Windows裝載器在裝載DOS部分、PE文件頭部分和節表(區塊表)部分是不進行任何特殊處理的,而在裝載節(區塊)的時候則會自動按節(區塊)的屬性做不同的處理。

一般情況下,它會處理以下幾個方面的內容:

內存頁的屬性

節的偏移地址

節的尺寸

不進行映射的節

處理內容詳解:

https://www.cnblogs.com/mayingkun/p/4200026.html

 

2.區塊表(節表)和 區塊(節)

https://www.cnblogs.com/kuangke/p/5406047.html

區塊是可執行文件真正保存內容的東西

 

3.區塊描述、對齊值以及RVA詳解

https://www.cnblogs.com/kuangke/p/5410643.html

 

PE類型的病毒是在執行PE文件的時候,先執行病毒代碼,再執行PE

 

4.輸入表(導入表)詳解

https://www.cnblogs.com/kuangke/p/5410650.html (上)

https://www.cnblogs.com/kuangke/p/5411547.html (下)

 

5.輸出表(導出表)詳解

https://www.cnblogs.com/kuangke/p/5419120.html

INT不可以改,IAT可以改

 

6.基址重定位

https://www.cnblogs.com/kuangke/p/5436807.html

 

7.資源

https://blog.csdn.net/dazhiliudazhi/article/details/24438623

 

當頁對齊和文件對齊一樣時,不需要轉換找地址。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章