在先前调用string :: find之后添加内存分配和memset会导致它返回npos。为什么?

问题描述 投票:-2回答:1

我正在逆向设计一个名为Monster Hunter World的游戏来添加一个更好的鼠标处理子程序,我的软件中会弹出一个非常奇怪的错误。我不知道究竟是什么导致它,但我可以解释一些症状,我强烈怀疑内存腐败。

当我在包含MonsterHunterWorld.exe的整个二进制文件的字符串上使用string::find来查找用于校验文件的保护机制的字节模式并且如果检测到任何修改时故意使程序崩溃,则会出现问题。直到最近我的代码更改我的软件才能成功找到这些字节模式,我的代码的以下更改导致string::find函数失败:

char buffer2[5000];
memset(buffer2, 0, sizeof(buffer2));

这是在调用find函数之后。如果我从程序中删除它,它按预期工作(对string :: find的调用正确找到我搜索的字节模式)。

作为参考,该程序的完整源代码可以在这个粘贴bin-https://pastebin.com/7ExgmXNZ中找到

我检查的其他东西是我决定在x64dbg中打开软件,我发现我用string :: find搜索的模式实际上是在它正在搜索的字符串中,但由于某种原因它无论如何都会失败。

源代码使用64位MingW版本8.1.0编译

编辑:将pastebin更改为重现问题所需的最小代码

更新:我能够为我的特定程序解决问题,但我不满意,因为我不完全理解为什么解决方案有效。在我作为strstring::find参数提供的char数组的末尾,我手动添加一个空终止0x00。 AFAIK char数组初始化如下:

char foo[] = {0x68, 0x69}; //"hi"

应该自动添加空终止符吗?如果这是不真实的,有人请纠正我,因为这对我来说是一个非常严重的错误,这意味着程序之前工作的唯一原因是我的char数组旁边的内存恰好是0x00。

c++ x86-64
1个回答
0
投票

原来发生这种情况的原因是因为string::find(const CharT* str, size_type pos = 0 );期望str参数的空终止符,我认为我的char数组会自动给出一个。

事实并非如此,之前它工作的原因完全是由于相邻内存为0x00的运气,现在我更改了代码,相邻内存更改为0x40并导致string :: find搜索错误的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.