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级目录的具体描述