第九讲,资源表解析
副标题[/!--empirenews.page--]
一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件方法 树形结构 可以看出结构 根目录 子目录 文件.xxx 子目录 子目录 (子目录里面还可以有文件夹) ..... 那么我们的资源也是这样存储的. ? 二丶资源结构体解析 首先,资源结构体分为很多个,但是有用的就3个.一般也分为三个 IMAGE_RESOURCE_DIRECTORY 根目录(资源目录头) IMAGE_RESOURCE_DIRECTORY_ENTRY 子目录(资源目录项)其中根目录下可以有很多子目录(也就是说根目录下会有子目录的) IMAGE_RESOURCE_DATA_ENTRY 文件(资源数据) typedef struct _IMAGE_RESOURCE_DIRECTORY { DWORD Characteristics; 资源属性 DWORD TimeDateStamp; 时间戳 WORD MajorVersion; 资源大版本号 WORD MinorVersion; 资源小版本号 WORD NumberOfNamedEntries; 按照名称命名的数量 WORD NumberOfIdEntries; 按照ID命名的数量 // IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[]; } IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY; 首先我们看到资源目录头的结构体了,这里大家要知道,有用的就最后两个成员,还有一段注释. 1.按照名称命名的数量 意思就是我们的资源是字符串命名加载的有多少个 2.按照ID命名的数量 意思就是我们的资源如果按照ID有多少个. 一般都是用ID的. 最后两个字段主要是资源的标识,是以ID的有多少个,以字符串标识的有多少个. 2.资源目录项(子目录) typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY { union { struct { DWORD NameOffset:31; 位段: 低31位飘逝偏移 定义了目录项的名称或者ID DWORD NameIsString:1; 位段: 高位,如果这位为1,则表示31位的偏移指向的是一个Unicode字符串的指针偏移 }; 这里列出结构体,自己去看,IMAGE_RESOURCE_DIR_STRING_U 里面是字符串长度还有字符串,不是 结尾 DWORD Name; WORD Id; }; union { DWORD OffsetToData; 偏移RVA因为是联合体,所以有不同的解释 struct { DWORD OffsetToDirectory:31; 看高位,如果高位是1,那么RVA偏移指向的是新的(根目录) DWORD DataIsDirectory:1; }; }; } IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY; 前边我们说了 根目录(资源目录头)下面存放的是这个结构体,这个结构体是一个联合体,所以会有不同的解释 1.首先,联合体是8个字节大小. 2.其中第一个DWORD大小,看高位,那么低31位是指向新的目录项名称的结构体IMAGE_RESOURCE_DIR_STRING_U? 3.如果高位为0,则是ID号,这个ID号说的是 资源ID类型,比如3类型指的就是ICON 具体,可以随便写个RT_XXX开头的宏去查看. 这里我写下,跟一下看看. 4.第二个DWORD量,也是RVA偏移,如果高位为1,那么代表它还是一个目录,也就是指向了一个新的根目录了,这是个不断递归的过程. 如果不是,则指向文件偏移结构体了. 文件偏移结构体:(应该是资源数据结构体) typedef struct _IMAGE_RESOURCE_DATA_ENTRY { DWORD OffsetToData; 资源数据的偏移RVA DWORD Size; 大小 DWORD CodePage; 代码页缓冲(CMD设置窗口的时候就是这个,没用) DWORD Reserved; 保留 } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY; 这个就很简单了,直接前边4个字节指向就是ICON资源的位置. ? 三丶实战演练,定位ICON资源. 看了上面结构体,可能会晕,因为联合体很多,不同的方式有不同的解释方法,那么一步一步的跟随 1.首先通过数据目录定位资源根目录(也就是根目录,占16个字节,第一个结构体) ? 由此得出 RVA = 1B000? 然后查看属于哪个节 ? 由此得出,节的虚拟地址也是从1b000开始的,那么直接看文件偏移即可. 因为此时FA = RVA了,为了方便,一次截图就指明了,在文件的7800h位置 然后我们定位到7800h的位置 2.找到位置,查看结构体 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |