Python 未正确添加偏移量

问题描述 投票:0回答:3

我正在编写一个程序来更改给定内存地址处的值,我已经使用 Cheat Engine 计算出了指针

我找到了

UnityPlayer.dll
的图像库,并且在作弊引擎中,一切似乎都工作正常

但是,当我尝试在 python 中实现相同的功能时,遇到了一些问题

pm = pymem.Pymem("hollow_knight.exe")
#204F36DB1C4

gameModule = module_from_name(pm.process_handle, "UnityPlayer.dll").lpBaseOfDll
print(gameModule)

def getPtrAddress(base, offsets):
    addr = pm.read_int(base)
    for i in offsets:
        if i != offsets[-1]:
            addr = pm.read_int(addr + i)
    addr =  addr + offsets[-1]
    return addr

geo = pm.read_int(getPtrAddress(gameModule+0x019B8900, offsets = [0x0, 0xD8, 0x268, 0xC8, 0x1C4]))
print(geo)

运行此代码时,我遇到错误,因为我尝试访问的内存地址不存在。

pymem.exception.MemoryReadError: Could not read memory at: 6257936, length: 4 - GetLastError: 299
python memory memory-address cheat-engine
3个回答
0
投票

根据文档这里

read_int(self, address)

“从指定进程中的内存区域读取 4 个字节。”

现在应用程序似乎是64位应用程序,因为这样的指针是8字节。您只阅读了地址的一半。


0
投票

更新:我能够通过使用 RemotePointers 解决该问题

pm = Pymem("hollow_knight.exe")
gameModule = module_from_name(pm.process_handle, "UnityPlayer.dll").lpBaseOfDll


def getPointerAddress(base, offsets):
    remote_pointer = RemotePointer(pm.process_handle, base)
    for offset in offsets:
        if offset != offsets[-1]:
            remote_pointer = RemotePointer(pm.process_handle, remote_pointer.value + offset)
        else:
            return remote_pointer.value + offset
while True:
    if keyboard.is_pressed("q"):
        geo = pm.read_int(getPointerAddress(gameModule+0x019B8900, offsets=[0x0, 0xD8, 0x268, 0xC8, 0x1C4]))
        pm.write_int(getPointerAddress(gameModule+0x019B8900, offsets=[0x0, 0xD8, 0x268, 0xC8, 0x1C4]), geo+1)

0
投票

抱歉再次提出这个问题,但 RemotePointer 似乎不是 Pymem 的一部分?您可以添加您的导入,以便我可以更好地遵循您的代码吗?谢谢 @Himanshu Sardana

© www.soinside.com 2019 - 2024. All rights reserved.