Вопрос

Я работаю над небольшим тренером-солитером.Я не знаю, почему не работает функция 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. Чтениепроцессапамять страница, цитата (так в оригинале):

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

Кроме того, к вашему сведению, даже со всеми исправлениями я получаю одно и то же значение ошибки, но у меня не возникло проблем с включением 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