资源表分布图
查看一个exe 资源表
4000位置 资源目录头的结构体
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;
接着就是资源目录项
//@[comment("MVI_tracked")] 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;
看一下预定义16个标识
可以看到分别对应 id,名字 4个结构体 03 05 0e 10 的id 站一个双子
高位为80 就是 高位1 地位代表 从资源表4000偏移30位置 就是下一个资源项 后面也是同样的偏移分别偏移50,68,80
30位置又是IMAGE_RESOURCE_DIRECTORY 结构体
2个资源项 id是 1,2 下一级偏移位置在98,b0 如果有会继续递归下去 直到把所有的关系找全
可以看到没找到下一个了 高位也不是1了 说明这是最后一层 代表 id=407 偏移110
rva=4160 大小=2e8 这一层分析结束 后面都是这样分析的 以此类推
typedef struct _IMAGE_RESOURCE_DATA_ENTRY { DWORD OffsetToData; DWORD Size; DWORD CodePage; DWORD Reserved; } IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
这个结构也上面推到到最后的结构 前2个值
接着看4160 这个地址 转换地址foa 也是4160
这些就是 图标的属性设置 具体单个内容都是类似结构体
可以在文件的图标组看到
26 相对图标组偏移 文件物理地址 可以通过更改这个地址来显示不同图标 其实算是图标的下标 需要保证ico大小相同
对应的第一个下标ico