문제

나는 작은 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에 대한 커뮤니티 댓글을 확인하세요. 읽기프로세스메모리 페이지, 인용문(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 개체와 핸들은 유효한 상태로 유지됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top