国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

對PE資源的研究

2019-11-18 18:55:43
字體:
來源:轉載
供稿:網友

主頁:http://www.delphibox.com
郵箱:mantousoft@163.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中的申明
{ Resources }
  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


TIME/DATE STAMP
資源編譯器建立此資源的時間/日期,可能為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)。


{ 此函數檢驗 offset 是一個字符串名還是一個目錄 }
{ IMAGE_RESOURCE_NAME_IS_STRING
= IMAGE_RESOURCE_DATA_IS_DIRECTORY
= $80000000 }
function HighBitSet(L: Longint): Boolean;
begin
  Result := (L and IMAGE_RESOURCE_DATA_IS_DIRECTORY) <> 0;
end;


{ 下面兩個函數用于去掉E位剩下的值或者指針 }
{IMAGE_OFFSET_STRip_HIGH = $7FFFFFFF;}
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


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


上一篇:零代碼保存窗口運行狀態

下一篇:解析IP地址為主機域名

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 伊金霍洛旗| 德州市| 措勤县| 山丹县| 灵璧县| 江津市| 岑溪市| 广宗县| 桂林市| 四平市| 乐昌市| 温泉县| 交口县| 安国市| 阿城市| 交口县| 元谋县| 财经| 沈阳市| 紫云| 岳池县| 东山县| 景东| 姜堰市| 元氏县| 固始县| 格尔木市| 柏乡县| 无极县| 建昌县| 泰来县| 扶绥县| 龙岩市| 和平区| 黄骅市| 拉萨市| 安阳市| 福泉市| 平谷区| 丹东市| 铜梁县|