内存编辑:无法获得正确的地址(3个偏移)

时间:2015-10-15 00:33:19

标签: c++

我正在尝试更改离线游戏中某些文字的地址。 将字符串写入内存工作,这段代码使我写入内存中的随机地址。

进程是64位。 GetModuleBase工作正常,我用它来编辑一些整数值,它工作正常(它们有一个偏移量)

Pointer&偏移在CheatEngine中运行得很好。

我试过看谷歌,没找到真正帮助我的东西

    HANDLE hProcess = GetCurrentProcess();
    DWORD* adress = (DWORD*)((DWORD*)((DWORD*)((*(DWORD*)(GetModuleBase(GetCurrentProcess(), string("MyGame.exe")) + 0x01E69FD8)) + 0x8) + 0x410) + 0x7d);//This gives some kind of random address
    WriteProcessMemory(hProcess, (void*)(adress), name.c_str(), name.length(), 0);//This works

如何获得正确的地址?

1 个答案:

答案 0 :(得分:2)

我认为这是一个外部项目,您没有参与游戏过程。我认为这是根据您对WriteProcessMemory()的使用情况得出的。与这个假设相矛盾的是您使用GetCurrentProcess()来获取调用过程的伪句柄。在外部黑客中,您不需要调用进程的句柄。也许您是内部人员,并且正在执行此操作以获取该句柄,以便以后可以使用WriteProcessMemory。您不应该在内部黑客中使用WriteProcessMemory()

您的代码在此外部项目中不起作用的原因是因为您没有取消引用指针链中的每个指针。

从您的代码中获取: *(DWORD*)

您要强制转换为指针类型,然后取消对指针的引用。您不是在目标进程内部执行,因此此取消引用作用于本地内存而不是游戏的目标内存。如果您是内部人员,则此代码看起来不错。

由于我们没有GetModuleBase()的声明,因此我不能100%地回答我,但是,您的解决方案是取消引用链中的每个指针,该指针位于每个偏移量之后,除了最后一个。在外部,您可以使用ReadProcessMemory进行此操作,在内部,您可以使用已经使用的相同方法。

以下是该函数的外部和内部版本:

//external
uintptr_t FindDMAAddy(HANDLE hProc, uintptr_t ptr, std::vector<unsigned int> offsets)
{
    uintptr_t addr = ptr;
    for (unsigned int i = 0; i < offsets.size(); ++i)
    {
        ReadProcessMemory(hProc, (BYTE*)addr, &addr, sizeof(addr), 0);
        addr += offsets[i];
    }
    return addr;
}

//internal
uintptr_t FindDMAAddy(uintptr_t ptr, std::vector<unsigned int> offsets)
{
    uintptr_t addr = ptr;
    for (unsigned int i = 0; i < offsets.size() ; ++i)
    {
        addr = *(uintptr_t*)addr;
        addr += offsets[i];
    }
    return addr;
}


//external  
uintptr_2 addr1 = FindDMAAddy(hProc, moduleBase + 0x01E69FD8, {0x8, 0x410, 0x7d});
//internal
uintptr_t addr2 = FindDMAAddy(moduleBase + 0x01E69FD8, {0x8, 0x410, 0x7d});