资源类型
通过数据目录表的第三个结构可以得到资源表的RVA
资源表的结构如图,绿色的是IMAGE_RESOURCE_DIRECTORY结构,从里面的
WORD NumberOfNamedEntries;以名字命名的资源
WORD NumberOfIdEntries; 以数字命名的资源
两个的和是资源目录项结构的个数。
资源目录结构
typedef struct _IMAGE_RESOURCE_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
WORD NumberOfNamedEntries;
WORD NumberOfIdEntries;
// IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
资源目录项结构
typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
union {
struct {
DWORD NameOffset:31;
DWORD NameIsString:1;
} DUMMYSTRUCTNAME;
DWORD Name;
WORD Id;
} DUMMYUNIONNAME;
union {
DWORD OffsetToData;
struct {
DWORD OffsetToDirectory:31;
DWORD DataIsDirectory:1;
} DUMMYSTRUCTNAME2;
} DUMMYUNIONNAME2;
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
其中NAME的在每一层的含义都不同
第一层确定资源的类型,第二层决定同一种资源的不同编号。第三层是资源的编码,中文是2052.
当Name的最高位为1的时候。低31位是一个指向UNICODE的指针,指向一个结构
typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
WORD Length;
WCHAR NameString[ 1 ];
} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
当Name的最高位为0的时候。Name的值就表示资源的ID
OffsetToData的含义
最高位如果为1, 低31位+资源表的起始地址=下一个目录节点的起始位置
第一层第二层全为1
最高位如果为0,指向IMAGE_RESOURCE_DATA_ENTRY结构
typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
DWORD OffsetToData;
DWORD Size;
DWORD CodePage;
DWORD Reserved;
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
这是第四层的结构
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;