PE资源表

熟悉Windows管理文件的

1.windows管理文件方法

树形结构


可以看出结构

根目录

子目录

文件.xxx

子目录
子目录 (子目录里面还可以有文件夹)

…..

那么我们的资源也是这样存储的.

 

二丶资源结构体解析

首先,资源结构体分为很多个,但是有用的就3个.一般也分为三个

IMAGE_RESOURCE_DIRECTORY            根目录(资源目录头)
IMAGE_RESOURCE_DIRECTORY_ENTRY         子目录(资源目录项)其中根目录下可以有很多子目录(也就是说根目录下会有子目录的)
IMAGE_RESOURCE_DATA_ENTRY            文件(资源数据)

1.资源目录头IMAGE_RESOURCE_DIRECTORY(也可以看做管理文件的根目录)

typedef struct _IMAGE_RESOURCE_DIRECTORY {
    DWORD   Characteristics;          资源属性
    DWORD   TimeDateStamp;           时间戳
    WORD    MajorVersion;            资源大版本号
    WORD    MinorVersion;            资源小版本号
    WORD    NumberOfNamedEntries;       按照名称命名的数量
    WORD    NumberOfIdEntries;         按照ID命名的数量
//  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;

首先我们看到资源目录头的结构体了,这里大家要知道,有用的就最后两个成员,还有一段注释.

1.按照名称命名的数量
意思就是我们的资源是字符串命名加载的有多少个

2.按照ID命名的数量
意思就是我们的资源如果按照ID有多少个.
一般都是用ID的.

最后两个字段主要是资源的标识,是以ID的有多少个,以字符串标识的有多少个.

2.资源目录项IMAGE_RESOURCE_DIRECTORY_ENTRY(子目录)

  1. typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
  2. union {
  3. struct {
  4. DWORD NameOffset:31;          位段: 低31位飘逝偏移 定义了目录项的名称或者ID
  5. DWORD NameIsString:1;          位段: 高位, 如果这位为1,则表示31位的偏移指向的是一个Unicode字符串的指针偏移
  6. };                       这里列出结构体,自己去看,IMAGE_RESOURCE_DIR_STRING_U 里面是字符串长度还有字符串,不是\0结尾         
  7. DWORD Name;                 
  8. WORD Id;
  9. };
  10. union {
  11. DWORD OffsetToData;            偏移RVA因为是联合体,所以有不同的解释
  12. struct {
  13. DWORD OffsetToDirectory:31;    看高位,如果高位是1,那么RVA偏移指向的是新的(根目录)
  14. DWORD DataIsDirectory:1;      
  15. };
  16. };
  17. } IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;

根目录(资源目录头)下面存放的是这个结构体,这个结构体是一个联合体,所以会有不同的解释

1.首先,联合体是8个字节大小.

2.其中第一个DWORD大小,看高位,如果高位是1,那么低31位是指向新的目录项名称的结构体IMAGE_RESOURCE_DIR_STRING_U

3.如果高位为0,则是ID号,这个ID号说的是 资源ID类型,比如3类型指的就是ICON

ID数值在1-16之间时,表示这是系统预定义的类型,否则,表示这是一个自定义的类型。

4.第二个DWORD量,也是RVA偏移,如果高位为1,那么代表它还是一个目录,也就是指向了一个新的根目录了,这是个不断递归的过程.

如果不是,则指向文件偏移结构体了.

3.文件偏移结构体IMAGE_RESOURCE_DATA_ENTRY:(应该是资源数据结构体)

typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
    DWORD   OffsetToData;          资源数据的偏移RVA
    DWORD   Size;               大小
    DWORD   CodePage;             代码页缓冲(CMD设置窗口的时候就是这个,没用)
    DWORD   Reserved;             保留
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;

具体的实例我只是初略看了以下。没有实践了,需要用上的时候在反过来看。

对于需要对软件汉化,修改界面的这节内容挺重要

 

发表评论

邮箱地址不会被公开。 必填项已用*标注