日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

25. PE结构-PE详解之资源

發(fā)布時(shí)間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 25. PE结构-PE详解之资源 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

資源結(jié)構(gòu)

資源是PE 文件中非常重要的部分,幾乎所有的PE 文件中都包含著資源,與導(dǎo)入表和導(dǎo)出表相比,資源的組織方式要復(fù)雜很多,其實(shí)我們只要看下圖就知道俺所言不虛。

分3級(jí):1 資源類型 ,2 資源ID, 3 資源代碼頁(yè), 4 最后指向資源

我們知道我們的資源有很多種類型,每種類型的資源中可能存在多個(gè)資源項(xiàng),這些資源項(xiàng)用不同的ID 或者名稱來(lái)區(qū)分。但是要將這么多種類型的不同ID 的資源有序地組織起來(lái)是一件非常痛苦的事情,因此,我們采取類似于磁盤目錄結(jié)構(gòu)的方式保存。

從圖中我們可以看到,PE 文件中的資源是按照 資源類型 -> 資源ID -> 資源代碼頁(yè) 的3層樹(shù)型目錄結(jié)構(gòu)來(lái)組織資源的,通過(guò)層層索引才能夠進(jìn)入相應(yīng)的子目錄找到正確的資源。

資源目錄結(jié)構(gòu)

數(shù)據(jù)目錄表中的 IMAGE_DIRECTORY_ENTRY_RESOURCE 條目(第三項(xiàng))包含資源的 RVA 和大小。資源目錄結(jié)構(gòu)中的每一個(gè)節(jié)點(diǎn)都是由 IMAGE_RESOURCE_DIRECTORY(深灰色) 結(jié)構(gòu)和緊跟其后的數(shù)個(gè)IMAGE_RESOURCE_DIRECTORY_ENTRY 結(jié)構(gòu)組成的(淺灰色)。(是不是有點(diǎn)像我們之前提到的文件目錄?文件夾每個(gè)都長(zhǎng)得一樣,一個(gè)嵌套另一個(gè),這樣子可以實(shí)現(xiàn)將非常復(fù)雜的數(shù)據(jù)細(xì)化切分,小澤瑪利亞、蒼井空、吉澤明步、松島楓……)

我們?cè)賮?lái)看這張圖:

認(rèn)識(shí)了這層關(guān)系后,我們來(lái)看下?IMAGE_RESOURCE_DIRECTORY 這個(gè)結(jié)構(gòu),該結(jié)構(gòu)長(zhǎng)度為 16 字節(jié),共有 6 個(gè)字段,定義如下:

IMAGE_RESOURCE_DIRECTORY STRUCT

? ? Characteristics??????? DWORD????? ??? ;理論上為資源的屬性,不過(guò)事實(shí)上總是0
? ? TimeDateStamp????? DWORD????? ??? ;資源的產(chǎn)生時(shí)刻
? ? MajorVersion????????? WORD????? ? ??? ;理論上為資源的版本,不過(guò)事實(shí)上總是0
? ? MinorVersion????????? WORD???? ?? ?
? ? NumberOfNamedEntries? WORD???? ??? ;以名稱(字符串)命名的入口數(shù)量
? ? NumberOfIdEntries???????? WORD???? ??? ;以ID(整型數(shù)字)命名的入口數(shù)量

IMAGE_RESOURCE_DIRECTORY ENDS

其實(shí)在這里邊我們唯一要注意的就是 NameberOfNamedEntries 和 NumberOfIdEntries,它們說(shuō)明了本目錄中目錄項(xiàng)的數(shù)量。兩者加起來(lái)就是本目錄中的目錄項(xiàng)總和。也就是后邊跟著的

IMAGE_RESOURCE_DIRECTORY_ENTRY 數(shù)目。

資源目錄入口的結(jié)構(gòu)(IMAGE_RESOURCE_DIRECTORY_ENTRY)

IMAGE_RESOURCE_DIRECTORY_ENTRY 緊跟在資源目錄結(jié)構(gòu)后,此結(jié)構(gòu)長(zhǎng)度為 8 個(gè)字節(jié),包含 2 個(gè)字段。該結(jié)構(gòu)定義如下:

IMAGE_RESOURCE_DIRECTORY_ENTRY STRUCT

? ? Name????????????????? DWORD??? ??? ;目錄項(xiàng)的名稱字符串指針或ID
? ? OffsetToData??????? DWORD??? ??? ;目錄項(xiàng)指針

IMAGE_RESOURCE_DIRECTORY_ENTRY ENDS

Name 字段完全是個(gè)百變精靈,改字段定義的是目錄項(xiàng)的名稱或ID。當(dāng)結(jié)構(gòu)用于第一層目錄時(shí),定義的是資源類型;當(dāng)結(jié)構(gòu)定義于第二層目錄時(shí),定義的是資源的名稱;當(dāng)結(jié)構(gòu)用于第三層目錄時(shí),定義的是代碼頁(yè)編號(hào)。

注意:當(dāng)最高位為 0? 的時(shí)候,表示字段的值作為 ID 使用;而最高位為 1 的時(shí)候,字段的低位作為指針使用(資源名稱字符串是使用 UNICODE編碼),但是這個(gè)指針不是直接指向字符串哦,而是指向一個(gè) IMAGE_RESOURCE_DIR_STRING_U 結(jié)構(gòu)的。
該結(jié)構(gòu)定義如下:

IMAGE_RESOURCE_DIR_STRING_U STRUCT

? ? Length???????????? DWORD?????? ??? ; 字符串的長(zhǎng)度
? ? NameString????? DWORD?????? ??? ; UNICODE字符串,由于字符串是不定長(zhǎng)的。由Length 制定長(zhǎng)度

IMAGE_RESOURCE_DIR_STRING_U ENDS

OffsetOfData 字段是一個(gè)指針,當(dāng)最高位為 1 時(shí),低位數(shù)據(jù)指向下一層目錄塊的真實(shí)地址;當(dāng)最高位為 0 時(shí),指針指向 IMAGE_RESOURCE_DATA_ENTRY 結(jié)構(gòu)。

注意:將 Name 和 OffsetToData 用做指針時(shí)需要注意,該指針是從資源區(qū)塊開(kāi)始的地方算起的偏移量(即根目錄的起始位置的偏移量),不是我們習(xí)慣的 RVA 哦。

最后,在上圖中我們看到,在第一層的時(shí)候,IMAGE_RESOURCE_DIRECTORY_ENTRY的Name 字段作為資源類型使用。
具體類型匹配見(jiàn)下表:

資源數(shù)據(jù)入口

經(jīng)過(guò)三層 IAMGE_RESOURCE_DIRECTORY_ENTRY (一般是3層,偶爾更年期少一些。第一層資源類型,第二層資源名,第三層是資源的 Language),第三層目錄結(jié)構(gòu)中的 OffsetOfData 指向 IMAGE_RESOURCE_DATA_ENTRY 結(jié)構(gòu)。該結(jié)構(gòu)描述了資源數(shù)據(jù)的位置和大小,定義如下:

IMAGE_RESOURCE_DATA_ENTRY STRUCT

? ? ?OffsetToData ??? DWORD ??? ???? ; 資源數(shù)據(jù)的RVA
? ? ?Size ??? ??? ???????? DWORD ??? ???? ; 資源數(shù)據(jù)的長(zhǎng)度
? ? ?CodePage ??? ???? DWORD ??? ???? ; 代碼頁(yè), 一般為0
? ? ?Reserved ??? ????? DWORD ??? ? ?? ; 保留字段

MAGE_RESOURCE_DATA_ENTRY ENDS

此處的?IMAGE_RESOURCE_DATA_ENTRY 結(jié)構(gòu)就是真正的資源數(shù)據(jù)了。結(jié)構(gòu)中的OffsetOfData 指向資源數(shù)據(jù)的指針,其為 RVA 值。

總結(jié)

以上是生活随笔為你收集整理的25. PE结构-PE详解之资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。