python - 通过pywin32读取进程内存给出不正确的结果
问题描述
我正在尝试从游戏进程中读取内存(就像 Cheat Engine 所做的那样)。我研究过不同的帖子,例如:
然后,我可以拼出我的第一个记忆阅读脚本。基本上,它有两个步骤。获取进程句柄,然后从句柄中读取内存地址。
但我得到的价值是错误的。
我的代码
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
我从内存扫描软件中得到的真正价值
我使用该函数仔细检查了我的 HWND 值是否正确win32gui.SetForegroundWindow(HWND )
。它确实将窗户带到了前景。所以我很确定我的程序是错误的,直到 HWND 行。
解决方案
OpenProcess
失败,可能是因为PROCESS_ALL_ACCESS
没有被授予。您只需要读取权限,因此更改PROCESS_ALL_ACCESS
为PROCESS_VM_READ
,检查返回值以确保它不为零。
如果函数成功,则返回值是指定进程的打开句柄。
如果函数失败,则返回值为
NULL
。要获取扩展的错误信息,请调用GetLastError
。
请注意,Windows 以 UTF16 格式存储文本,而不是 UTF8
推荐阅读
- php - Laravel QrCode::wifi 不接受变量
- c# - 非静态类跨其他类获取数据
- ksqldb - 是否可以保证流中的所有爆炸行都会立即更新到表中?
- julia - 为 Julia 使用 Atom 的 LoadError
- reactjs - 如何在 React JS 中从 Azure Key Vault 检索密钥
- snowflake-cloud-data-platform - 使用 day 列创建一个汇总的周列,并使用一周的第一个星期一填充值:雪花数据库
- html - 如何在输入中嵌入按钮?
- reactjs - 来自动作返回 patternOrChannel 的 Redux-saga 发布数据未定义
- c# - 登录页面上的后台工作人员
- java - 摇摆事件不再触发