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

时间:2016-01-18 16:18:50

标签: 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
    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

通过使用Cheat Engine手动读取值,它应该等于1C1F3400。并且跟随指针链从那里起作用,最终结果是正确的值。 ReadProcessMemory函数不返回错误(它返回1),但解包失败,因为rPM读取的值为0。

由于失败的地址总是在结尾有00我猜测会提前停止读取吗?有没有办法解决这个问题或者我犯的任何明显错误?或许我的假设是错误的。

我也可能有其他错误,解压字节对我来说很困惑。我已经阅读了许多其他问题,但大多数问题都是由于错误的句柄或rPM函数返回的其他错误而导致内存读取失败,在这种情况下它表示成功但输出为0(不是返回值)。它看起来不像unpack函数是问题,因为通过打印“theValue”我可以看到它变为0(因此解压缩失败)。除了这些值之外,它也能正常工作。

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

我做了很多搜索,但我可能已经错过了一些明显的答案,对不起,如果我这样做了。

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

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

0 个答案:

没有答案