我有一个.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调试器附加到游戏中,我得到的最有用的信息是&#34;分段错误&#34;崩溃发生时甚至我帮助我解决这个问题的知识渊博的朋友也会对可能出现的问题感到难过。
如果这里没有足够的信息来找出问题所在,我是否至少能够朝着正确的方向努力?可能导致这种情况的原因是什么?
答案 0 :(得分:0)
正如MacroVirus在评论中所指出的,解决方案是将值存储在char *中,然后将其转换为新的std :: string实例。它现在完美无瑕。这是修订后的功能:
char* GetName(int Instance) {
return (char*)(*(int*)(Instance + 0x28));
}
谢谢你的帮助!这让我发疯了。