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)
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top