给定.rsrc和IDA中要加载的字符串的标识符,如何找到特定的资源字符串



给定使用LoadStringA((加载的字符串的字符串标识符(uID((我相信它在使用FindResourceA((装载的资源中找到,但不确定如何遍历它(,我如何找到该字符串?

我不能运行程序,只接受静态分析。我正在使用IDA Pro。

主要伪代码:

{
char v0; // [esp+0h] [ebp-4A0h]
char Dst; // [esp+1h] [ebp-49Fh]
char *v2; // [esp+404h] [ebp-9Ch]
char v3; // [esp+408h] [ebp-98h]
int v4; // [esp+498h] [ebp-8h]
int v5; // [esp+49Ch] [ebp-4h]
MD5::MD5((MD5 *)&v3);
v0 = 0;
memset(&Dst, 0, 0x3FFu);
v5 = 0;
v4 = FindResourceA(0, "rc.rc", 6);
v5 = 272;
LoadStringA(0, 272, &v0, 1023);
v2 = MD5::digestString((MD5 *)&v3, &v0);
MessageBoxA(0, v2, "We've been compromised!", 48);
ExitProcess(0);
}

字符串资源的格式

与其他资源格式不同,在其他资源格式中,资源标识符与*.rc文件中列出的值相同,字符串资源打包在"bundle"中。

*.rc文件中列出的字符串被分组为十六个一组的字符串。所以第一个丛包含字符串0到15,第二个丛包含串16到31,依此类推。

每个bundle中的字符串存储为计数UNICODE字符串,而不是以null结尾的字符串。如果编号中存在间隙,则使用空字符串。例如,如果你的字符串表只有字符串16和31,那么就会有一个bundle(数字2(,它由字符串16、14个空字符串组成,然后是字符串31。

该博客文章还包含一个LoadString实现,它展示了如何将字符串id转换为资源id,然后遍历数据以查找字符串。

在您的情况下,我相信这是字符串资源id 18,也是该捆绑包中的第一个字符串。

最新更新