第二层:资源名称
以索引图标资源为例
struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
DWORD Name; //ID = 0x03 图标
DWORD OffsetToData; //子目录偏移地址= 0x80000168
};
找到第二层所在文件地址 = 0x212600 + 0x00000168 = 0x212768
struct _IMAGE_RESOURCE_DIRECTORY {
DWORD Characteristics; // 0x00000000 DWORD TimeDateStamp; //0x3C272350 WORD MajorVersion; //0x00 WORD MinorVersion; //0x00
WORD NumberOfNamedEntries; //0x00
WORD NumberOfIdEntries; //0x01 下面有一个资源目录入口结构 }
6
struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
DWORD Name; //资源的名称 0x01
DWORD OffsetToData; // 子目录偏移地址= 0x80000628
};
Name字段当最高位位0,作为ID使用 struct _IMAGE_RESOURCE_DIR_STRING_U {
WORD Length; //ID = 0X01 光标
WCHAR NameString[ 1 ]; // 子目录偏移地址= 0x80000628 }
第三层:代码页编号
struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
DWORD Name; //资源的名称 0x01
DWORD OffsetToData; // 子目录偏移地址= 0x80000628
};
找到第三层所在文件地址 = 0x212600 + 0x00000628 = 0x212C28
struct _IMAGE_RESOURCE_DIRECTORY { DWORD Characteristics; // 0X00
DWORD TimeDateStamp; //0X3C272350 WORD MajorVersion; //0x00 WORD MinorVersion; //0x00
WORD NumberOfNamedEntries; //0x00
WORD NumberOfIdEntries; //0x01 下面有一个资源目录入口结构 }
struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
DWORD Name; //代码页编号 804
DWORD OffsetToData; // 资源数据偏移地址0x0C90
};
资源数据入口结构地址 = 0x212600 + 0x00000C90 = 0x213290
struct _IMAGE_RESOURCE_DATA_ENTRY {
DWORD OffsetToData; //资源数据的RVA = 0X2857B0 DWORD Size; //资源数据的长度 = 0X2E8
7
DWORD CodePage; //代码页一般为0 DWORD Reserved; //保留 }
文件资源数据地址 = 0x212600 + (0x2857B0 - 0x282000) = 0x215DB0 一直到0X216098 共0x2E8个字节
使用eXeScope进行验证
8
点击试图二进制
9
两者对比一模一样
10