如何在不同的过程中以偏移量写入内存地址

时间:2018-10-27 16:49:08

标签: c++ winapi memory

我正在为名为AssaultCube的游戏进行黑客攻击,玩家的基本地址为0x0050F4F4,“健康”地址为0x0050F4F4 + 0xF8,问题是,我无法写入该地址即使具有完全访问权限。

我的代码:

#include <Windows.h>
#include <iostream>

using namespace std;

int main() {
    HWND window = FindWindowA(NULL,"AssaultCube");
    int value = 888;
    if(window == NULL) {
        cout << "Can't find window!";
        exit(-1);
    }
    DWORD pid;
    GetWindowThreadProcessId(window,&pid);
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
    while(true) {
        WriteProcessMemory(handle,reinterpret_cast<LPVOID>(0x0050F4F4 + 0xF8),&value,sizeof(value),0);
        Sleep(750);
    }
}

现在在我用来查看内存地址的工具(作弊引擎)中,我可以更改该值,但是在我的程序中我不能。

Cheat Engine

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您在评论中声明WriteProcessMemory返回1。在这种情况下,与您的信念相反,该值已成功写入。

也许您正在写入错误的地址,或者程序正在覆盖该值。但是,当函数返回非零值时,表示函数成功。

顺便说一句,我强烈建议您以后开始包含错误检查代码。如果这样做,您将意识到该函数调用已成功。

答案 1 :(得分:0)

您的逻辑不正确。

0x0050F4F4是指向本地播放器对象的指针。

0xF8是相对于本地播放器对象的运行状况偏移。

您正在将它们加在一起,认为这是运行状况变量的地址,而不是。您需要在0x0050F4F4上读取ReadProcessMemory,这将为您提供目标缓冲区中本地播放器对象的地址。然后向其添加0xF8,这将生成本地播放器运行状况变量的地址。然后,您在该地址上调用WriteProcessMemory并将其覆盖。