體驗修改PE檔案的樂趣

2022-09-22 19:51:11 字數 2104 閱讀 7560

文/圖 牛淵                 

我們大家都知道,在windows 9x、nt、2000下,所有的可執行檔案都是基於microsoft設計的一種新的檔案格式portable executable file format(可移植的執行體),即pe格式。有一些時候,我們需要對這些可執行檔案進行修改,下面文字試圖詳細的描述pe檔案的格式及對pe格式檔案的修改。

pe檔案框架構成

dos mz header

dos stub

pe header

section table

section 1

section 2

section...

section n

上表是pe檔案結構的總體層次分布。所有 pe檔案(甚至32位的 dlls) 必須以乙個簡單的 dos mz header開始,在偏移0處有dos下可執行檔案的「mz標誌」,有了它,一旦程式在dos下執行,dos就能識別出這是有效的執行體,然後執行緊隨mz header之後的dos stub。緊接著dos stub的是pe header。pe header是pe相關結構image_nt_headers的簡稱,其中包含了許多pe裝載器用到的重要域。可執行檔案在支援pe檔案結構的作業系統中執行時,pe裝載器將從dos mz header的偏移3ch處找到pe header的起始偏移量。因而跳過了dos stub直接定位到真正的檔案頭pe header。

小知識:dos stub實際上是個有效的exe,在不支援pe檔案格式的作業系統中,它將簡單顯示乙個錯誤提示,類似於字串「this program cannot run in dos mode」或者程式設計師可根據自己的意圖實現完整的dos**。通常dos stub由彙編器/編譯器自動生成,對我們的用處不是很大,它簡單呼叫中斷21h服務9來顯示字串「this program cannot run in dos mode」。

pe檔案的真正內容劃分成塊,稱之為sections(節)。每節是一塊擁有共同屬性的資料,比如「.text」節等,那麼,每一節的內容都是什麼呢?實際上pe格式的檔案把具有相同屬性的內容放入同乙個節中,而不必關心類似「.text」、「.data」的命名,其命名只是為了便於識別,所有,我們如果對pe格式的檔案進行修改,理論上講可以寫入任何乙個節內,並調整此節的屬性就可以了。

pe header 接下來的陣列結構section table(節表)。每個結構包含對應節的屬性、檔案偏移量、虛擬偏移量等。如果pe檔案裡有5個節,那麼此結構陣列內就有5個成員。

以上就是pe檔案格式的物理分布,下面將總結一下裝載一pe檔案的主要步驟:

1.pe檔案被執行,pe裝載器檢查dos mz header裡的pe header偏移量。如果找到,則跳轉到pe header。

2.pe裝載器檢查pe header的有效性。如果有效,就跳轉到pe header的尾部。

3.緊跟 pe header的是節表。pe裝載器讀取其中的節資訊,並採用檔案對映方法將這些節對映到記憶體,同時附上節表裡指定的節屬性。

4.pe檔案對映入記憶體後,pe裝載器將處理pe檔案中類似import table(引入表)邏輯部分。

pe檔案頭定義

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

typedef struct _image_nt_headers image_nt_headers32, *pimage_nt_headers32;

typedef struct _image_file_header image_file_header, *pimage_file_header;

typedef struct _image_optional_header image_optional_header32, *pimage_optional_header32;

typedef struct _image_data_directory image_data_directory, *pimage_data_directory;

pe檔案頭後是節表,在winnt.h下如下定義

typedef struct _image_section_header misc;

dword   virtualaddress;        //rva

dword   sizeofrawdata;        //物理長度<

Dll注入 修改PE檔案頭

dll注入,除了常見的遠執行緒注入,掛鉤和修改登錄檔以外還可以通過修改pe檔案頭來達到注入目的,廢話少說先上菜。pe檔案經常會呼叫外部dll檔案,而需要呼叫的dll檔案都會在pe檔案說明,通過 nt頭 可選頭 匯入表 可以找到匯入表,而匯入表就是對需要匯入的每個dll的說明,它實際上是乙個20個位元...

通過修改PE檔案匯入DLL

圖1由上圖我們可以得到以下資訊 idt的rva資訊在檔案偏移160h處,值為84cc idt的大小資訊在檔案偏移164h處,值為64h 1.1轉到idt處檢視具體資訊 轉到84cc也就是檔案偏移76cc 共有5個iid結構體 每個iid20個位元組,對應乙個dll相關資訊 最後乙個iid為null ...

修改PE檔案頭刪除ASLR

windows核心6.0版本之後增設了alsr address space layout randomization 機制,使得每次pe檔案記載到虛擬記憶體的起始位址不一樣,而且棧和堆起始位址也不一樣.熟知pe檔案頭格式的逆向玩家,可以通過修改乙個標誌位來達到刪除編譯好的可執行檔案的aslr功能.p...