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

使用Cheat Engine与Pymem修改游戏计时器失败,遇内存读取错误

解决Pymem读取SHIFT.exe内存时的GetLastError:299错误

问题描述

使用Cheat Engine 7.4和Pymem库修改SHIFT.exe游戏计时器时,触发内存读取错误:

Could not read memory at: , length: 4 - GetLastError: 299

相关代码

from pymem import *
from pymem.process import *

pm = pymem.Pymem("SHIFT.exe")

gameModule = module_from_name(pm.process_handle , "SHIFT.exe").lpBaseOfDll

def GetptrAddr(base , offsets):
    addr = pm.read_int(base)
    for i in offsets:
        if i != offsets[-1]:
            addr = pm.read_int(addr + i) # 错误触发点:Could not read memory at: 1715211616, length: 4 - GetLastError: 299
    return addr + offsets[-1]

while True:
    pm.write_int(GetptrAddr(gameModule + 0x001F30AC, [0x8E4,0x2C,0x20,0x14,0x10,0x28,0x5C]),11)

补充信息

  • Cheat Engine指针截图:显示静态基址为SHIFT.exe + 0x001F30AC,偏移链为0x8E4 → 0x2C → 0x20 → 0x14 → 0x10 → 0x28 → 0x5C
  • Pymem报错截图:明确显示内存读取失败及错误码299

解决方法

1. 修正指针遍历逻辑

原函数对偏移链的处理存在逻辑漏洞,正确流程是:先读取基址+静态偏移的指针值,再依次遍历除最后一个外的偏移,每次读取指针+偏移后的内存值,最后加上最后一个偏移得到目标地址。

2. 匹配进程位数

错误码299常见于32位/64位不匹配:

  • 检查SHIFT.exe是32位还是64位进程
  • 若为64位,需用read_longlong读取8字节指针,而非read_int(4字节);同时Python运行环境位数要与进程一致

3. 提升权限与检查反作弊

  • 以管理员权限运行脚本,确保具备内存读写权限
  • 确认游戏未启用反作弊机制(部分游戏会阻止外部进程读写内存)

4. 验证基址与偏移

核对Cheat Engine中的静态基址偏移0x001F30AC是否与代码一致,偏移链顺序是否完全匹配

5. 优化循环写入逻辑

无限高频写入可能触发内存保护,添加小延迟降低读写频率

修正后的完整代码

from pymem import Pymem
from pymem.process import module_from_name
import time

pm = Pymem("SHIFT.exe")
gameModule = module_from_name(pm.process_handle, "SHIFT.exe").lpBaseOfDll

def GetptrAddr(base, offsets):
    try:
        # 根据进程位数选择读取方式
        addr = pm.read_longlong(base) if pm.is_64bit else pm.read_int(base)
        # 遍历除最后一个外的所有偏移
        for offset in offsets[:-1]:
            addr = pm.read_longlong(addr + offset) if pm.is_64bit else pm.read_int(addr + offset)
            if addr == 0:
                raise ValueError("无效的指针地址")
        return addr + offsets[-1]
    except Exception as e:
        print(f"指针遍历失败: {e}")
        return None

while True:
    target_addr = GetptrAddr(gameModule + 0x001F30AC, [0x8E4, 0x2C, 0x20, 0x14, 0x10, 0x28, 0x5C])
    if target_addr:
        try:
            pm.write_int(target_addr, 11)
        except Exception as e:
            print(f"写入失败: {e}")
    # 添加延迟避免高频操作
    time.sleep(0.1)

内容的提问来源于stack exchange,提问作者Blare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:22:49