c++ - 尝试从注入(inject)的 .dll 中的指针读取字符串时出现段错误

标签 c++ memory segmentation-fault reverse-engineering dll-injection

我有一个被注入(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/

相关文章:

c++ - Microsoft C 异常:内存位置 0x0017F5E0 处的 std::bad_alloc

c - 为什么我会遇到段错误?

android - 如何创建虚拟(在内存中)SD 卡?

c++ - 使用 malloc 分配比现有内存更多的内存

c - 给出段错误的简单程序,无法弄清楚奇怪的行为

c++ - 段错误 : Address out of bounds for a pointer in C

c++ - 使用 Qt 获取一些具有 KEY 字符的 ascii 值

c# - "C# base class virtual function"- "override in Managed C++ ref class"

c++ - 使用默认参数重载构造函数

C (或 asm) : how to execute c code stored in memory (copied from labels)