PE资源字符串ID计算方法

注:
不知道怎么发图,只好委屈大家到附件中的doc文档中去看了

关键字:资源字符串表 资源字符串ID计算方法 字符串块之字符串索引值

前言

关于资源字符串ID的计算方法, 国内网页搜索后,几乎没有找到;国外英文的网页搜索后情况也相似,经过本人努力与实验终于明白个中道理

一、参考文章:《Win32 二进制资源格式(全)》
该文章链接:http://www.fish888.com/Win32-t169128

其中资源字符串表相关部分摘录及整理如下
字符串表资源
字符串表表由16个字符串所组成的块(blocks of 16 strings)构成。这些块的组织取决于字符串ID,字符串ID的数值在资源中是隐含的,只能通过计算,计算字符串在字符串块(或叫串组)中的索引值才能得到,索引值的范围为0-15

字符串ID的最低4位指定字符串在块中的位置,高12位指定字符串在哪个块中,每个块存储为一个资源项

每个字符串或错误表资源块的存储格式如下:
[一般资源头(type = 6)]

字符串块
字符串为Pascal格式,第一个单字(WORD)存储长度。不管有无字符串16个块都会填满,其中没有字符串的位置其单字长度值置0

字符串块也有ID,也叫字符串块ID

注意:
资源文件中块不一定按顺序存储。每块都被赋予一个序数ID。这个ID值等于字符串ID的高12位再加1(因此序数ID总大于等于1)。块以其在.rc文件中出现的次序存储在.res文件中,再由CVTRES工具将其顺序存储在COFF对象中,再到最终映像文件中去

二、VC中的字符串
根据以上信息即可确定资源字符串ID了:若为空串,则是一个WORD的0值,占一个索引,见图:
VC中:
 
根据《Win32 二进制资源格式(全)》,计算出该字符串块ID为:(96 / 16) + 1 = 7 

三、看看该字符串块在资源黑客中的情况:
ResHacker中:
 

四、看看OllyDbg中的情况,关于如何定位到此处,请参考文章《Win32 二进制资源格式(全)》,本文不再赘述
OllyDbg中:
 

五、字符串ID计算方法:
见图,得到索引值后,计算方法实在简单
 

六、总结
虽然程序资源节中并没有真实的字符串ID值的存在,但事实上字符串ID却隐含在字符串块ID与索引值中,根据字符串块ID与串块索引能很简单地求出字符串ID

根据这些知识,再结合PE相关知识(网上PE相关文章多如牛毛,本文不再赘述)就能很方便的遍历枚举程序资源中的字符串ID了

  • 标 题:本文附件
  • 作 者:swqswq
  • 时 间:2010-05-15 02:33:38

本文附件
http://bbs.pediy.com/attachment.php?attachmentid=43326&stc=1&d=1273861985

上传的附件 PE资源字符串ID计算方法.rar