VSCode中C程序读取游戏进程内存地址失败,错误码322122547求助
问题描述
我运行以下代码时,始终无法执行到"Test 2",程序返回错误码322122547。我在VSCode中运行该程序,即使以管理员权限在CMD中运行也无法解决问题。代码中指定的地址来自一个正在运行的游戏.exe文件,对应当前游戏关卡的数值。
#include <stdio.h> int main() { char *address = (char*)0x004452FC; volatile char value; printf("Test 1"); while (1) { value = *address; printf("Test 2"); if (value == 1) { printf("Test 3"); break; } } return 0; }
原因分析与解决办法
- 错误码本质:你提到的错误码实际应为
3221225477(对应0xC0000005),是Windows系统的**访问违规(Access Violation)**错误。程序在执行value = *address;时直接崩溃,因此根本无法走到printf("Test 2");这一步。 - 核心问题:你硬编码的
0x004452FC是游戏进程的虚拟内存地址,这个地址仅在游戏自身的进程地址空间内有效。你的程序是独立进程,系统的内存保护机制禁止直接访问其他进程的内存空间,强行访问就会触发崩溃。 - 解决步骤:
- 获取游戏进程ID(PID):通过任务管理器找到游戏进程对应的PID。
- 调用系统API跨进程读内存:Windows平台下需用
OpenProcess打开游戏进程并获取句柄,再通过ReadProcessMemory读取目标地址的内存值,不能直接用指针访问。 - 权限与兼容性:打开进程时需指定
PROCESS_VM_READ权限,部分带反保护机制的游戏可能需要额外处理。
示例修正代码(Windows平台):
#include <stdio.h> #include <windows.h> int main() { DWORD pid = 1234; // 替换为你的游戏进程实际PID HANDLE hProcess = OpenProcess(PROCESS_VM_READ, FALSE, pid); if (hProcess == NULL) { printf("无法打开进程,错误码:%d\n", GetLastError()); return 1; } printf("Test 1\n"); while (1) { char value; // 读取游戏进程指定地址的内存 if (ReadProcessMemory(hProcess, (LPCVOID)0x004452FC, &value, sizeof(value), NULL)) { printf("Test 2\n"); if (value == 1) { printf("Test 3\n"); break; } } else { printf("读取内存失败,错误码:%d\n", GetLastError()); break; } Sleep(100); // 避免循环过度占用CPU } CloseHandle(hProcess); return 0; }
- 额外注意:
- 游戏的虚拟地址可能随版本、ASLR(地址空间布局随机化)变化,硬编码地址不稳定,建议通过特征扫描或基地址+偏移的方式动态获取目标地址。
- 部分游戏有反调试/反内存读取机制,可能需要进一步绕过相关限制。
内容的提问来源于stack exchange,提问作者JoniKauf
相关产品推荐
相关产品推荐

