我在阅读一些内存地址时遇到了麻烦。大多数工作正常,除非它们以“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,我会得到同样的错误,我认为这是正常的。