PE文件解析-资源中的字符串结构

一、概述

    想要获取一个可执行文件(PE文件)里包含的资源文件,首先要解析可执行文件,得到资源存储的地址及大小,可参考 https://blog.csdn.net/zhyulo/article/details/85717711 。然后,根据资源存储方式,得到各资源的数据内容及其大小,可参考 https://blog.csdn.net/zhyulo/article/details/85930045 。

    PE文件的资源中,字符串的资源类型ID=6。字符串在资源中分组存储,每组最多16个,以ID号分段,[ID/16]值相同的在同一组。在RC文件中,字符串的定义方式如下:

STRINGTABLE PRELOAD DISCARDABLE 
BEGIN
	IDR_MAINFRAME           "test\n\nTest\n\n\nTest.Document\nTest Document"

END

STRINGTABLE PRELOAD DISCARDABLE 
BEGIN
	AFX_IDS_APP_TITLE       "test"
	AFX_IDS_IDLEMESSAGE     "就绪"
END

二、字符串的资源结构

    字符串在资源中,以固定16个字符串的方式进行存储。假如该组字符串资源在资源树的第二层中的ID值是baseID,其中一个字符串在改组的序号为index,那么该字符串的真实ID=(baseID-1)*16+index。

    由于字符串中间可能包括'\0',字符串的长度需要单独存储。存储时,首先是字符串长度,长度信息是2字节,然后紧跟着的是这个长度的字符串。

三、示例程序

  以下程序展示了如何从PE文件的字符串资源流中读取并输出成RC文件形式的代码。

void GetString(WCHAR *buf, WORD id)
{
	Puts("STRINGTABLE DISCARDABLE\nBEGIN\n");
	id = (id - 1) * 16;
	for(int wID=0; wID<16; wID++)
	{
		WORD length = *buf++;
		if(!length) continue;
		Puts("\t");
		PutIDName(wID+id, "IDS_STRING");
		Puts("\t\"");
		buf = (WCHAR*)WPuts(buf, length) - 1;
		Puts("\"\n");
	}
	Puts("END\n");
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值