對PE資源的研究

2021-04-17 06:58:22 字數 4153 閱讀 4065

對pe

主頁:http://www.delphibox.com

前言:沒什麼好說的,發現這方面的資料全是英文的,於是我一邊研究,一邊翻譯,一邊寫出自己的心得。

希望大家尊重我的勞動成果,轉貼保持完整。

資源一般使用樹來儲存,通常包含3層,在nt下,最高層是型別,然後是名字,最後是語言。乙個pe檔案是否包含資源檔案,通常檢測塊表(section table)中是否含有'.rsrc',不過這個方法對有些pe檔案無效。

乙個型別表結構如下

—————————————

|  resource directory  |

—————————————

|  resource data             |

—————————————

資源表1(resource file layout)

其中的資源目錄(resource directory)結構如下:

——————————————————————————

|  resource flags   |

——————————————————————————

|  time/date stamp   |

——————————————————————————

| major version | minor version |

——————————————————————————

| # name entry | # id entry |

——————————————————————————

|  resource dir entries  |

——————————————————————————

資源表2(resource table entry)

在delphi中的申明

pimage_resource_directory = ^image_resource_directory;

image_resource_directory = packed record

characteristics : dword;

timedatestamp   : dword;

majorversion    : word;

minorversion    : word;

numberofnamedentries : word;

numberofidentries : word;

end其中:

resource flags

通常設定為0

major/minor version

版本資訊

# name entry

使用名字的資源條目的個數,包含乙個使用名字的目錄條目的陣列。

# id entry

使用id數字的資源條目的個數,包含乙個32位的整數id號,同用名字一樣。

這個目錄緊接著會是乙個不定長度的目錄條目,不管用的名字還是id,都是用公升序排列。

這個不定長度的目錄結構如下:

31     0

——————————————————————

| name rva/integer id  |

——————————————————————

| e | data entry rva/subdir rva |

——————————————————————

資源表3(resource directory entry)

在delphi中的申明:

pimage_resource_directory_entry = ^image_resource_directory_entry;

image_resource_directory_entry = packed record

name: dword;        // or id: word (union)

offsettodata: dword;

integer id

包含乙個識別資源的整數id

如果在根目錄,這個id表示的意義如下

資源型別

1: cursor

2: bitmap

3: icon

4: menu

5: dialog

6: string table

7: font directory

8: font

9: accelerators

10: unformatted resource data

11: message table

12: group cursor

14: group icon

16: version information

name rva

名字的相對實際位址,包含乙個31位的相對資源的image base的位址。表的形式見表4

e 一位的不可缺少的識別碼(mask 80000000h)

如果這位為0,則為resource data entries,其中data rva = 31位的(mask 7fffffffh) 資料條目的位址。結構見表5

如果這位為1,則表示接另乙個子目錄(subdirectory entry)。

function highbitset(l: longint): boolean;

begin

result := (l and image_resource_data_is_directory) <> 0;

end;

function striphighbit(l: longint): longint;

begin

result := l and image_offset_strip_high;

end;

function striphighptr(l: longint): pointer;

begin

result := pointer(l and image_offset_strip_high);

end;

每乙個資源目錄名為如下格式

——————————————————————

| length | unicode string |

——————————————————————

| length | unicode string |

——————————————————————

表4(resource directory string entry)

在delphi中的申明

pimage_resource_dir_string_u = ^image_resource_dir_string_u;

image_resource_dir_string_u = packed record

length          : word;

namestring      : array [0..0] of wchar;

end;

length

就是字串的長度

unicode string

unicode的字串.

資源資料表結構:

—————————————

| data rva |

—————————————

| size  |

—————————————

| codepage |

—————————————

| reserved |

—————————————

表5(resource data entry)

在delphi中的申明

pimage_resource_data_entry = ^image_resource_data_entry;

image_resource_data_entry = packed record

offsettodata    : dword;

size            : dword;

codepage        : dword;

reserved        : dword;

end;

data rva

資源的相對實際位址,包含乙個32位相對於資源image base的位址。

size

資源的大小。

codepage

沒什麼說的,好像為解碼方面設定的。

reserved

一定為0

好了,差不多資源這部分分析玩了,其它部分我還在研究:)

對PE資源的研究

對pe資源的研究 轉 資源一般使用樹來儲存,通常包含3層,在nt下,最高層是型別,然後是名字,最後是語言。乙個pe檔案是否包含資源檔案,通常檢測塊表 section table 中是否含有 rsrc 不過這個方法對有些pe檔案無效。乙個型別表結構如下 resource directory resou...

PE檔案之資源講解

資源是pe檔案中非常重要的部分,幾乎所有的pe檔案中都包含資源,與匯入表與匯出表相比,資源的組織方式要複雜得多,要了解資源的話,重點在於了解資源整體上的組織結構。我們知道,pe檔案資源中的內容包括 游標 圖示 位圖 選單等十幾種標準的型別,除此之外,還可以使用自定義的型別,每種型別的資源中,可能存在...

小甲魚PE詳解之資源(PE詳解11)

原文出自 www.fishc.com 最近一直在安排第一屆魚c 學習班的事情,忙活了好一陣子,真是對不住大家,還大家久等了,這裡要跟大家說聲不好意思 今天我們來談談資源部分,資源部分可以說是 pe 檔案所有結構中,最複雜的一部分,也最讓人揪心。很多朋友都想通過自己動手修改一些遊戲的資源 工具的介面 ...