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了
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课