【问题标题】:Readprocessmemory in C++ won't readC ++中的Readprocessmemory不会读取
【发布时间】: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


【解决方案1】:

A.) 你能在作弊引擎等中读取地址吗

B.) 它是否需要基地址(例如“client.dll”)?如果是,则获取所需模块的模块基地址。

【讨论】:

  • 不确定您的意思是什么?有标签,问题很简单:为什么它不会从一台计算机上的内存读取而在另一台计算机上读取
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 2016-03-31
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多