ctypes ReadProcessMemory Python,如果值以00结尾,则停止读取

ctypes ReadProcessMemory Python,如果值以00结尾,则停止读取,python,ctypes,readprocessmemory,Python,Ctypes,Readprocessmemory,我在读取一些内存地址时遇到问题。除了以“00”结尾外,大多数都可以正常工作,比如:“1C1F3400” 对于读取函数本身,我有以下代码:( def readValue(self, address, bytes, outputType): theValue = ctypes.create_string_buffer(bytes) intAddress = int(address,16) if(outputType == 'float'): pass

我在读取一些内存地址时遇到问题。除了以“00”结尾外,大多数都可以正常工作,比如:“1C1F3400”

对于读取函数本身,我有以下代码:(

def readValue(self, address, bytes, outputType):
    theValue = ctypes.create_string_buffer(bytes)
    intAddress = int(address,16)
    if(outputType == 'float'):
        pass
    if(outputType == 'string'):
        bytes = 50
        theValue = ctypes.create_string_buffer(bytes)
    if self.rPM(self.PROCESS.handle,intAddress,theValue,bytes,None):
        pass
    else:
        print 'Failed to read address ' + address

    if(outputType == 'address'):
        #print theValue.value
        try:
            return hex(struct.unpack('<L',theValue.value)[0])
        except struct.error:
            print str(theValue.value) + ' not valid'
            self.memReadLog.write('Unreadable address at: ' + str(address) + '\n')
            self.memReadLog.write('The value read was: ' + str(theValue.value) + '\n')


            return 'error'
当从最后一个地址读取的值末尾没有00时,它就是这样工作的:

Before adding: CA: 1662aa4 Offset: 0x0
Read 1662aa4
 .. and found 0x4743d30
Before adding: CA: 0x4743d30 Offset: 0x0
Read 4743d30
.. and found 0x19416408
该值保存预期结果(本例中为整数)

但有时我会这样:

Read 1c1f46a8
 .. and found 0x19416408
Before adding: CA: 0x19416408 Offset: 0x6B0
Read 19416ab8
 not valid
通过使用作弊引擎手动读取该值,该值应等于1C1F3400。从那里沿着指针链运行,结果就是正确的值。ReadProcessMemory函数不返回错误(返回1),但解包失败,因为rPM读取的值为0

由于失败地址的末尾总是有00,我猜这会提前停止读取吗?有什么办法可以避免我犯的任何明显的错误吗?或许我的假设是错误的

我可能还有其他错误,解包字节让我感到困惑。我读过许多其他问题,但大多数问题都是关于内存读取失败,原因是错误的句柄或rPM函数返回的另一个错误,在本例中,它表示读取成功,但输出为0(不是返回值)。看起来解包函数不是问题所在,因为通过打印“theValue”,我可以看到它变为0(因此解包失败)。除这些值外,它也可以正常工作

我已经进行了测试以确保,在找到值0x1B33D00、0x04DA8300以及以00结尾的其他值时,它也失败了。我可以做一些事情,比如读取3个字节并在末尾添加一个00,还是不这样做?除此之外,我的“theValue”类型可能错误,或者struct.unpack参数可能错误

我确实搜索了很多,但我可能错过了一些显而易见的答案,如果我这样做了,很抱歉

编辑:我正在做的是读取指针值,以获得正确的内存地址。我有偏移量和初始地址,以及为我要查找的每个地址存储的模块地址。每一次失败都是不同的。因此,每次读取都应该返回一个指针地址,然后我向它添加一个偏移量并获得下一个地址。但有时它会失败,特别是指针的十六进制地址以00结尾时。然后ReadProcessMemory将不返回任何内容而不是地址(但不是错误,只是不返回任何内容)。我知道地址在那里,因为它可以在使用其他工具时看到,但它在这里的使用方式返回的不是地址,而是什么,我不知道为什么。结构的使用应该是好的,我认为问题在于ReadProcessMemory


struct错误表示“unpack需要长度为4的字符串参数”,我认为这是因为ReadProcessMemory没有返回任何内容。如果读取一个值为0的地址并使用struct.unpack,则会出现相同的错误,我认为这是正常的。

根本不清楚您首先要做什么。您似乎在
readValue()
上遇到了
struct.error
异常,但您和我们都不知道原因。但是,
struct.error
异常有一个解释错误的参数。获取带有
的参数,除了struct.error,errmsg:
(Python2.x)并打印它。很抱歉。struct.error为“解包需要长度为4的字符串参数”。打印从ReadProcessMemory返回的值不会显示任何内容。所以这是有道理的。但该地址处的值应为例如“1B334D00”,长度为4字节。ReadProcessMemory不返回错误,因为没有发生错误。我将尝试重写一点,因为它仍然不清楚。
c_char
数组的value属性是以null结尾的字符串。但是您真正的错误是假设您必须在这里传递
c_char
数组。只需通过引用传递一个
c\u void\u p
实例,例如分配
value=ctypes.c\u void\u p()
并传递
ctypes.byref(值)
作为
lpBuffer
参数,传递
ctypes.sizeof(值)
作为
nSize
参数。结果是
value.value
。不需要
struct.unpack
。另外,不要假设指针是4字节或
c_long
大小。不要使用默认的
c_int
类型传递或获取指针。这可能会在64位系统上产生被截断的垃圾。对于指针结果,必须将
restype
定义为指针类型。对于指针参数,您可以定义
argtypes
,或者有选择地将每个指针参数包装在ctypes指针类型中。否则,您的代码无法移植到64位系统。非常感谢,在更改参数类型后,它现在可以正常工作。我似乎找不到如何标记为答案。
Read 1c1f46a8
 .. and found 0x19416408
Before adding: CA: 0x19416408 Offset: 0x6B0
Read 19416ab8
 not valid