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

为何添加偏移量后内存地址变为负数?Python游戏内存编辑问题

解决Pymem读取《KingdomsAndCastles.exe》内存出现负地址的问题

问题根源

你遇到的负地址是32位有符号整数溢出导致的:read_int方法读取的是32位有符号整数,而《KingdomsAndCastles.exe》是64位游戏,其内存地址远大于32位有符号整数的最大值(2^31-1),超出范围后数值会被解析为负数。另外你的指针遍历逻辑也存在小问题。

修复方案

1. 改用64位地址读取方法

将代码中所有Mem.read_int替换为Mem.read_ulonglong,该方法读取的是无符号64位整数,能正确处理64位程序的内存地址,避免溢出成负数。

2. 修正指针遍历逻辑

原代码的循环处理存在冗余,正确的指针遍历应该是遍历前n-1个偏移,最后再加上最后一个偏移得到最终地址。

修正后的完整代码:

from pymem import *
from pymem.process import *

Mem = Pymem("KingdomsAndCastles.exe")
BaseAddress = module_from_name(Mem.process_handle, "mono-2.0-bdwgc.dll").lpBaseOfDll
Offsets = [0x5C, 0x0, 0xD0, 0x10, 0x558, 0xB0]

def GetPointerAddress(Base, Offsets):
    # 读取基址对应的64位地址
    Address = Mem.read_ulonglong(Base)
    # 遍历除最后一个外的所有偏移,逐层获取指针地址
    for Offset in Offsets[:-1]:
        Address = Mem.read_ulonglong(Address + Offset)
    # 加上最后一个偏移得到最终可写入的地址
    Address += Offsets[-1]
    return Address

PointerAddress = GetPointerAddress(BaseAddress + 0x00499440, Offsets)
Mem.write_int(PointerAddress, 1000)

验证说明

替换后,代码会正确读取64位的内存地址,不会再出现负数值的情况。你之前直接使用0x26320688590能成功写入,正是因为这个地址是完整的64位地址,而修正后的代码可以通过指针路径正确推导到这个地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:13:18