ReadProcessMemory con ctypes
-
13-12-2019 - |
Pregunta
estoy trabajando en un poco de solitär entrenador.No sé por qué la función ReadProcessMemory no funciona.Normalmente devuelve Falso o Verdadero, pero en este caso nada.El GetlastError() me da el código de error 6.
#-*- coding: cp1252 -*-
import ctypes, win32ui, win32process ,win32api
PROCESS_ALL_ACCESS = 0x1F0FFF
HWND = win32ui.FindWindow(None,"Solitär").GetSafeHwnd()
print(HWND)
PID = win32process.GetWindowThreadProcessId(HWND)[1]
print(PID)
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID).handle
rPM = ctypes.windll.kernel32.ReadProcessMemory
wPM = ctypes.windll.kernel32.WriteProcessMemory
ADDRESS1 = 0x00E97074
ADDRESS2 = ctypes.create_string_buffer(64)
pi = ctypes.pointer(ADDRESS2)
rPM(PROCESS,ADDRESS1,ADDRESS2,64,0)
print(ADDRESS2)
x=ctypes.windll.kernel32.GetLastError()
print(x)
Solución
Revise los comentarios de la comunidad de MSDN ReadProcessMemory página de cotización(sic):
W7 no ejecutar el proceso de lectura de la memoria
Usted puede necesitar revisar los permisos de acceso para "SE_DEBUG_NAME" para los procesos actuales de token.Si no está habilitado.Habilita.Esto se debe hacer como administrador de curso.
También plenamente declarar los tipos de devolución y uso de la use_last_error
parámetro, donde ctypes
en la memoria caché los GetLastError()
valor internamente directamente después de la llamada.De lo contrario, puede ser incorrecto.Si usted está en un sistema de 64 bits, SIZE_T y los punteros de 64 bits de los valores ctypes necesita conocer los tipos de configurar la pila correctamente para la llamada.
...
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())
También, para su INFORMACIÓN, incluso con todas las revisiones me sale el mismo error de valor, pero no ir por la molestia de la habilitación de SE_DEBUG_NAME
.
SOLUCIONADO
La siguiente línea es la cuestión:
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID).handle
win32api.OpenProcess
devuelve un temporal PyHANDLE
que se destruye y cierra el mango después de que el identificador se recupera.
La solución es usar:
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID)
...
rPM(PROCESS.handle,ADDRESS1,ADDRESS2,64,0)
PROCESS
a continuación, tiene la PyHANDLE
objeto y el mango sigue siendo válido.