Frage

Ich arbeite an einem kleinen Solitär-Trainer.Ich weiß nicht, warum die Funktion ReadProcessMemory nicht funktioniert.Normalerweise wird „False“ oder „True“ zurückgegeben, in diesem Fall jedoch nichts.Der GetlastError() gibt mir den Fehlercode 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)
War es hilfreich?

Lösung

Überprüfen Sie den Community-Kommentar zum MSDN ReadProcessMemory Seite, Zitat(sic):

W7 führt den Leseprozessspeicher nicht aus

Möglicherweise müssen Sie Ihre Zugriffsberechtigungen für „SE_DEBUG_NAME“ für das aktuelle Prozesstoken überprüfen.Wenn nicht aktiviert.Habe es aktiviert.Dies muss natürlich als Administrator erfolgen.

Deklarieren Sie außerdem die Rückgabetypen vollständig und verwenden Sie die use_last_error Parameter, wo ctypes wird das zwischenspeichern GetLastError() Wert intern direkt nach dem Aufruf.Andernfalls könnte es falsch sein.Wenn Sie ein 64-Bit-System verwenden, sind SIZE_T und Zeiger 64-Bit-Werte, daher muss ctypes die Typen kennen, um den Stapel für den Aufruf richtig einzurichten.

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

Außerdem erhalte ich zu Ihrer Information trotz aller Korrekturen den gleichen Fehlerwert, aber ich habe mir nicht die Mühe gemacht, ihn zu aktivieren SE_DEBUG_NAME.

GELÖST

Die folgende Zeile ist das Problem:

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

win32api.OpenProcess gibt ein temporäres Ergebnis zurück PyHANDLE das wird zerstört und schließt den Griff nachdem das Handle abgerufen wurde.

Die Lösung besteht darin, Folgendes zu verwenden:

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

PROCESS dann hält die PyHANDLE Objekt und das Handle bleibt gültig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top