解析资源

1.资源类型

#define RT_CURSOR           MAKEINTRESOURCE(1)              //光标
#define RT_BITMAP           MAKEINTRESOURCE(2)              //位图
#define RT_ICON             MAKEINTRESOURCE(3)              //图标
#define RT_MENU             MAKEINTRESOURCE(4)              //菜单
#define RT_DIALOG           MAKEINTRESOURCE(5)              //对话框
#define RT_STRING           MAKEINTRESOURCE(6)              //字符串
#define RT_FONTDIR          MAKEINTRESOURCE(7)              //字体目录
#define RT_FONT             MAKEINTRESOURCE(8)              //字体
#define RT_ACCELERATOR      MAKEINTRESOURCE(9)              //加速键
#define RT_RCDATA           MAKEINTRESOURCE(10)              //未格式化
#define RT_MESSAGETABLE     MAKEINTRESOURCE(11)              //消息表
#define DIFFERENCE     11
#define RT_GROUP_CURSOR MAKEINTRESOURCE((ULONG_PTR)(RT_CURSOR) + DIFFERENCE)    //光标组
#define RT_GROUP_ICON   MAKEINTRESOURCE((ULONG_PTR)(RT_ICON) + DIFFERENCE)      //图标组
#define RT_VERSION      MAKEINTRESOURCE(16)                //版本
#define RT_DLGINCLUDE   MAKEINTRESOURCE(17)                2.

2.PE资源表组织方式

共有4级,称为1级目录,2级子目录,3级子目录,4级具体数据

1级目录按资源类型分类,如光标,菜单,加速键等

2级子目录按资源id分类

3级子目录按照资源代码页分类,不同语言的代码页对应不同数据

4级就是数据,文件了

3.PE资源分布及其数据结构

(1). 资源表定位

位于数据目录中的第3个目录项中, 显示了资源表所在的节的RVA及其大小

(2) 资源目录头

typedef struct _IMAGE_RESOURCE_DIRECTORY {
    DWORD   Characteristics;    //必须是0
    DWORD   TimeDateStamp;      //创建资源时间
    WORD    MajorVersion;      //0
    WORD    MinorVersion;      //0
    WORD    NumberOfNamedEntries;  //以名称命名的资源个数
    WORD    NumberOfIdEntries;    //以id命名的资源个数
//  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;

(3)资源目录项

紧跟在资源目录后的结构,先按字母升序排列,再按id升序排列

typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
    union {
        struct {
            DWORD NameOffset:31; 
            DWORD NameIsString:1;
        } DUMMYSTRUCTNAME;
        DWORD   Name;  //最高位如果是1,则指向结构体:IMAGE_RESOURCE_DIR_STRING_U
        WORD    Id;
    } DUMMYUNIONNAME;
    union {    //最高位为0时指向描述资源数据块的指针,为1时指向下一级目录块基址
        DWORD   OffsetToData;
        struct {
            DWORD   OffsetToDirectory:31;
            DWORD   DataIsDirectory:1;
        } DUMMYSTRUCTNAME2;
    } DUMMYUNIONNAME2;
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;

(4)数据项

typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
    DWORD   OffsetToData;  //资源数据的RVA
    DWORD   Size;        //资源数据大小
    DWORD   CodePage;      //代码页
    DWORD   Reserved;      //保留字段
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;

例如:

 这里是一个1级目录的内容是:IMAGE_RESOURCE_DIRECTORY结构和IMAGE_RESOURCE_DIRECTORY_ENTRY结构数组. 

可以发现IMAGE_RESOURCE_DIRECTORY的的NumberOfNamedEntries为0,NumberOfIdEntries为9,和下面的

IMAGE_RESOURCE_DIRECTORY_ENTRY结构数组个数相同.根据里面的内容知道该PE文件使用了9种不同的资源

 然后紧接着:

第2个IMAGE_RESOURCE_DIRECTORY就是2级目录,第3个就是3级目录,第4个就是数据目录

在2级目录中:

...........

是1级目录中对应资源类型的具体描述 ,3级目录又是2级目录的具体描述,4级目录时3级目录的具体描述

原文地址:https://www.cnblogs.com/freesec/p/6677125.html