Joh*_*Doe 8 python winapi ctypes readprocessmemory
我在一个小solitär教练工作.我不知道为什么函数ReadProcessMemory不起作用.通常它返回False或True但在这种情况下没有.GetlastError()给了我Errorcode 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)
Run Code Online (Sandbox Code Playgroud)
Mar*_*nen 12
检查社区对MSDN ReadProcessMemory页面的评论,引用(原文如此):
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())
Run Code Online (Sandbox Code Playgroud)
另外,仅供参考,即使有了所有修复我得到了相同的错误值,但我没有经历启用的麻烦SE_DEBUG_NAME.
解决了
以下行是问题:
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID).handle
Run Code Online (Sandbox Code Playgroud)
win32api.OpenProcess返回一个PyHANDLE被销毁的临时文件,并在检索到句柄后关闭句柄.
解决方案是使用:
PROCESS = win32api.OpenProcess(PROCESS_ALL_ACCESS,0,PID)
...
rPM(PROCESS.handle,ADDRESS1,ADDRESS2,64,0)
Run Code Online (Sandbox Code Playgroud)
PROCESS然后保持PyHANDLE对象,句柄仍然有效.
| 归档时间: |
|
| 查看次数: |
12740 次 |
| 最近记录: |