Вопрос по readprocessmemory, winapi, python, ctypes – ReadProcessMemory с ctypes

8

я работаю над небольшой солитойт тренер Я нене знаю, почему функция 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)
Версия Python (выглядит как 3.X)? Версия для Windows? 32- или 64-битный? Mark Tolonen
Это Python 3.2 и Win7 32bit! Какая именно библиотека C ++? John Doe
Первое, что нужно попробовать - установить тип возвращаемого значения функций в ctypes. Если вы непо умолчанию это int, и у вас есть bool. Во-вторых, ctypes действительно для C и неэто библиотека C ++? Если это так, то, возможно, придется написать функции-оболочки Си. Brian Larsen

Ваш Ответ

1   ответ
12

Проверьте комментарий сообщества к MSDNReadProcessMemory страница, цитата (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())

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

Здравствуйте, я попробовал DebugActiveProcess (PID). Я неНе знаю другой функции для активного SE_DEBUG_NAME. Я работаю в 32-битной системе. Это кажется хитрым, я думаю, что здесь проблема между win7 и ctypes. John Doe
Нет проблем! На SO, установите флажок «против» и примите флажок, чтобы пометить ответ как полезный и правильный. Спасибо! Mark Tolonen
Я написал вспомогательную функцию для включения привилегии и убедился, что она установлена через SysInternals ProcessExplorer. Я должен был быть администратором, чтобы сделать это. Я все еще получил ту же ошибку. Это'Теперь это вызов, поэтому яВозможно, сегодня вечером я снова посмотрю на него, убирая Python из картинки и используя только Си. Я'Я получил это работать раньше, но не на Win7. Mark Tolonen
Привет Марк, когда я запускаю это:pastebin.com/dCaKiFht это выход: ▼  Согласно памяти обозревателя это значение 31 @ Адрес1. Alt + 31 = ▼, Так что вопрос в том, почему бы не запустить это с "Солитэр» John Doe
О нет, какая маленькая ошибка! Большое спасибо! John Doe

Похожие вопросы