使用Pymem操作CSGO内存时报错998无法定位行,求代码修复方案
Pymem读取CSGO内存报错998修复方案
报错信息:
Could not read memory at: -63746652, length: 4 - GetLastError: 998
该报错为Windows系统标准错误码,含义是内存访问无效,即你尝试读取的目标地址属于进程不可访问的地址范围。核心问题是你的代码没有对读取到的中间指针做有效性校验,且所有读取操作放在同一个try块中无法定位具体错误点。
问题根因
- 没有校验
dwLocalPlayer读取结果:如果本地玩家未加载(比如还在加载界面、未进入对局),读出来的player值为0或无效值,后续读取player + m_iCrosshairId等操作直接访问非法地址 - 没有校验
crosshairID的合法范围:CSGO中crosshairID合法范围是0~64,当准星没有对准任何玩家时crosshairID为0,此时计算(crosshairID - 1) * 0x10会得到负偏移,叠加基址后就是你报错的负地址 - 没有校验
getcrosshairTarget读取结果:如果crosshairID对应的实体不存在,读出来的指针为无效值,后续读取该指针的偏移也会触发报错 - 所有读取操作放在同一个try块中,捕获异常后无法区分具体是哪一步读取失败
- 原函数参数中传入的
engine_pointer、player无实际作用,函数内会重新赋值覆盖
修复后代码
from Utils.Offsets import * def GetPlayerVars(pm, client, engine): try: # 读取本地玩家指针并校验 player = pm.read_int(client + dwLocalPlayer) if not player: print("无效本地玩家指针") return None # 读取engine指针并校验 engine_pointer = pm.read_int(engine + dwClientState) if not engine_pointer: print("无效engine指针") return None # 读取glow管理器指针并校验 glow_manager = pm.read_int(client + dwGlowObjectManager) if not glow_manager: print("无效glow管理器指针") return None # 读取本地玩家队伍编号 localTeam = pm.read_int(player + m_iTeamNum) # 读取准星ID crosshairID = pm.read_int(player + m_iCrosshairId) # 仅crosshairID在合法范围时读取实体信息 getcrosshairTarget = 0 immunitygunganme = 0 crosshairTeam = 0 if 1 <= crosshairID <= 64: getcrosshairTarget = pm.read_int(client + dwEntityList + (crosshairID - 1) * 0x10) if getcrosshairTarget: immunitygunganme = pm.read_int(getcrosshairTarget + m_bGunGameImmunity) crosshairTeam = pm.read_int(getcrosshairTarget + m_iTeamNum) # 读取视角Y轴角度 y_angle = pm.read_float(engine_pointer + dwClientState_ViewAngles + 0x4) except Exception as e: # 打印完整回溯信息定位错误行 import traceback traceback.print_exc() return None return player, engine_pointer, glow_manager, crosshairID, getcrosshairTarget, immunitygunganme, localTeam, crosshairTeam, y_angle
内容的提问来源于stack exchange,提问作者DisplayPyMeme
相关产品推荐
相关产品推荐

