ctypes ReadProcessMemory Python,如果值以00结尾,则停止读取
我在读取一些内存地址时遇到问题。除了以“00”结尾外,大多数都可以正常工作,比如:“1C1F3400” 对于读取函数本身,我有以下代码:(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
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