第九讲,资源表解析
| 
                        副标题[/!--empirenews.page--]
                         
 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件方法 树形结构 
 可以看出结构 根目录 子目录 文件.xxx 子目录 子目录 (子目录里面还可以有文件夹) ..... 那么我们的资源也是这样存储的. ? 二丶资源结构体解析 首先,资源结构体分为很多个,但是有用的就3个.一般也分为三个 IMAGE_RESOURCE_DIRECTORY 根目录(资源目录头) IMAGE_RESOURCE_DIRECTORY_ENTRY 子目录(资源目录项)其中根目录下可以有很多子目录(也就是说根目录下会有子目录的) IMAGE_RESOURCE_DATA_ENTRY            文件(资源数据) 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.资源目录项(子目录) typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
    union {
        struct {
            DWORD NameOffset:31;          位段: 低31位飘逝偏移 定义了目录项的名称或者ID
            DWORD NameIsString:1;          位段: 高位,如果这位为1,则表示31位的偏移指向的是一个Unicode字符串的指针偏移
        };                       这里列出结构体,自己去看,IMAGE_RESOURCE_DIR_STRING_U 里面是字符串长度还有字符串,不是 结尾         
        DWORD   Name;                 
        WORD    Id;
    };
    union {
        DWORD   OffsetToData;            偏移RVA因为是联合体,所以有不同的解释
        struct {
            DWORD   OffsetToDirectory:31;    看高位,如果高位是1,那么RVA偏移指向的是新的(根目录)
            DWORD   DataIsDirectory:1;      
        };
    };
} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY; 
 
前边我们说了 根目录(资源目录头)下面存放的是这个结构体,这个结构体是一个联合体,所以会有不同的解释 1.首先,联合体是8个字节大小. 2.其中第一个DWORD大小,看高位,那么低31位是指向新的目录项名称的结构体IMAGE_RESOURCE_DIR_STRING_U? 3.如果高位为0,则是ID号,这个ID号说的是 资源ID类型,比如3类型指的就是ICON 具体,可以随便写个RT_XXX开头的宏去查看. 这里我写下,跟一下看看. 
 4.第二个DWORD量,也是RVA偏移,如果高位为1,那么代表它还是一个目录,也就是指向了一个新的根目录了,这是个不断递归的过程. 如果不是,则指向文件偏移结构体了. 文件偏移结构体:(应该是资源数据结构体) typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
    DWORD   OffsetToData;          资源数据的偏移RVA
    DWORD   Size;               大小
    DWORD   CodePage;             代码页缓冲(CMD设置窗口的时候就是这个,没用)
    DWORD   Reserved;             保留
} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY; 
 
这个就很简单了,直接前边4个字节指向就是ICON资源的位置. ? 三丶实战演练,定位ICON资源. 看了上面结构体,可能会晕,因为联合体很多,不同的方式有不同的解释方法,那么一步一步的跟随 1.首先通过数据目录定位资源根目录(也就是根目录,占16个字节,第一个结构体) ? 
 由此得出 RVA = 1B000? 然后查看属于哪个节 ? 
 由此得出,节的虚拟地址也是从1b000开始的,那么直接看文件偏移即可. 因为此时FA = RVA了,为了方便,一次截图就指明了,在文件的7800h位置 然后我们定位到7800h的位置 2.找到位置,查看结构体 (编辑:泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  






