为何添加偏移量后内存地址变为负数?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
相关产品推荐
相关产品推荐

