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

问题描述 投票:0回答:1

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

但是,这种方法不起作用,我在Cplusplus论坛的某处发现了一个响应,告诉我使用ReadProcessMemory。我发现WriteProcessMemory在尝试编辑值时工作正常,但ReadProcessMemory失败(返回错误代码299)或崩溃应用程序。

这是我的代码:

#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);
}

我注意到当num_bytes_read变量是一个指针(ReadProcessMemory的第五个参数是num_bytes_read变量)时应用程序崩溃,当它不是一个指针时抛出错误299(ReadProcessMemory的第五个参数是指向num_bytes_read变量的指针) 。

这是memory_edit_test.cpp的代码:

#include <iostream>

using namespace std;

int test = 6;
int main() {
    string input;
    cout << &test << endl; // Where I got the address 0x404004
    getline(cin, input);
    cout << test << endl; // Used to check the value against the one I got from ReadProcessMemory
    getline(cin, input);
}

如何让ReadProcessMemory成功? StackOverflow上类似问题的答案要么什么也不做,否则它们会让问题变得更糟。

c++ windows winapi process readprocessmemory
1个回答
2
投票

问题非常简单,ReadProcessMemory的第三个参数意味着指向一个缓冲区,其中将写入内存读取。你只需给它一个非实体指针。与第五个参数类似的问题也是如此。

你的代码应该是这样的

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

注意第三和第五个参数是指向已有内存的指针。声明一个变量并使用&获取其地址。

© www.soinside.com 2019 - 2024. All rights reserved.