【发布时间】:2018-08-30 18:50:46
【问题描述】:
我已经编码了几年,但在 2016 年我休息了几年。现在我决定回来,所以我想玩一些逆向工程。 我玩了一款名为 Black Ops 1: Zombies 的游戏。我找到了内存地址,然后我用 C++ 编写了一个简单的无限弹药作弊代码(这是离线的),但它不起作用,所以尝试使用 ReadProcessMemory 来查看它是否提供了正确的弹药。控制台开始打印出“0”。我认为代码可能有问题,所以我查找了一些较旧的源代码,代码相同,尝试安装 VS 2015 以防编译器出现问题,仍然没有,尝试了 GNCC 编译器,仍然没有。尝试在我的第二台计算机上使用它并且它有效。我尝试禁用防病毒和 Windows Defender,但仍然没有。 如果有任何意义,这里是源代码:
#include <iostream>
#include <Windows.h>
using namespace std;
DWORD Address = 0x180A6C8;
DWORD pID;
int points;
int main()
{
while (true)
{
HWND hWnd = FindWindowA(0, ("Call of Duty®: BlackOps"));
GetWindowThreadProcessId(hWnd, &pID);
HANDLE pHandle = OpenProcess(PROCESS_VM_READ, FALSE, pID);
ReadProcessMemory(pHandle, (LPVOID)Address, &points, sizeof(points), 0);
cout << points << endl;
Sleep(100);
}
}
【问题讨论】:
-
您没有进行任何错误处理。
FindWindow()是否找到有效的HWND?如果是这样,OpenProcess()是否返回有效的HANDLE?如果是这样,ReadProcessMemory()是否返回 TRUE?如果其中任何一个失败,GetLastError()说的原因是什么?你确定你甚至有正确的内存地址吗?确保您没有受到Address Space Layout Randomization (ASLR) 的影响。您应该使用相对于您正在读取的进程的基地址的偏移量。 -
现在全部测试了,还是不行,在我的第二台电脑上可以正常使用,所以地址或代码没有问题,我不受ASLR的影响
-
你显然做错了什么。如果您正确使用它、执行足够的错误处理并具有访问目标进程的适当权限,我所描述的将在所有计算机上正常工作。
-
GetLastError 返回 0,得到一个字符串函数,也是 null,我尝试禁用安全、防病毒、防火墙、Windows Defender 等,并在管理员模式下启动,仍然返回 0。我尝试使用另一个使用模块的游戏,但这返回了类似 -66756576
-
我也试过禁用UAC,还是不行
标签: c++ memory visual-c++ reverse-engineering readprocessmemory