首页
社区
课程
招聘
[原创]PE资源字符串ID计算方法
发表于: 2010-5-15 02:30 7088

[原创]PE资源字符串ID计算方法

2010-5-15 02:30
7088
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了

[课程]Android-CTF解题方法汇总!

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 324
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
本文附件
http://bbs.pediy.com/attachment.php?attachmentid=43326&stc=1&d=1273861985
上传的附件:
2010-5-15 02:33
0
雪    币: 324
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
唉,无人关注,其实......

这是我开发OllyDbg插件时碰到的一个问题:
在反汇编代码窗口中所有引用到的字符串ID,插件都自动都会把对应字符串内容添加到注释中去,并用自动计算该字符串ID有几处交叉引用

还有一个就是:
做到了OllyDbg特征码定位,比如双击列表控件中的静态链接MFC程序"AfxDispatchCmdMsg"的特征码,能马上定位到该函数中去,并且能知道该函数有多少交叉引用,当然你自己的特征码能用插件轻易获取,用在某软件升级时,对比代码时很有用
2010-5-15 13:46
0
雪    币: 324
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
在OllyDbg的插件中遍历PE的资源字符串的ID及对应的文本内容功能完全实现

插件现在已实现提取特征码及定位,定位资源字符串的调用地址等功能

想多实现几个功能,功能多了再公布插件代码

在此想请教各位前辈:
已知窗口句柄,但窗口被完全遮挡,能对它抓图吗

没有他意,只是想让插件多一个功能
2010-5-18 17:30
0
雪    币: 60
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享!
2018-6-5 15:57
0
游客
登录 | 注册 方可回帖
返回
//