You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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_floatctypes.c_char_p(字符串需要额外处理);
  • 跨平台说明:上面的代码只适用于Windows系统,因为用到了Windows专属的API。如果是Linux/macOS,方法会完全不同,需要调用ptrace等系统调用。

内容的提问来源于stack exchange,提问作者Foreen

火山引擎 最新活动