如何读取指定内存地址内容以调试C++游戏的随机崩溃问题
你遇到的0x00000005是Windows标准的访问拒绝错误码,跨进程读内存被拒绝要么是没有调试权限,要么是目标地址本身就是未映射的非法地址,没有对应物理内存可以读取。具体操作步骤如下:
解决方法
1. 优先使用专用调试工具读取,不要自行编写小程序
- 2009年的C++游戏大概率是32位程序,准备对应架构的调试工具(x32dbg或Visual Studio均可),右键选择「以管理员身份运行」,默认普通权限的进程没有
SeDebugPrivilege调试权限,跨进程访问其他进程内存会被系统拦截 - 运行游戏后在调试器中选择「附着到进程」,选中目标game.exe进程
- 附着完成后直接在调试器的内存窗口跳转到你要查询的
0xblabla目标地址,调试器会直接显示该地址的内存状态:如果显示未映射,说明该地址本身就不属于游戏进程的有效地址空间,不存在可读取的内容,你需要回溯崩溃时的调用栈,确认这个非法地址是如何生成的;如果显示已映射,就可以直接查看内存内容
2. 崩溃发生后读取当时的内存内容,抓取转储文件分析
- 崩溃弹出错误提示框时不要关闭弹窗,打开任务管理器找到game.exe进程,右键选择「创建转储文件」,系统会将崩溃瞬间的完整进程内存、寄存器状态、调用栈全部保存为
.dmp格式的转储文件 - 用调试器直接打开转储文件,跳转到目标地址就能读取到崩溃瞬间的内存数据,无需附着运行中的进程
3. 自行编写读取程序的必要前提
- 必须先给你的C#程序提权,获取
SeDebugPrivilege系统调试权限:需要调用OpenProcessToken、LookupPrivilegeValue、AdjustTokenPrivileges三个Win32API完成提权,再调用OpenProcess传入PROCESS_VM_READ权限参数打开游戏进程 - 提权完成后调用
ReadProcessMemoryAPI读取目标地址内存,如果依然返回访问拒绝,说明目标地址为非法未映射地址,没有可读取的内容
内容的提问来源于stack exchange,提问作者ÖzgürP
相关产品推荐
相关产品推荐

