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文件 · 17.4 资源(3) 下页:第17章 PE文件 · 17.5 重定位表(1)

第17章 PE文件

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号