windows 將程式的各種介面定義為資源,包括加速鍵(accelerator)、位圖(bitmap)、游標(cursor)、對話方塊(dialog box)、圖示(icon)、選單(menu)、串表(string table)、工具欄(*******)和版本資訊(version information)等。
資源有很多種型別,每種型別的資源中可能存在多個資源項,這些資源項用不同的id 或者名稱來區分。但是要將這麼多種型別的不同id 的資源有序地組織起來是一件非常痛苦的事情,因此,我們採取類似於磁碟目錄結構的方式儲存。
pe 檔案中的資源是按照資源型別 -> 資源id -> 資源**頁的3層樹型目錄結構來組織資源的,通過層層索引才能夠進入相應的子目錄找到正確的資源。
資源目錄結構:
數 據目錄表中的 image_directory_entry_resource 條目(第三項)包含資源的 rva 和大小。資源目錄結構中的每乙個節點都是由 image_resource_directory 結構和緊跟其後的數個image_resource_directory_entry 結構組成的。
我們再來看這張圖:
image_resource_directory struct 【資源表位於資料目錄表的第三項,共動態分配位元組,其中結構體中的成員指出的rva偏移量都是對於此結構體的位址作為基位址】後面緊接著乙個結構體,個數由上個結構指出:;image_resource_directory ends
image_resource_directory_entry structname字段完全是個百變精靈,改欄位定義的是目錄項的名稱或id。;image_resource_directory_entry ends
當結構用於
第一層目錄時,定義的是資源型別;
當結構定義於第二層目錄時,定義的是資源的名稱;
當結構用於第三層目錄時,定義的是**頁編號。
注意:
當最高位為 0 的時候,表示欄位的值作為 id 使用;
而最高位為 1 的時候,欄位的低位作為指標使用(資源名稱字串是使用 unicode編碼),但是這個指標不是直接指向字串,而是指向乙個image_resource_dir_string_u 結構的。
子結構體一:
image_resource_dir_string_u structoffsetofdata欄位是乙個指標,;image_resource_dir_string_u ends
當最高位為 0 時,指標指向 image_resource_data_entry 結構。
注意:將 name 和 offsettodata 用做指標時需要注意,該指標是從資源區塊開始的地方算起的偏移量(即根目錄的起始位置的偏移量),不是我們習慣的 rva 哦。
最後,在上圖中我們看到,在第一層的時候,image_resource_directory_entry 的name 字段作為資源型別使用。
具體型別匹配見下表:
經 過三層 iamge_resource_directory_entry (一般是3層,偶爾少一些。第一層資源型別,第二層資源名,第三層是資源的 language),第三層目錄結構中的 offsetofdata 指向 image_resource_data_entry 結構。該結構描述了資源資料的位置和大小,定義如下:
子結構體二:
image_resource_data_entry struct此處的 image_resource_data_entry 結構就是真正的資源資料了。結構中的offsetofdata 指向資源資料的指標,其為 rva 值;image_resource_data_entry ends
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匯入表
pe檔案結構詳解 二 可執行檔案頭的最後展示了乙個陣列,pe檔案結構詳解 三 pe匯出表中解釋了其中第一項的格式,本篇文章來揭示這個陣列中的第二項 image directory entry import,即匯入表。也許大家注意到過,在image data directory中,有幾項的名字都和匯入...