سؤال

أنا أعمل على مدرب سوليت الصغير.أنا لا أعرف لماذا وظيفة ريدبروسيسميموري لا يعمل.عادة ما يعود خطأ أو صحيح ولكن في هذه الحالة لا شيء.و جيتلاستيرور () يعطيني إروركود 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)
هل كانت مفيدة؟

المحلول

تحقق من تعليق المجتمع على مسن قراءة العمليةذاكرة الصفحة ، اقتباس (كذا):

لن يتم تشغيل ذاكرة عملية القراءة دبليو 7

قد تحتاج إلى التحقق من أذونات الوصول الخاصة بك ل "سيديبوج_اسم" لرمز العمليات الحالي.إذا لم يتم تمكين.مكن ذلك.يجب أن يتم ذلك كمسؤول بالطبع.

أيضا تعلن تماما أنواع العودة واستخدام use_last_error المعلمة ، حيث ctypes سوف ذاكرة التخزين المؤقت GetLastError() القيمة داخليا مباشرة بعد المكالمة.خلاف ذلك ، قد يكون غير صحيح.إذا كنت تستخدم نظاما 64 بت ، فإن الحجم والمؤشرات هي قيم 64 بت ، لذا تحتاج الأنواع إلى معرفة الأنواع لإعداد المكدس بشكل صحيح للمكالمة.

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

أيضا ، لمعلوماتك ، حتى مع كل الإصلاحات أحصل على نفس قيمة الخطأ ، ولكن لم أذهب من خلال عناء تمكين 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 الكائن والمقبض لا يزال صالحا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top