Pergunta

estou trabalhando em um pequeno treinador de paciência.Não sei porque a função ReadProcessMemory não funciona.Normalmente retorna False ou True, mas nesse caso nada.O GetlastError() me dá o código de erro 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)
Foi útil?

Solução

Verifique o comentário da comunidade no MSDN ReadProcessMemória página, citação (sic):

W7 não executa a memória do processo de leitura

Talvez seja necessário verificar suas permissões de acesso para "SE_DEBUG_NAME" para o token dos processos atuais.Se não estiver habilitado.Habilitei.Isso deve ser feito como administrador, é claro.

Declare também totalmente os tipos de retorno e use o use_last_error parâmetro, onde ctypes armazenará em cache o GetLastError() valor internamente diretamente após a chamada.Caso contrário, pode estar incorreto.Se você estiver em um sistema de 64 bits, SIZE_T e ponteiros são valores de 64 bits, portanto, ctypes precisa conhecer os tipos para configurar a pilha corretamente para a chamada.

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

Além disso, para sua informação, mesmo com todas as correções, recebo o mesmo valor de erro, mas não me dei ao trabalho de ativar SE_DEBUG_NAME.

RESOLVIDO

A seguinte linha é o problema:

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

win32api.OpenProcess retorna um temporário PyHANDLE que é destruído e fecha a alça depois que o identificador for recuperado.

A solução é usar:

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

PROCESS então segura o PyHANDLE objeto e o identificador permanecem válidos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top