如何用Python读取Cheat Engine定位的外部程序指定内存地址值?
当然可以用Python读取其他进程的内存——只要你有足够的系统权限,并且能定位到目标进程的信息(比如进程ID或者进程名)。既然你已经通过Cheat Engine找到了静态内存地址0x93C28D70,那咱们直接一步步来实现:
1. 先获取目标进程的PID(进程ID)
要读取其他进程的内存,首先得拿到它的进程ID。你有两种方式获取:
- 手动打开任务管理器,找到目标程序的PID;
- 用Python自动获取,推荐用
psutil库,它能轻松根据进程名查找PID。
先安装psutil:
pip install psutil
然后写代码获取PID:
import psutil def get_pid_by_name(process_name): for proc in psutil.process_iter(['name', 'pid']): if proc.info['name'].lower() == process_name.lower(): return proc.info['pid'] return None # 替换成你的目标程序进程名,比如"notepad.exe" target_pid = get_pid_by_name("your_target_process.exe") if not target_pid: print("找不到目标进程!") exit()
2. 打开目标进程并获取内存读取权限
接下来要调用Windows系统API来打开进程,这里用ctypes库直接调用Windows的OpenProcess函数,需要申请PROCESS_VM_READ权限(只读内存的权限)。
import ctypes from ctypes import wintypes # 定义Windows API函数 kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) PROCESS_VM_READ = 0x0010 kernel32.OpenProcess.argtypes = [ wintypes.DWORD, # dwDesiredAccess wintypes.BOOL, # bInheritHandle wintypes.DWORD # dwProcessId ] kernel32.OpenProcess.restype = wintypes.HANDLE # 打开进程 process_handle = kernel32.OpenProcess(PROCESS_VM_READ, False, target_pid) if not process_handle: print(f"打开进程失败,错误码: {ctypes.get_last_error()}") exit()
3. 读取指定内存地址的值
现在可以调用ReadProcessMemory函数读取你找到的内存地址了。这里要注意:你需要知道目标变量的类型(比如是4字节的整数、8字节的浮点数还是其他类型),因为读取时要匹配对应的缓冲区大小。
比如假设你的变量是4字节的整数(int32),代码如下:
# 定义ReadProcessMemory的参数类型 kernel32.ReadProcessMemory.argtypes = [ wintypes.HANDLE, # hProcess wintypes.LPCVOID, # lpBaseAddress wintypes.LPVOID, # lpBuffer wintypes.SIZE_T, # nSize wintypes.LPSIZE_T # lpNumberOfBytesRead ] kernel32.ReadProcessMemory.restype = wintypes.BOOL # 你找到的内存地址,转成十六进制整数 target_address = 0x93C28D70 # 准备缓冲区存储读取到的值 buffer = ctypes.c_int32() bytes_read = wintypes.SIZE_T() # 读取内存 success = kernel32.ReadProcessMemory( process_handle, target_address, ctypes.byref(buffer), ctypes.sizeof(buffer), ctypes.byref(bytes_read) ) if success and bytes_read.value == ctypes.sizeof(buffer): print(f"读取到的值: {buffer.value}") else: print(f"读取内存失败,错误码: {ctypes.get_last_error()}") # 记得关闭进程句柄 kernel32.CloseHandle(process_handle)
一些重要的注意事项
- 权限问题:你的Python脚本需要以管理员身份运行,否则可能无法打开目标进程或者读取内存;
- 静态地址的局限性:你也提到了,重启进程后这个地址会变化——如果想长期使用,最好通过Cheat Engine找到该变量的基地址+偏移量,然后用Python先读取基地址,再计算出实际的动态地址;
- 变量类型匹配:如果你的变量是其他类型(比如float、字符串),需要更换对应的ctypes类型,比如
ctypes.c_float、ctypes.c_char_p(字符串需要额外处理); - 跨平台说明:上面的代码只适用于Windows系统,因为用到了Windows专属的API。如果是Linux/macOS,方法会完全不同,需要调用
ptrace等系统调用。
内容的提问来源于stack exchange,提问作者Foreen




