WIN32汇编语言教程:第17章 PE文件 · 17.4 资源(4)
由于资源目录不同层次的含义是不同的,所以_ProcessRes子程序定义了一个_dwLevel参数,用来指定当前处理的目录所处的层次,在主程序中第一次调用_ProcessRes子程序的时候,这个参数被指定为1。在_ProcessRes中,_dwLevel的值被加1放到局部变量@dwNextLevel变量中,当需要继续处理下一层目录的时候,@dwNextLevel的值将被用在递归调用_ProcessRes子程序的参数中,同时传给子程序的参数中还包括了PE文件的起始指针、资源根目录的指针和需要处理的目录块的指针。
_ProcessRes子程序首先处理目录块中的第一个结构IMAGE_RESOURCE_ DIRECTORY,将结构中的NumberOfNamedEntries字段和NumberOfIdEntries字段相加得到后续的目录项总数,并构造一个循环来处理这些目录项。
在循环体中,每次将处理一个IMAGE_RESOURCE_DIRECTORY_ENTRY结构,循环体的代码结构如下:
.if OffsetToData字段的位31=1 (表明OffsetToData字段指向的是下一层的目录块) .if 当前是第1层 (表明Name1字段代表的是资源类型) .if Name1字段的位31=1 Name1指向的是一个UNICODE字符串 .else Name1中包含的是资源类型ID .endif .elseif 当前是第2层 (表明Name1字段代表的是资源名称) .if Name1字段的位31=1 Name1指向的是一个UNICODE字符串 .else Name1中包含的是资源名称ID .endif .endif 将层次加1继续递归处理OffsetToData所指的下一层目录块 .else (表明OffsetToData字段指向的是IMAGE_RESOURCE_DATA_ENTRY结构) (表明Name1字段代表的是资源的代码页) IMAGE_RESOURCE_DATA_ENTRY结构地址=OffsetToData字段 资源RVA=IMAGE_RESOURCE_DATA_ENTRY.OffsetToData 资源大小=IMAGE_RESOURCE_DATA_ENTRY.Size1 .endif
例子代码在每次处理一个目录项或者资源数据的时候,都将它们的名称或ID等信息显示出来。如果例子中的代码被移植到其他地方用来寻找资源的话,这些显示信息的语句就可以全部去掉了,因为这时程序的最终目的就是最后两句获取资源RVA和大小的指令。
第17章 PE文件
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号