Доброго времени суток. Пытаюсь считать регистр памяти из чужой программы с помощью функции ReadProcessMemory.
Все хорошо, пока я использую 4-х байтные адреса. Но как только ввожу адрес больше 4-х байт, сразу возникает ошибка:
ctypes.ArgumentError: argument 2: <class 'OverflowError'>: int too long to convert
Естественно гугл мне в помощь. Решения нашел. Даже два:
1. Изменить 'address' на 'ctypes.c_void_p(address)' в вызове ReadProcessMemory.
2. Переназначить структуру ReadProcessMemory с помощью restype и argtypes, даже привели пример, который я честно и скопировал в текущий код.
После тестов обоих решений выяснил, что переменная с адресом теперь просто обрезается до 4-х байт. Как правило, получаем несуществующий адрес, и программа выдает ошибку 229. 4-х байтные адреса, как и раньше, работают.
Уже от себя присвоил в argtypes переменной адреса тип c_ulonglong и c_uint64 вместо LPCVOID, попытавшись насильно скормить все 64 бита. Дело сдвинулось с мертвой точки и питон выдал ошибку: OSError: exception: access violation writing 0x00000001
На этом мои мысли закончились, если кто поможет, буду весьма благодарен.
Phyton 3.7, Windows 10 64-bit.
Все хорошо, пока я использую 4-х байтные адреса. Но как только ввожу адрес больше 4-х байт, сразу возникает ошибка:
ctypes.ArgumentError: argument 2: <class 'OverflowError'>: int too long to convert
Естественно гугл мне в помощь. Решения нашел. Даже два:
1. Изменить 'address' на 'ctypes.c_void_p(address)' в вызове ReadProcessMemory.
2. Переназначить структуру ReadProcessMemory с помощью restype и argtypes, даже привели пример, который я честно и скопировал в текущий код.
После тестов обоих решений выяснил, что переменная с адресом теперь просто обрезается до 4-х байт. Как правило, получаем несуществующий адрес, и программа выдает ошибку 229. 4-х байтные адреса, как и раньше, работают.
Уже от себя присвоил в argtypes переменной адреса тип c_ulonglong и c_uint64 вместо LPCVOID, попытавшись насильно скормить все 64 бита. Дело сдвинулось с мертвой точки и питон выдал ошибку: OSError: exception: access violation writing 0x00000001
На этом мои мысли закончились, если кто поможет, буду весьма благодарен.
Phyton 3.7, Windows 10 64-bit.
Код:
from ctypes import *
from ctypes.wintypes import *
OpenProcess = windll.kernel32.OpenProcess
ReadProcessMemory = windll.kernel32.ReadProcessMemory
ReadProcessMemory.restype = BOOL
ReadProcessMemory.argtypes = [HANDLE, LPCVOID, LPVOID, c_size_t, POINTER(ctypes.c_size_t)]
CloseHandle = windll.kernel32.CloseHandle
PROCESS_ALL_ACCESS = 0x001F0FFF
PROCESS_VM_READ = 0x0010
# откуда считываем
pid = 0x1CC8 .
address = 0x7FFCEC5D72D4
# сколько байт
bufferSize = 1
buffer = create_string_buffer(bufferSize)
bytesRead = c_ulong(0)
processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
if processHandle != 0:
print("Process successful opened")
if ReadProcessMemory(processHandle, address, buffer, bufferSize, byref(bytesRead)):
print(buffer.value)
else:
ErrorNum = GetLastError()
print("Error Read Memory: ", ErrorNum, FormatError(ErrorNum))
else:
ErrorNum = GetLastError()
print("Error on open process: ", ErrorNum, FormatError(ErrorNum))
CloseHandle(processHandle)
Последнее редактирование: