首页 > 解决方案 > 在之前调用 string::find 之后添加内存分配和 memset 会导致它返回 npos。为什么?

问题描述

我正在对一款名为 Monster Hunter World 的游戏进行逆向工程,以添加更好的鼠标处理子程序,但我的软件中弹出了一个非常奇怪的错误。我不确切知道是什么原因造成的,但我可以解释一些症状,我强烈怀疑内存损坏。

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

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

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

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

我检查的另一件事是我决定在 x64dbg 中打开软件,我发现我用 string::find 搜索的模式实际上在它正在搜索的字符串中,但由于某种原因它还是失败了。

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

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

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

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

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

标签: c++x86-64

解决方案


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

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


推荐阅读