C++实现Win10下运行时修改x86应用机器码的相关问题咨询
权限报错问题修复
你出现访问违例的核心原因是API调用逻辑错误,具体修复方案如下:
VirtualProtect仅可修改当前进程的虚拟内存权限,游戏A是独立的外部进程,你在应用B中调用该API操作A的内存地址,实际是访问B自身进程空间内同值的虚拟地址,该地址基本为未分配的无效地址,自然触发权限错误。- 正确操作外部进程内存的流程如下:
- 调用
CreateToolhelp32Snapshot遍历系统进程列表,匹配进程名获取游戏A的PID - 调用
OpenProcess打开游戏进程,申请PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE权限,获取进程句柄hProcess - 读写外部进程内存使用
ReadProcessMemory/WriteProcessMemory,修改外部进程内存权限使用VirtualProtectEx,需要传入A的进程句柄作为第一个参数。
- 调用
- 修正后的写入示例代码:
// 需提前获取游戏A的进程句柄hProcess DWORD oldPermissions; BYTE* whereToWrite = (BYTE*)aExeBaseAddress + pointer; // 注意原代码此处写法错误,不能直接给BYTE*赋值数组常量 BYTE replacementCode[] = {0x90, 0x90, 0x90, 0x90, 0x90}; // 修改游戏A进程的内存权限 VirtualProtectEx(hProcess, whereToWrite, 5, PAGE_EXECUTE_READWRITE, &oldPermissions); // 直接写入游戏A的内存,无需memcpy WriteProcessMemory(hProcess, whereToWrite, replacementCode, 5, NULL); // 还原内存权限 VirtualProtectEx(hProcess, whereToWrite, 5, oldPermissions, &oldPermissions);
- 额外注意:应用B必须编译为x86架构,和目标游戏A的架构匹配,否则会出现地址计算、API调用的兼容问题。
让游戏A调用应用B逻辑的实现方案
该需求可以实现,核心逻辑为DLL注入:
- 独立进程状态下A和B的虚拟地址空间完全隔离,A无法访问B的函数地址,直接修改跳转一定会崩溃。你需要把要调用的逻辑封装为独立的DLL文件,再将DLL注入到游戏A的进程空间内,此时DLL的代码就运行在A的地址空间中,可被A直接调用。
- 你要覆盖的5字节空间刚好可以写入x86近跳转指令:指令前缀为
0xE9,后接4字节的相对偏移,偏移计算规则为DLL中目标函数地址 - patch起始地址 - 5(减去5是因为jmp指令本身长度为5字节)。 - 最简单的DLL注入方案为调用
CreateRemoteThread在游戏A进程内启动远程线程,执行LoadLibraryA加载你的DLL即可完成注入。
内容的提问来源于stack exchange,提问作者CebbyS
相关产品推荐
相关产品推荐

