尝试从另一个进程读取32位整数时,ReadProcessMemory使应用程序崩溃

时间:2019-03-21 17:03:30

标签: c++ windows winapi process readprocessmemory

我一直在尝试Windows API的各个方面,并认为我会尝试对进程内存进行操作。以前,我一直尝试使用以下方法在本机C ++中执行此操作:C++ - Get value of a particular memory address

但是,此方法不起作用,我在Cplusplus论坛上的某个地方找到了一个响应,告诉我使用ReadProcessMemory。我发现WriteProcessMemory在尝试编辑值时工作得很好,但是ReadProcessMemory要么失败(返回错误代码299),要么使应用程序崩溃。

这是我的代码:

public
├───views
|   └───src
|   |    ├─── style.css
|   |    └─── index.js
|   |
|   └─ index.html
|
└───app.js

我注意到,当num_bytes_read变量是指针(ReadProcessMemory的第5个参数是num_bytes_read变量)时,应用程序崩溃,当它不是指针时(ReadProcessMemory的第5个参数是指向该指针的指针),它将引发错误299。 num_bytes_read变量)。

这是memory_edit_test.cpp的代码:

#include <iostream>
#include <cstdint>
#include <Windows.h>
#include <cstdio>

using namespace std;

int main()
{
    LPVOID bytes;
    DWORD pid;
    SIZE_T *num_bytes_read;
    int temp;
    SIZE_T size = sizeof(temp);
    LPCVOID address = reinterpret_cast<int*>(0x404004);
    HWND hwnd = FindWindow(NULL, "C:\\Users\\Delkarix\\Desktop\\memory_edit_test.exe");
    GetWindowThreadProcessId(hwnd, &pid);
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

    BOOL worked = ReadProcessMemory(hProcess, address, bytes, size, num_bytes_read);
    cout << "ERROR: " << GetLastError() << endl;
    cout << "PROCESS: " << hProcess << endl;
    cout << "BYTES: " << bytes << endl;
    cout << "BASE ADDRESS: " << address << endl;
    cout << "FUNCTION SUCCESS: " << worked << endl;
    cout << "BYTES READ: " << *num_bytes_read << endl;
    CloseHandle(hProcess);
}

如何使ReadProcessMemory成功?在StackOverflow上回答类似问题的答案无济于事,否则只会使问题变得更糟。

1 个答案:

答案 0 :(得分:2)

问题非常简单,ReadProcessMemory的第三个参数旨在指向一个缓冲区,将读取的内存写入该缓冲区。您只是给它一个非初始化的指针。第五个参数也有类似的问题。

您的代码应如下所示

int temp;
SIZE_T num_bytes_read;
BOOL worked = ReadProcessMemory(hProcess, address, &temp, sizeof temp, &num_bytes_read);

请注意,第三个和第五个参数是已存在的内存的指针。声明一个变量,然后使用&获取其地址。