Domanda

Sto lavorando su un piccolo allenatore Solitär.Non so perché la funzione readprocessmemory non funziona.Normalmente restituisce un falso o vero ma in tal caso nulla.GeelasterRor () mi dà l'errore 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)
.

È stato utile?

Soluzione

Controllare il commento della community all'SSDN LeggiProcessMemory Pagina, Citazione (SIC):

.

W7 W7 Wont esegue la memoria di processo di lettura

Potrebbe essere necessario controllare le autorizzazioni di accesso per "se_debug_name" per il token dei processi correnti. Se non abilitato. Abilitato. Questo deve essere fatto come amministratore, naturalmente.

Dichiarare completamente i tipi di ritorno e utilizzare il parametro use_last_error, in cui ctypes cache cache il valore GetLastError() internamente direttamente dopo la chiamata. Altrimenti, potrebbe non essere corretto. Se si è su un sistema a 64 bit, size_t e i puntatori sono valori a 64 bit, quindi i ctypes devono conoscere i tipi per configurare la pila correttamente per la chiamata.

...
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())
.

Inoltre, FYI, anche con tutte le correzioni che ottengo lo stesso valore di errore, ma non ho attraversato il problema di abilitare SE_DEBUG_NAME.

risolto

La seguente riga è il problema:

PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID).handle
.

win32api.OpenProcess restituisce un PyHANDLE temporaneo che viene distrutto e chiude la maniglia dopo che la maniglia viene recuperata.

La soluzione è da usare:

PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID)
...
rPM(PROCESS.handle,ADDRESS1,ADDRESS2,64,0)
.

PROCESS quindi contiene l'oggetto PyHANDLE e la maniglia rimane valida.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top