我正在为名为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);
}
}
现在在我用来查看内存地址的工具(作弊引擎)中,我可以更改该值,但是在我的程序中我不能。
任何帮助将不胜感激。
答案 0 :(得分:0)
您在评论中声明WriteProcessMemory
返回1。在这种情况下,与您的信念相反,该值已成功写入。
也许您正在写入错误的地址,或者程序正在覆盖该值。但是,当函数返回非零值时,表示函数成功。
顺便说一句,我强烈建议您以后开始包含错误检查代码。如果这样做,您将意识到该函数调用已成功。
答案 1 :(得分:0)
您的逻辑不正确。
0x0050F4F4是指向本地播放器对象的指针。
0xF8是相对于本地播放器对象的运行状况偏移。
您正在将它们加在一起,认为这是运行状况变量的地址,而不是。您需要在0x0050F4F4上读取ReadProcessMemory,这将为您提供目标缓冲区中本地播放器对象的地址。然后向其添加0xF8,这将生成本地播放器运行状况变量的地址。然后,您在该地址上调用WriteProcessMemory并将其覆盖。