Python Pymem MemoryReadError GetLastError:299

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

从 2 天开始,我尝试阅读 pymem 的文档并在论坛上搜索错误,但我看到的所有解决方案都失败了

我不能只读取内存地址中的int,我不知道这是代码问题还是我的电脑问题

from pymem import *
from pymem.process import module_from_name


pm = pymem.Pymem("***-Win64.exe")

gameModule = module_from_name(pm.process_handle, "***-Win64.exe").lpBaseOfDll

def GetPtrAddr(base, offsets):
    addr = pm.read_int(base) # addr = 9460301, base = 140696812060672
    for i in offsets:
        if i != offsets[-1]:
            addr = pm.read_int(addr + i) # <- here is the error line
    return addr + offsets[-1]

pm.read_int(GetPtrAddr(gameModule + 0x04D934B0, [0x50, 0x30, 0x98, 0xf0, 0x380]))

错误

pymem.exception.MemoryReadError: Could not read memory at: 9460349, length: 4 - GetLastError: 299

我也尝试过这个在Python中使用静态地址和偏移量从进程中读取内存地址但我有错误

ctypes.ArgumentError: argument 2: <class 'OverflowError'>: int too long to convert

但我尝试获取的唯一值是从 0 到 12

我在for循环中添加了一个try catch,这是错误

Could not read memory at: 9460349, length: 4 - GetLastError: 299
Could not read memory at: 9460973, length: 4 - GetLastError: 299
Could not read memory at: 9460589, length: 4 - GetLastError: 299
Could not read memory at: 9460301, length: 4 - GetLastError: 299
python python-3.x memory memory-management
3个回答
1
投票

我想知道为什么你将

pm.readint()
的返回值与你的偏移量相加。看来
base
是您可以访问的有效地址,而
addr + some offset
则不是。

我从文档中读到read_int从指定进程中的内存区域读取4个字节。返回值

addr
是你要使用的地址吗?

仅供参考,我发现错误代码是kernel32抛出的,它的意思是ERROR_PARTIAL_COPY。


1
投票

我终于发现了我的错误,感谢@Joe_Bao的帮助

问题是因为我的应用程序是 64 位的,我尝试读取 int,但这还不够,所以这里是完整的代码

from pymem import *
from pymem.process import *

offsets = [0x50,0x30,0x98,0xF0,0x380]

pm = Pymem('***-Win64.exe')

gameModule = module_from_name(pm.process_handle, '***-Win64.exe').lpBaseOfDll


def GetPointer(base, offsets):
    addr = pm.read_longlong(base+0x04D934B0) # <-- here was the probleme solved
    print(hex(addr))
    for offset in offsets:
        if offset != offsets[-1]:
            try:
                addr = pm.read_longlong(addr + offset)
                print(addr)
            except Exception as e:
                print(e)
    return addr + offsets[-1]

GetPointer(gameModule, offsets)

0
投票

我想补充一点,我也得到了299,但原因不同。不要使用 foreach 样式循环来迭代偏移量。就我而言,列表中的第一个和最后一个偏移量是相同的,导致循环也跳过第一个偏移量。相反,这样做:

def GetPtrAddress(base, offsets):
    addr = pm.read_longlong(base+ 0x043B0C08)
    print(hex(addr))
    for i in range(len(offsets)-1):
        addr = pm.read_longlong(addr + offsets[i])
    return addr + offsets[-1]
© www.soinside.com 2019 - 2024. All rights reserved.