C++ 尝试从注入的.dll中的指针读取字符串时出现SEGFULT
我有一个.dll文件,它被注入到游戏进程中。它试图从内存的特定区域读取一个小字符串,但每当该字符串作为std::string访问时,游戏就会崩溃。我刚刚开始了解程序内存的工作原理,所以我迷路了 在这个游戏中,存在具有特定属性的对象实例。这些特性始终具有相同的偏移量。我试图读取的属性是Name属性,对于每个可能的实例,其偏移量为0x28。这是我用来从实例获取名称的函数:C++ 尝试从注入的.dll中的指针读取字符串时出现SEGFULT,c++,memory,segmentation-fault,reverse-engineering,dll-injection,C++,Memory,Segmentation Fault,Reverse Engineering,Dll Injection,我有一个.dll文件,它被注入到游戏进程中。它试图从内存的特定区域读取一个小字符串,但每当该字符串作为std::string访问时,游戏就会崩溃。我刚刚开始了解程序内存的工作原理,所以我迷路了 在这个游戏中,存在具有特定属性的对象实例。这些特性始终具有相同的偏移量。我试图读取的属性是Name属性,对于每个可能的实例,其偏移量为0x28。这是我用来从实例获取名称的函数: std::string* GetName(int Instance) { return (std::string*)(*
std::string* GetName(int Instance) {
return (std::string*)(*(int*)(Instance + 0x28));
}
我使用了调试器/反汇编程序来验证实例是否有效,以及生成的指针是否具有我需要的值。然而,一旦我试图用它做些什么,游戏就崩溃了。例如,这:
std::string objName = *GetName(obj);
或者这个:
std::cout << *GetName(obj);
正如MacroVirus在评论中指出的,解决方案是将值存储在char*中,然后将其转换为新的std::string实例。它现在可以完美地工作。以下是修改后的功能:
char* GetName(int Instance) {
return (char*)(*(int*)(Instance + 0x28));
}
谢谢你的帮助!这让我抓狂。正如MacroVirus在评论中指出的,解决方案是将值存储在char*中,然后将其转换为新的std::string实例。它现在可以完美地工作。以下是修改后的功能:
char* GetName(int Instance) {
return (char*)(*(int*)(Instance + 0x28));
}
谢谢你的帮助!这让我抓狂。它可能是一个C字符串(以0结尾),也称为
char*
。与其将内存强制为std::string*
,不如将其强制为char*
,然后从中构造一个新的std::string
实例。如果您还想对其进行读写,那么无论如何都需要将其作为char*
(C-string)使用。鉴于你目前对内存和C++类型的理解,在这样一个项目中,用记忆来处理一个项目可能太有挑战性了。当您说“从它构造一个新的std::string实例”时,您的确切意思是什么?你指的是什么特别的东西吗?@我弄明白了,它现在开始工作了!我可以输出东西,但这只是胡言乱语。这总比什么都没有好,我想这一定意味着我需要在别处寻找这个名字。感谢您的帮助。它可能是一个C字符串(以0结尾),也称为char*
。与其将内存强制为std::string*
,不如将其强制为char*
,然后从中构造一个新的std::string
实例。如果您还想对其进行读写,那么无论如何都需要将其作为char*
(C-string)使用。鉴于你目前对内存和C++类型的理解,在这样一个项目中,用记忆来处理一个项目可能太有挑战性了。当您说“从它构造一个新的std::string实例”时,您的确切意思是什么?你指的是什么特别的东西吗?@我弄明白了,它现在开始工作了!我可以输出东西,但这只是胡言乱语。这总比什么都没有好,我想这一定意味着我需要在别处寻找这个名字。谢谢你的帮助。