Pymem提示无法找到GameAssembly.dll进程但Cheat Engine可识别该如何解决
问题根因
pymem.Pymem() 构造函数接收的参数是游戏主程序的exe进程名,而非进程内加载的dll模块名。你传入的GameAssembly.dll是Unity游戏运行时加载的核心模块,不是独立进程,因此触发进程未找到的报错。你在Cheat Engine里是先选中了游戏主进程,之后才能看到该dll模块,二者逻辑是一致的。
修复步骤
- 第一步:替换Pymem初始化参数,打开任务管理器找到对应游戏的主进程exe名称(例:
YuanShen.exe、StarRail.exe、Among Us.exe等),替换初始化参数 - 第二步:修复代码笔误,
GetPointerAddress函数中循环读取地址时误用了未定义的addr变量,和之前定义的address变量名不一致 - 第三步:适配进程架构,若你运行的是64位游戏,内存地址长度为8字节,需使用
read_longlong替代read_int读取地址,避免地址截断 - 第四步:运行脚本时确保以管理员权限启动Python环境,避免权限不足无法读取进程内存
修复后代码示例
from pymem import * from pymem.process import * # 替换为你的游戏主进程exe名称 pm = pymem.Pymem("你的游戏进程名.exe") gameModule = module_from_name(pm.process_handle, "GameAssembly.dll").lpBaseOfDll def GetPointerAddress(base, offsets): # 64位进程用read_longlong,32位保留read_int即可 address = pm.read_longlong(base) for index, offset in enumerate(offsets): if index != len(offsets) - 1: address = pm.read_longlong(address + offset) else: address += offset return address offset = 0x023BC200 offsets = [0x50, 0xB8, 0x0, 0xB8, 0x10, 0x230, 0x18, 0x30, 0x10, 0x28] while True: # 若读取的数值是4字节int保留read_int,8字节数值改为read_longlong即可 output = pm.read_int(GetPointerAddress(gameModule + offset, offsets)) print(output)
替代实现方案
如果pymem仍有兼容性问题,可以选择以下方案实现:
- 直接使用
ctypes调用Windows原生APIOpenProcess、ReadProcessMemory、GetModuleBaseAddress实现内存读取,无需依赖第三方库 - 使用
pywin32模块调用Windows系统接口实现进程内存操作,语法比原生ctypes更简洁 - 直接复用Cheat Engine的Lua脚本实现内存读写,适合已经在CE中完全调试通指针逻辑的场景
内容的提问来源于stack exchange,提问作者Alexander Jephtha
相关产品推荐
相关产品推荐

