尝试从另一个进程读取 32 位整数时,ReadProcessMemory 使应用程序崩溃
ReadProcessMemory Crashes Application When Trying to Read 32bit Integer From Another Process
我一直在尝试 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 的第 5 个参数是 num_bytes_read 变量)并且当它不是指针时抛出错误 299( ReadProcessMemory 的第 5 个参数是指向 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 成功? Whosebug 上类似问题的答案要么什么都不做,要么只会让问题变得更糟。
问题很简单,ReadProcessMemory
的第三个参数是指向一个缓冲区,内存读取将写入到缓冲区。您只需给它一个未初始化的指针。第五个参数也有类似的问题。
您的代码应如下所示
int temp;
SIZE_T num_bytes_read;
BOOL worked = ReadProcessMemory(hProcess, address, &temp, sizeof temp, &num_bytes_read);
注意第三个和第五个参数是指向已经存在的内存的指针。声明一个变量并使用 &
获取其地址。
我一直在尝试 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 的第 5 个参数是 num_bytes_read 变量)并且当它不是指针时抛出错误 299( ReadProcessMemory 的第 5 个参数是指向 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 成功? Whosebug 上类似问题的答案要么什么都不做,要么只会让问题变得更糟。
问题很简单,ReadProcessMemory
的第三个参数是指向一个缓冲区,内存读取将写入到缓冲区。您只需给它一个未初始化的指针。第五个参数也有类似的问题。
您的代码应如下所示
int temp;
SIZE_T num_bytes_read;
BOOL worked = ReadProcessMemory(hProcess, address, &temp, sizeof temp, &num_bytes_read);
注意第三个和第五个参数是指向已经存在的内存的指针。声明一个变量并使用 &
获取其地址。