提问者:小点点

我无法从内存中读取值


所以我试着从一个游戏中读取一些值。 我可以通过欺骗引擎成功地从游戏中读取数据。 但是当我尝试将值输入代码并接收值时,我只得到0。 然而,当我尝试用其他一些程序做同样的事情时,它没有问题。 这是代码

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

DWORD pid;
DWORD adr = 0x23CAE074AA8;
int my_value;

int main(){

    HWND hWnd = FindWindowA(0, ("game"));

    GetWindowThreadProcessId(hWnd, &pid);
    std::cout << pid << std::endl;
    HANDLE pHandle = OpenProcess(PROCESS_VM_READ, FALSE, pid);
    while(1){
        ReadProcessMemory(pHandle, (LPVOID)adr, &my_value, sizeof(my_value),0);
        std::cout << my_value << std::endl;
    }
}

我想问题是我的地址太长了。 其他程序地址的长度较短。 它还给出了以下错误:

Description Resource    Path    Location    Type
cast to pointer from integer of different size [-Wint-to-pointer-cast]  read_memory.cpp /read_memory/src    line 17 C/C++ Problem
Description Resource    Path    Location    Type
overflow in conversion from 'long long int' to 'LONG' {aka 'long int'} changes value from '2459641006760' to '-1375253848' [-Woverflow] read_memory.cpp /read_memory/src    line 6  C/C++ Problem

共1个答案

匿名用户

正如消息所说,DWORD似乎太小,无法在您的环境中存储地址。

您应该使用标题CSTDINT中的UINTPTR_T来存储要用作指针的整数。

#include <iostream>
#include <Windows.h>
#include <string>
#include <cstdint> // add this

DWORD pid;
uintptr_t adr = 0x23CAE074AA8; // change type

// ...