PE檔案詳解(九)

2021-07-29 09:01:52 字數 3032 閱讀 9564

我們知道,windows 將程式的各種介面定義為資源,包括加速鍵(accelerator)、位圖(bitmap)、游標(cursor)、對話方塊(dialog box)、圖示(icon)、選單(menu)、串表(string table)、工具欄(*******)和版本資訊(version information)等。

為了吸引大家的興趣和目光,咱先來做個學前試驗,然後再憧憬一下我們將來學習的內容有啥意義!好,小甲魚先來演示一下如何用工具來修改資源實現漢化、改圖示等,接著我們進一步從原理上來解剖 pe檔案如何對資源進行存放和索引。最後,在 pe系列章節講解完畢後,小甲魚和大家將所有學到的知識結合在一起,我們自己打造屬於我們的個性 pe工具。

資源是pe 檔案中非常重要的部分,幾乎所有的pe 檔案中都包含著資源,與匯入表和匯出表相比,資源的組織方式要複雜很多,其實我們只要看下圖就知道俺所言不虛。

我們知道我們的資源有很多種型別,每種型別的資源中可能存在多個資源項,這些資源項用不同的id 或者名稱來區分。但是要將這麼多種型別的不同id 的資源有序地組織起來是一件非常痛苦的事情,因此,我們採取類似於磁碟目錄結構的方式儲存。

從圖中我們可以看到,pe 檔案中的資源是按照 資源型別 -> 資源id -> 資源**頁的3層樹型目錄結構來組織資源的,通過層層索引才能夠進入相應的子目錄找到正確的資源。

資料目錄表中的 image_directory_entry_resource 條目(第三項)包含資源的 rva 和大小。資源目錄結構中的每乙個節點都是由 image_resource_directory 結構和緊跟其後的數個image_resource_directory_entry 結構組成的。(是不是有點像我們之前提到的檔案目錄?資料夾每個都長得一樣,乙個巢狀另乙個,這樣子可以實現將非常複雜的資料細化切分,小澤瑪利亞、蒼井空、吉澤明步、松島楓……)

我們再來看這張圖:

認識了這層關係後,我們來看下 image_resource_directory 這個結構,該結構長度為 16 位元組,共有 6 個字段,定義如下:

image_resource_directory struct

characteristics dword ? ;理論上為資源的屬性,不過事實上總是0

timedatestamp dword ? ;資源的產生時刻

majorversion word ? ;理論上為資源的版本,不過事實上總是0

minorversion word ?

numberofnamedentries word ? ;以名稱(字串)命名的入口數量

numberofidentries word ? ;以id(整型數字)命名的入口數量

image_resource_directory ends

其實在這裡邊我們唯一要注意的就是 nameberofnamedentries 和 numberofidentries,它們說明了本目錄中目錄項的數量。兩者加起來就是本目錄中的目錄項總和。也就是後邊跟著的image_resource_directory_entry 數目。

image_resource_directory_entry 緊跟在資源目錄結構後,此結構長度為 8 個位元組,包含 2 個字段。該結構定義如下:

image_resource_directory_entry struct

name dword ? ;目錄項的名稱字串指標或id

offsettodata dword ? ;目錄項指標

image_resource_directory_entry ends

name 字段完全是個百變精靈,改欄位定義的是目錄項的名稱或id。當結構用於第一層目錄時,定義的是資源型別;當結構定義於第二層目錄時,定義的是資源的名稱;當結構用於第三層目錄時,定義的是**頁編號。

注意:當最高位為 0 的時候,表示欄位的值作為 id 使用;而最高位為 1 的時候,欄位的低位作為指標使用(資源名稱字串是使用 unicode編碼),但是這個指標不是直接指向字串哦,而是指向乙個 image_resource_dir_string_u 結構的。

該結構定義如下:

image_resource_dir_string_u struct

length dword ? ; 字串的長度

namestring dword ? ; unicode字串,由於字串是不定長的。由length 制定長度

image_resource_dir_string_u ends

注意:將 name 和 offsettodata 用做指標時需要注意,該指標是從資源區塊開始的地方算起的偏移量(即根目錄的起始位置的偏移量),不是我們習慣的 rva 哦。

最後,在上圖中我們看到,在第一層的時候,image_resource_directory_entry的name 字段作為資源型別使用。

具體型別匹配見下表:

經過三層 iamge_resource_directory_entry (一般是3層,偶爾更年期少一些。第一層資源型別,第二層資源名,第三層是資源的 language),第三層目錄結構中的 offsetofdata 指向 image_resource_data_entry 結構。該結構描述了資源資料的位置和大小,定義如下:

image_resource_data_entry struct

offsettodata dword ? ; 資源資料的rva

size dword ? ; 資源資料的長度

codepage dword ? ; **頁, 一般為0

reserved dword ? ; 保留字段

image_resource_data_entry ends

千山萬水,此處的 image_resource_data_entry 結構就是真正的資源資料了。結構中的offsetofdata 指向資源資料的指標,其為 rva 值。

PE檔案詳解九 資源結構體

windows 將程式的各種介面定義為資源,包括加速鍵 accelerator 位圖 bitmap 游標 cursor 對話方塊 dialog box 圖示 icon 選單 menu 串表 string table 工具欄 和版本資訊 version information 等。資源有很多種型別,每...

PE檔案詳解九 資源結構體

windows 將程式的各種介面定義為資源,包括加速鍵 accelerator 位圖 bitmap 游標 cursor 對話方塊 dialog box 圖示 icon 選單 menu 串表 string table 工具欄 和版本資訊 version information 等。資源有很多種型別,每...

詳解PE檔案

筆者在某安全公司實習,第一天被要求了解pe結構,好吧,因為基礎不紮實,經過一天的時間了解的啥都不是,受到了導師的特殊關照,推薦了我一本沒推薦給別人的書 windows32位匯程式設計序 羅雲彬著 嘿嘿,匿名感謝導師,清明三天的pe之旅。1.1pe檔案的結構 pe就是在windows下最常用的可執行檔...