Pymem读取64位进程内存时出现MemoryReadError(GetLastError:299)问题求助
解决Pymem读取64位进程内存的错误问题
首先,你的核心问题在于针对64位进程使用了32位的内存读取方法,导致指针地址被截断,进而触发无效内存访问错误。咱们一步步来修复:
错误原因分析
MemoryReadError (GetLastError: 299):这个错误表示你尝试访问的内存地址无效。从你的输出看,
pm.read_int(base)返回的是9460301,而base是64位进程的基址(140696812060672,也就是0x7FF7开头的64位地址)。问题出在read_int——它只能读取4字节的32位整数,但64位进程的指针是8字节的,所以你只读到了指针的低4字节,导致后续计算的地址都是无效的小数值。ctypes.ArgumentError: OverflowError:这是因为你参考的教程可能是针对32位进程的,当你把64位的地址传递给只支持32位的函数时,就会触发整数溢出错误。
修复后的代码
针对64位进程,你需要使用read_longlong来读取8字节的指针地址,同时调整整个指针遍历逻辑:
from pymem import * from pymem.process import module_from_name pm = pymem.Pymem("***-Win64.exe") gameModule = module_from_name(pm.process_handle, "***-Win64.exe").lpBaseOfDll def GetPtrAddr(base, offsets): # 64位进程用read_longlong读取8字节指针 addr = pm.read_longlong(base) for i in offsets[:-1]: # 遍历除最后一个偏移外的所有偏移 addr = pm.read_longlong(addr + i) # 可选:添加地址有效性检查,避免无效访问 if addr == 0: raise ValueError("Invalid pointer encountered") return addr + offsets[-1] # 读取目标值(因为目标是0-12的整数,用read_int没问题,它是4字节整数) target_value = pm.read_int(GetPtrAddr(gameModule + 0x04D934B0, [0x50, 0x30, 0x98, 0xf0, 0x380])) print(f"目标值: {target_value}")
额外注意事项
- 确认你使用的Pymem版本支持64位进程,建议安装最新版:
pip install --upgrade pymem - 运行脚本时需要管理员权限,否则可能无法访问目标进程的内存
- 可以在循环中添加错误捕获,方便调试:
def GetPtrAddr(base, offsets): addr = pm.read_longlong(base) for idx, i in enumerate(offsets[:-1]): try: addr = pm.read_longlong(addr + i) except pymem.exception.MemoryReadError as e: print(f"遍历偏移 {hex(i)} 时出错: {e}") raise return addr + offsets[-1]
内容的提问来源于stack exchange,提问作者Kal-1
相关产品推荐
相关产品推荐

