Whenever one of the values I read from memory happens to be a None, no further reading is possible, it will just return empty results, until I close and reopen the process. It happens using this readString function:
def readString(lp_base_address, length):
try:
read_buffer = ctypes.create_string_buffer(length)
lp_number_of_bytes_read = ctypes.c_ulong(0)
ctypes.windll.kernel32.ReadProcessMemory(self.handle, lp_base_address, read_buffer, length, lp_number_of_bytes_read)
bufferArray = bytearray(read_buffer)
found_terminator = bufferArray.find(b'\x00')
if found_terminator != -1:
return bufferArray[:found_terminator].decode('utf-8')
print("[ReadMemory/Error]: terminator not found.\naddress: %s" % hex(lp_base_address))
return "ERROR"
except (BufferError, ValueError, TypeError) as error:
if self.handle:
self.close()
self.error_code = self.get_last_error()
error = {'msg': str(error), 'Handle': self.handle, 'PID': self.pid,
'Name': self.name, 'ErrorCode': self.error_code}
ReadWriteMemoryError(error)
for pointer in listOfManyPointers():
result = readString(pointer, 50)
This is how it is fixed currently:
for pointer in listOfManyPointers():
result = readString(pointer, 50)
if result == None: # TODO fix and remove this block
process.close()
connectToProcess()