You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现Win10下运行时修改x86应用机器码的相关问题咨询

权限报错问题修复

你出现访问违例的核心原因是API调用逻辑错误,具体修复方案如下:

  • VirtualProtect仅可修改当前进程的虚拟内存权限,游戏A是独立的外部进程,你在应用B中调用该API操作A的内存地址,实际是访问B自身进程空间内同值的虚拟地址,该地址基本为未分配的无效地址,自然触发权限错误。
  • 正确操作外部进程内存的流程如下:
    1. 调用CreateToolhelp32Snapshot遍历系统进程列表,匹配进程名获取游戏A的PID
    2. 调用OpenProcess打开游戏进程,申请PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE权限,获取进程句柄hProcess
    3. 读写外部进程内存使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:24:02