我有一个被注入(inject)到游戏进程中的 .dll 文件。它尝试从特定内存区域读取一个小字符串,但每当该字符串作为 std::string 访问时,游戏就会崩溃。我才刚刚开始了解程序内存的工作原理,所以我迷路了。
在这个游戏中,有一些具有特定属性的对象实例。这些属性始终具有相同的偏移量。我试图读取的属性是 Name 属性,它对每个可能的实例都有一个 0x28 的偏移量。这是我用来从实例中获取名称的函数:
std::string* GetName(int Instance) {
return (std::string*)(*(int*)(Instance + 0x28));
}
我使用了调试器/反汇编器来验证实例是否有效以及生成的指针是否具有我需要的值。但是,一旦我尝试用它做点什么,游戏就会崩溃。例如,这个:
std::string objName = *GetName(obj);
或者这个:
std::cout << *GetName(obj);
甚至这个(当我足够绝望时):
std::string* objName = (std::string*) obj + 0x28;
std::cout << *objName;
我尝试将我的 IDE 调试器附加到游戏中,当崩溃发生时,我得到的最有用的信息是“段错误”。即使是帮助我解决这个问题的知识渊博的 friend 也不知道哪里出了问题。
如果这里没有足够的信息来找出问题所在,我是否可以至少在正确的方向上得到一点插入?可能是什么原因造成的?
最佳答案
正如 MacroVirus 在评论中指出的那样,解决方案是将值存储在 char* 中,然后将其转换为新的 std::string 实例。它现在可以完美运行。这是修改后的函数:
char* GetName(int Instance) {
return (char*)(*(int*)(Instance + 0x28));
}
感谢您的帮助!这让我发疯。
关于c++ - 尝试从注入(inject)的 .dll 中的指针读取字符串时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36401548/