ReadProcessMemory 总是读取 0

Posted

技术标签:

【中文标题】ReadProcessMemory 总是读取 0【英文标题】:ReadProcessMemory always reads 0 【发布时间】:2021-01-30 20:47:38 【问题描述】:

我正在为一个小游戏创建一个用于教育目的的作弊(目前在 Windows 上)。到目前为止,我的错误是 ReadProcessMemory 总是读取 0。

LPCVOID addr = (LPCVOID *) 0x1228A93C; // TO-DO: c++ casts 
int dest = 0;
SIZE_T read = 0;
bool error = ReadProcessMemory(process, addr, &dest, sizeof(int), &read);
if (!error) 
    printf("I read %llu w/ %u at %p\r\n", read, dest, addr);
 else 
    printf("This isn't working: %p / %llu\r\n", addr, read);
    std::cerr << "err: " << std::to_string(::GetLastError()) << std::endl;
    return (1);

在那里,我尝试读取游戏中的金额。通过使用作弊引擎,我得到了每次你使用钱时都会发生变化的值,即上面代码 sn-p 中的0x1228A93C。如果我在作弊引擎中更改此地址指向的值,游戏中的钱也会发生变化,所以我猜这是正确的地址。

尽管如此,当我运行这个 sn-p 时,我得到了这个输出:

I read 0 w/ 0 at 0x1228a93c

这意味着它不读取。

注意:还有更多代码,在我的程序中,在这个上面,但这基本上是找到游戏窗口,创建游戏快照并找到exe模块。

【问题讨论】:

请阅读ReadProcessMemory实际返回的内容。 另外,DWORDGetLastError 的返回类型)是一个无符号的 32 位整数,存在 C++ 流输出运算符 &lt;&lt; 的重载。这意味着您不需要std::to_string BOOL 操作的返回值在成功时几乎总是为真,所以它应该是 bool successif (success) 很可能存在访问权限问题:“句柄必须具有对进程的 PROCESS_VM_READ 访问权限。” @user253751 来自我链接到的参考:BOOL ReadProcessMemory(...)。所以是的,它返回一个BOOL,其中TRUE 是成功的。 【参考方案1】:

这可能就是你想要的:

LPCVOID addr = (LPCVOID *) 0x1228A93C; // TO-DO: c++ casts 
int dest = 0;
SIZE_T read = 0;
if (ReadProcessMemory(process, addr, &dest, sizeof(int), &read))

    printf("I read %llu w/ %u at %p\r\n", read, dest, addr);
 else 
    auto lasterror = ::GetLastError();               // first thing to do: call GetLastError
    printf("This isn't working: %p / %llu\r\n", addr, read);
    std::cerr << "err: " << lasterror << std::endl;  // std::to_string is useless here

如果出现错误,首先要做的是调用GetLastError(),因为你不知道cout 是否会调用SetLastError()

【讨论】:

以上是关于ReadProcessMemory 总是读取 0的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 ReadProcessMemory 在 Windows 中读取进程的程序内存吗?

ReadProcessMemory WriteProcessMemory iOS

使用 ReadProcessMemory 获取字符串值的访问冲突

ReadProcessMemory 在某些页面上失败 (GetLastError()=299)

C ++ - ReadProcessMemory 到缓冲区,WriteProcessMemory(在同一缓冲区上具有新值)将缓冲区恢复为旧值

windows:跨进程读数据