CTYPESを使用したReadProcessMemory
-
13-12-2019 - |
質問
IMは小さなSolitärトレーナーに取り組んでいます。なぜ機能ReadProcessMemoryが機能しないのかわかりません。通常、それはfalseまたはtrueを返しますが、その場合は何もしません。getLasterror()は私にエラーコード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)
. 解決
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())
.
また、FYIは、すべての修正でさえも同じエラー値が得られますが、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
オブジェクトを保持し、ハンドルは有効なままです。
所属していません StackOverflow