PE檔案格式

2021-05-21 13:43:02 字數 3770 閱讀 9774

pe 的意思是 portable executable(可移植的執行體)。它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff(common object file format)檔案格式。「portable executable」(可移植的執行體)意味著此檔案格式是跨win32平台的;即使windows執行在非intel的cpu上,任何win32平台的pe裝載器都能識別和使用該檔案格式。

pe檔案在檔案系統中,與存貯在磁碟上的其它檔案一樣,都是二進位制資料,對於作業系統來講,可以認為是特定資訊的乙個載體,如果要讓計算機系統執行某程式,則程式檔案的載體必須符合某種特定的格式。要分析特定資訊載體的格式,要求分析人員有資料分析、編碼分析的能力。在win32系統中,pe檔案可以認為.exe、.dll、.sys 、.scr型別的檔案,這些檔案在磁碟上存貯的格式都是有一定規律的。

一、pe格式基礎

下表列出了pe的總體結構

dos mz headerdos stubpe headersection tablesection 1section 2…section n

乙個完整的pe檔案,前五項是必定要有的,如果缺少或者資料出錯,系統會拒絕執行該檔案如下圖

圖1 檔案頭格式錯誤 

圖2 格式資料錯誤

圖3 **錯誤

dos stub 部分是dos插樁**,是dos下的16位程式**,只是為了顯示上面的提示資料。這段**是編譯器在程式編譯過程中自動新增的。

pe header 是真正的win32程式的格式頭部,其中包括了pe格式的各種資訊,指導系統如何裝載和執行此程式**。

section table部分是pe**和資料的結構資料,指示裝載系統**段在**,資料段在**等。對於不同的pe檔案,設計者可能要求該檔案包括不同的資料的section。所以有乙個section table 作為索引。section多少可以根據實際情況而不同。但至少要有乙個section。如果乙個程式連**都沒有,那麼他也不能稱為可執行**。在section table後,section數目的多少是不定的。

二、程式的裝入

當我們在explorer.exe(資源管理器)中雙擊某檔案,執行乙個可執行程式,系統會根據副檔名啟動乙個程式裝載器,稱之為loader。loader會首先檢查dos mz header,如果存在,就繼續尋找pe header,如果這兩項都不存在,就認為是dos 16位**,如果只存在dos mz header,而其中又指示了而其中又指示了pe header 的位置,那麼loader 就判定此檔案不乙個有效的pe檔案,拒絕執行。

如果dos header 和pe header都正常有效,那麼loader就會根據pe header 及section table的指示,將相應的**和資料對映到記憶體中,然後根據不同的section進行資料的初始化,最後開始執行程式段**。

三、pe格式高階分析

下面我們以乙個真實的程式為例詳細分析pe格式,分析pe格式最好有pe分析器,常用的軟體是lord pe,也有其它的分析工具和軟體如pe editor 、stud pe等。

先分析一下磁碟檔案的內容,這裡我們使用ultraedit32(ue)工具,這是乙個實用的檔案編輯器,可以編輯文字和二進位制檔案。

圖4 pe檔案開始的磁碟資料

在檔案的一開始有兩位16進製制資料4d 5a,其對應的ascii字元是mz,這個標誌就是dos mz header 的標誌。下面是通過load pe列出 的dos mz header

1. dos header

資料結構名稱

值e_magic:

0x5a4d->『mz』

e_cblp:

0x0090

e_cp:

0x0003

e_crlc:

0x0000

e_cparhdr:

0x0004

e_minalloc:

0x0000

e_maxalloc:

0xffff

e_ss:

0x0000

e_sp:

0x00b8

e_csum:

0x0000

e_ip:

0x0000

e_cs:

0x0000

e_lfarlc:

0x0040

e_ovno:

0x0000

e_res:

0x0000000000000000

e_oemid:

0x0000

e_oeminfo:

0x0000

e_res2:

0x0000000000000000000000000000000000000000

e_lfanew:

0x000000f8

這是乙個pe檔案的dos header,其中我們最關心的就是e_lfanew這個欄位的值,它指向了pe header 在磁碟檔案中相對於檔案開始的偏移位址,這裡是f8。在本檔案00f8h處果然找到了「pe」兩個字元,那麼在00f8h處就是pe header 的有效頭載荷。

2. pe header

我們可以在winnt.h這個檔案中找到關於pe檔案頭的定義:

typedef struct _image_nt_headers image_nt_headers32, *pimage_nt_headers32;

2.1 image_file_header和image_optional_header

typedef struct _image_file_header image_file_header, *pimage_file_header;重要的 characteristics值#define image_file_relocs_stripped 0001h // 檔案中是否存在重定位資訊#define image_file_executable_image 0002h // 檔案是可執行的#define image_file_large_address_aware 0020h // 程式可以觸及大於2g的位址#define image_file_bytes_reversed_lo 0080h // 保留的機器型別低位#define image_file_32bit_machine 0100h // 32位機器#define image_file_removable_run_from_swap 0400h // 不可在可移動介質上執行#define image_file_net_run_from_swap 0800h // 不可在網路上執行#define image_file_system 1000h // 系統檔案#define image_file_dll 2000h // 檔案是乙個dll#define image_file_up_system_only 4000h // 只能在單處理器計算機上執行#define image_file_bytes_reversed_hi 8000h //保留的機器型別高位

typedef struct _image_optional_headerimage_optional_header32, *pimage_optional_header32;

2.2 image_data_directory

typedef struct _image_data_directory image_data_directory, *pimage_data_directory;

圖5 load pe 讀取的pe header 的重要部分資料

圖6 subsystem 型別 

圖7 load pe 讀取的image_data_directory 資訊

在image_optional_header32後部一般是16項image_data_directory資料,其中最後一項是保留資料。每一項資料都有其固定的含義,並且位置不可改變。

PE檔案格式

pe檔案格式分析及修改 圖 1 2009 01 09 14 08 pe 的意思是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff common object file format 檔案格式。portable ...

PE檔案格式

pe檔案格式應用於所有32位windows系統 windows 9x,windows nt,windows 2000及windows xp vista已經對pe格式進行了公升級,也出現了pe64 而在msdn 98中有pe的大量詳細資料 按目錄 msdn library visual studio ...

PE檔案格式

0x00 概述 pe檔案格式把可執行檔案分成若干個資料節 section 不同的資源被存放在不同的節中。乙個典型的pe檔案中包含的節如下 text 由編譯器產生,存放二進位制的機器 也是我們反彙編和除錯的物件 data 初始化的資料塊,如巨集定義 全域性變數 靜態變數等 idata 可執行檔案所使用...