PE檔案解析之資源表解析

2021-09-04 04:19:08 字數 2268 閱讀 5881

根據pe檔案格式我們可以快速找到目錄表陣列位置,在目錄表陣列中我們可以找到資源表在**

我們看出資源表位置為0x4000,大小為0xb20。

資源表所對應資料結構為image_resource_directory

typedef

struct

_image_resource_directory image_resource_directory, *pimage_resource_directory;

其中,5. numberofnamedentries,重要字段,以字串命名的資源條目的數量;

6. numberofidentries,重要字段,以整數命名的資源條目的數量;

主要關注最後兩個字段:numberofnamedentries與numberofidentries,兩者加起來就是資源表根目錄下總的資源條目的數量。

typedef

struct

_image_resource_directory_entry image_resource_directory_entry, *pimage_resource_directory_entry;

該結構體占用8個位元組,結構體的成員的介紹如下:

1. name,這個字段擁有多個不同的含義:當irde位於第一層目錄時,name表示資源的型別;當irde位於第二層目錄時,name表示資源的名稱;當irde位於第三層目錄時,name表示**頁的編號。此外,還需要先判斷name的最高位是0還是1,如果是0則表示當做乙個值來使用,如果是1,則表示低31位當做指標來使用;

2. offsettodata,指標;當最高位為1時,表示低位資料指向下一層目錄;當最高位為0時,表示沒有下一層目錄,低位資料指向乙個image_resource_data_entry結構。

注意,當name和offsettodata當做指標使用時,其值並不是rva,而是表示相對於資源區塊起始位置的偏移值。

前面提到,當image_resource_directory_entry位於第一層目錄時,它的name欄位表示資源型別,系統預定義的資源型別如下圖所示:

image_resource_data_entry結構體在winnt.h標頭檔案中的定義如下:

typedef

struct

_image_resource_data_entry image_resource_data_entry, *pimage_resource_data_entry;      

image_resource_data_entry結構體成員的介紹如下:

1. offsettodata,這是乙個rva,指向真正的資源資料;

2. size,表示資源的大小;

3. codepage,**頁,一般為0;

4. reserved,保留字段,暫時沒有意義;

第一層

可以看出第一層有5個image_resource_directory_entry,我們選取第乙個講解

name為03,可知為圖示資源,offsettodata高位為1,可知下一層存在,偏移0x38,位於0x4038

可以看出第二層有2個image_resource_directory_entry,我們依舊選取第乙個講解

name為01,存在下一層,位於0x40c0

可以看出第三層有1個image_resource_directory_entry

這裡的name表示**頁的編號,offsettodata最高位為0,可知沒有下一層,且大小為0x168,我們在0x4168處找到image_resource_data_entry結構體

我們可以在0x41e0處找到該資源,大小為0x2e8

PE重定位表解析

在模組被載入到記憶體中,如果該模組沒有裝載到期待的位置,裡面以固定形式而不是以偏移形式硬編碼的位址就需要修正,這樣程式才能被正確載入。例如 call 401203。這個在編譯器編譯的時候將call後面的函式位址以硬編碼的形式固定住,那麼一旦模組不是被載入到40000的基址,而是被載入到100000,...

驅動中解析pe檔案之pdb

驅動中解析pe檔案的pdb,一切盡在 中,本部落格不負責科普,能立即用的 你都有了,標頭檔案 結構體 注釋都整理好你還想要啥?include include include ntimage.h define nb10 sig 01bn define rsds sig sdsr typedef str...

PE檔案解析 資源中的版本資訊結構

想要獲取乙個可執行檔案 pe檔案 裡包含的資源檔案,首先要解析可執行檔案,得到資源儲存的位址及大小,可參考 然後,根據資源儲存方式,得到各資源的資料內容及其大小,可參考 pe檔案的資源中,版本資訊的資源型別id 16。在rc檔案中,版本資訊的定義方式如下 vs version info versio...