跨进程访问C++变量失败,报错退出(错误码3221225477)
解决跨进程读写变量的内存访问错误问题
问题根源
你遇到的错误码3221225477对应Windows的STATUS_ACCESS_VIOLATION,本质原因是Windows系统中每个进程拥有独立的虚拟地址空间:
- 第一个程序输出的
coins地址是它自身虚拟地址空间中的地址,这个地址在第二个进程的虚拟空间中要么未映射,要么属于完全无关的内存区域,直接通过指针访问会触发内存保护机制,导致访问违例。
正确实现方案
要跨进程读写内存,必须使用Windows提供的进程内存操作API:OpenProcess、ReadProcessMemory和WriteProcessMemory,步骤如下:
- 获取目标进程的ID(PID)和变量的虚拟地址
- 打开目标进程并获取足够的内存操作权限
- 使用API读写目标进程的指定内存地址
修改后的第一个程序(输出PID和变量地址)
#include <iostream> #include <Windows.h> int main() { int coins = 1; // 输出当前进程ID,供第二个程序使用 std::cout << "Process ID: " << GetCurrentProcessId() << std::endl; // 输出coins的虚拟地址 std::cout << "coins address: " << &coins << std::endl; // 保持进程运行,等待第二个程序操作 Sleep(10000); return 0; }
第二个程序(跨进程读写实现)
#include <iostream> #include <Windows.h> int main() { DWORD target_pid; uintptr_t coins_address; // 输入第一个程序的PID和coins地址 std::cout << "Enter target process ID: "; std::cin >> target_pid; std::cout << "Enter coins address (hex): "; std::cin >> std::hex >> coins_address; // 打开目标进程,获取读写内存的权限 HANDLE h_process = OpenProcess( PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, target_pid ); if (h_process == NULL) { std::cout << "Failed to open process. Error code: " << GetLastError() << std::endl; return 1; } // 读取coins当前值 int current_value; if (!ReadProcessMemory( h_process, (LPCVOID)coins_address, ¤t_value, sizeof(current_value), NULL )) { std::cout << "Failed to read memory. Error code: " << GetLastError() << std::endl; CloseHandle(h_process); return 1; } std::cout << "Current coins value: " << current_value << std::endl; // 修改coins的值为100 int new_value = 100; if (!WriteProcessMemory( h_process, (LPVOID)coins_address, &new_value, sizeof(new_value), NULL )) { std::cout << "Failed to write memory. Error code: " << GetLastError() << std::endl; CloseHandle(h_process); return 1; } std::cout << "Successfully updated coins to " << new_value << std::endl; // 关闭进程句柄,释放资源 CloseHandle(h_process); return 0; }
关键注意事项
- 权限问题:运行第二个程序时可能需要管理员权限,否则
OpenProcess可能失败。 - 变量生命周期:确保第一个程序中的
coins变量在第二个程序操作时仍然存在(比如你的代码中用Sleep保持进程运行,这是可行的)。 - 地址有效性:每次启动第一个程序,
coins的虚拟地址可能会变化(因为ASLR地址空间随机化机制),所以不能硬编码地址,必须每次运行时获取最新地址。
内容的提问来源于stack exchange,提问作者yousef mohammed
相关产品推荐
相关产品推荐

