0

我无法读取一些内存地址。大多数工作正常,除非它们以“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'

然后我有这个代码,它有时会失败,这需要一个预设指针数组,并在遍历它们之后找到正确的地址。模块地址较早找到并且在类变量中。

def addressByPointer(self,initialAddress, bytes, offsetArray):

    #print initialAddress
    #print self.modAddress
    currentAddress = self.addHex(initialAddress,self.modAddress)
    #print currentAddress
    OALength = len(offsetArray)
    counter = 0
    for offset in offsetArray:
        print 'Before adding: CA: ' + currentAddress + ' Offset: ' + offset 
        currentAddress = self.addHex(currentAddress,offset) 
        print 'Read ' + currentAddress
        if(counter == OALength-1):
            return currentAddress
        currentAddress = self.readValue(currentAddress,bytes,'address')
        if(currentAddress == 'error'):
            break
        print ' .. and found ' + str(currentAddress)
        counter += 1

当从最后一个地址读取的值的末尾没有 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(因此解包失败)。除了这些值之外,它也可以正常工作。

我已经测试以确保它在找到值 0x1B334D00,0x04DA8300 以及其他以 00 结尾的值时也失败了。我可以执行类似读取 3 个字节并在末尾添加 00 的操作吗? ? 除此之外,我的“theValue”类型可能是错误的,或者 struct.unpack 参数可能有问题。

我确实搜索了很多,但我可能在此过程中错过了一些明显的答案,如果我这样做了,对不起。

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

结构错误说“解包需要长度为 4 的字符串参数”,我认为这是因为 ReadProcessMemory 没有返回任何内容。如果我读取一个值为 0 的地址并在其上使用 struct.unpack,我会得到同样的错误,我认为这是正常的。

4

0 回答 0