Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试从注入的.dll中的指针读取字符串时出现SEGFULT_C++_Memory_Segmentation Fault_Reverse Engineering_Dll Injection - Fatal编程技术网

C++ 尝试从注入的.dll中的指针读取字符串时出现SEGFULT

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*)(*

我有一个.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);

正如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实例”时,您的确切意思是什么?你指的是什么特别的东西吗?@我弄明白了,它现在开始工作了!我可以输出东西,但这只是胡言乱语。这总比什么都没有好,我想这一定意味着我需要在别处寻找这个名字。谢谢你的帮助。