我正在尝试从游戏进程中读取内存(就像作弊引擎所做的一样)。我研究了不同的帖子,例如:
然后,我可以整理出第一个内存读取脚本。基本上,它有2个步骤。获取进程句柄,然后从该句柄读取内存地址。
但是我认为我弄错了。
import win32gui,win32com.client
import win32api
import ctypes
import win32ui
import win32process
from ctypes import wintypes
### Initializing functions and permissions ###
OpenProcess = ctypes.windll.kernel32.OpenProcess
ReadProcessMemory = ctypes.windll.kernel32.ReadProcessMemory # Method 1
PROCESS_ALL_ACCESS = 0x1F0FFF
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_VM_OPERATION = 0x0008
PROCESS_VM_READ = 0x0010
PROCESS_VM_WRITE = 0x0020
### End of Initializing session
### Getting process handle ###
HWND = win32ui.FindWindow(None,'My Game').GetSafeHwnd()
PID = win32process.GetWindowThreadProcessId(HWND)[1]
processHandle = OpenProcess(PROCESS_ALL_ACCESS, False, PID) # Why is it zero
### End of Getting process handle ###
### Reading value of a Memory Address ###
ADDRESS = 0x0111FF62
buffer = ctypes.c_char_p("Hello, World".encode('utf-8'))
bufferSize = len(buffer.value)
bytesRead = ctypes.c_ulong(0)
memory_value = ReadProcessMemory(processHandle, ADDRESS, buffer, bufferSize, ctypes.byref(bytesRead)) # Why is it zero
print('Memory Value = ', memory_value)
内存值= 0
我使用功能win32gui.SetForegroundWindow(HWND )
仔细检查了我的HWND值是否正确。它确实将窗户带到了前景。因此,我很确定在HWND行之前,我的程序是错误的。
答案 0 :(得分:0)
OpenProcess
失败,可能是因为未授予PROCESS_ALL_ACCESS
。您只需要读取访问权限,因此将PROCESS_ALL_ACCESS
更改为PROCESS_VM_READ
,并检查返回值以确保它不为零。
OpenProcess
的文档
如果函数成功,则返回值是该函数的打开句柄 指定的过程。
如果函数失败,则返回值为
NULL
。获取扩展错误 信息,请致电GetLastError
。
请注意,Windows以UTF16格式而不是UTF8格式存储文本