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