一、概述
想要获取一个可执行文件(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");
}

279

被折叠的 条评论
为什么被折叠?



