对PE资源的研究
;——————————————————
| 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 | ———&m |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |