對pe資源的研究
《轉》資源一般使用樹來儲存,通常包含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
---本文章使用「國華軟體」出品的部落格內容離線管理軟體multiblogwriter撰寫並發布
對PE資源的研究
對pe 主頁 http www.delphibox.com 前言 沒什麼好說的,發現這方面的資料全是英文的,於是我一邊研究,一邊翻譯,一邊寫出自己的心得。希望大家尊重我的勞動成果,轉貼保持完整。資源一般使用樹來儲存,通常包含3層,在nt下,最高層是型別,然後是名字,最後是語言。乙個pe檔案是否包含資...
PE檔案之資源講解
資源是pe檔案中非常重要的部分,幾乎所有的pe檔案中都包含資源,與匯入表與匯出表相比,資源的組織方式要複雜得多,要了解資源的話,重點在於了解資源整體上的組織結構。我們知道,pe檔案資源中的內容包括 游標 圖示 位圖 選單等十幾種標準的型別,除此之外,還可以使用自定義的型別,每種型別的資源中,可能存在...
小甲魚PE詳解之資源(PE詳解11)
原文出自 www.fishc.com 最近一直在安排第一屆魚c 學習班的事情,忙活了好一陣子,真是對不住大家,還大家久等了,這裡要跟大家說聲不好意思 今天我們來談談資源部分,資源部分可以說是 pe 檔案所有結構中,最複雜的一部分,也最讓人揪心。很多朋友都想通過自己動手修改一些遊戲的資源 工具的介面 ...