c++ - 在之前调用 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。
解决方案
事实证明,发生这种情况的原因是因为 string::find(const CharT* str, size_type pos = 0 );
期望参数有一个空终止符,str
我认为我的 char 数组会自动给出一个。
事实并非如此,它之前工作的原因完全是由于运气相邻内存为0x00,现在我更改了代码相邻内存更改为0x40并导致string::find搜索错误的字符串.
推荐阅读
- python - 根据某些标准查找列表的共同元素?
- amazon-web-services - 在 AWS CloudWatch 日志组中分离环境和微服务上下文的推荐最佳实践是什么?
- python - Python:努力使用 unicode 字符转换 .txt 文件
- rust - /usr/bin/link: 编译位标志时在 '\377\376"' 之后缺少操作数
- java - 如何找到在我的 mac 上下载的 JDK 的路径?
- c++ - 从 QT Creator 中运行的 QT+openCV 项目构建一个独立的 exe 文件
- javascript - 用对象数组更新对象数组
- javascript - 从 Html 文件 HtmlService.createHtmlOutputFromFile 内部调用脚本
- postgresql - Google 签名令牌 - 请求签名无效 (Postgresql)
- python - Python3搜索正在运行的windows进程的虚拟内存