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

Pymem读取64位进程内存时出现MemoryReadError(GetLastError:299)问题求助

解决Pymem读取64位进程内存的错误问题

首先,你的核心问题在于针对64位进程使用了32位的内存读取方法,导致指针地址被截断,进而触发无效内存访问错误。咱们一步步来修复:

错误原因分析

  1. MemoryReadError (GetLastError: 299):这个错误表示你尝试访问的内存地址无效。从你的输出看,pm.read_int(base)返回的是9460301,而base是64位进程的基址(140696812060672,也就是0x7FF7开头的64位地址)。问题出在read_int——它只能读取4字节的32位整数,但64位进程的指针是8字节的,所以你只读到了指针的低4字节,导致后续计算的地址都是无效的小数值。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:03:14