Проверьте комментарий сообщества к MSDN Страница ReadProcessMemory, цитата(sic):
W7 не будет запускать чтение памяти процесса
Возможно, вам потребуется проверить права доступа для SE_DEBUG_NAME для токена текущего процесса. Если не включен. Включил. Это должно быть сделано как администратор, конечно.
Также полностью объявите возвращаемые типы и используйте параметр use_last_error
, где ctypes
будет внутренне кэшировать значение GetLastError()
сразу после вызова. В противном случае оно может быть неверным. Если вы работаете в 64-битной системе, SIZE_T и указатели являются 64-битными значениями, поэтому ctypes необходимо знать типы, чтобы правильно настроить стек для вызова.
...
from ctypes import wintypes
...
rPM = ctypes.WinDLL('kernel32',use_last_error=True).ReadProcessMemory
rPM.argtypes = [wintypes.HANDLE,wintypes.LPCVOID,wintypes.LPVOID,ctypes.c_size_t,ctypes.POINTER(ctypes.c_size_t)]
rPM.restype = wintypes.BOOL
wPM = ctypes.WinDLL('kernel32',use_last_error=True).WriteProcessMemory
wPM.argtypes = [wintypes.HANDLE,wintypes.LPVOID,wintypes.LPCVOID,ctypes.c_size_t,ctypes.POINTER(ctypes.c_size_t)]
wPM.restype = wintypes.BOOL
ADDRESS1 = 0x00E97074
ADDRESS2 = ctypes.create_string_buffer(64)
bytes_read = ctypes.c_size_t()
print(rPM(PROCESS,ADDRESS1,ADDRESS2,64,ctypes.byref(bytes_read)))
print(ctypes.get_last_error())
Кроме того, к вашему сведению, даже со всеми исправлениями я получаю одно и то же значение ошибки, но я не пытался включить SE_DEBUG_NAME
.
РЕШЕНО
Следующая строка является проблемой:
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID).handle
win32api.OpenProcess
возвращает временный PyHANDLE
, который уничтожается и закрывает дескриптор после получения дескриптора.
Решение заключается в использовании:
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID)
...
rPM(PROCESS.handle,ADDRESS1,ADDRESS2,64,0)
PROCESS
затем содержит объект PyHANDLE
, и дескриптор остается действительным.
person
Mark Tolonen
schedule
04.10.2012