时间:26-04-25
在Windows平台上,使用Python直接读写其他进程的内存,是游戏辅助开发、逆向工程与系统安全研究领域的一项关键技术。Pymem模块将复杂的底层Windows API(如ReadProcessMemory、WriteProcessMemory)封装为简洁的Python接口,让开发者能够高效、精准地访问和操控进程内存空间。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
通过pip即可快速部署Pymem。其核心Pymem类支持通过进程名称或进程ID(PID)快速附加到目标进程,建立操作通道。
# 安装pymem
!pip install pymem
import pymem
import pymem.process
print(f"Pymem版本: {pymem.__version__}")
print(f"支持架构: 32位和64位进程")
执行安装命令后,控制台将输出环境确认信息:
Pymem版本:1.14.0
支持架构:32位和64位进程
依赖库:基于Windows API封装
附加进程后,定位关键代码或数据在内存中的地址是首要任务。通过list_modules()方法,可以枚举目标进程加载的所有DLL模块,这是获取核心逻辑基址的基础。
# 附加到记事本进程(请确保notepad.exe正在运行)
pm = pymem.Pymem('notepad.exe')
print(f"进程ID: {pm.process_id}")
print(f"进程句柄: {pm.process_handle}")
# 枚举所有加载的模块
modules = list(pm.list_modules())
print(f"模块总数: {len(modules)}")
print("前3个模块:")
for module in modules[:3]:
print(f" 名称: {module.name}")
print(f" 基址: {hex(module.lpBaseOfDll)}")
print(f" 大小: {module.SizeOfImage} 字节")
运行结果将展示进程的模块内存布局,为后续操作提供精确的地址映射:
进程ID:12345
进程句柄:456
模块总数:42
前3个模块:
名称:notepad.exe
基址:0x7ff600000000
大小:245760 字节
名称:ntdll.dll
基址:0x7ff800000000
大小:212992 字节
获取地址后,即可进行数据读取。Pymem提供了多种数据类型读取方法,包括整数、浮点数及字符串。读取字符串时需指定正确的编码格式,以避免数据解析错误。
# 读取指定地址的整数
test_address = 0x7ff600001234 # 示例地址
try:
value = pm.read_int(test_address)
print(f"地址 {hex(test_address)} 的整数值: {value}")
except pymem.exception.MemoryReadError:
print("内存读取失败,地址可能不可读")
# 读取UTF-8字符串
try:
string_value = pm.read_string(test_address, encoding='utf-8')
print(f"字符串: {string_value}")
except:
pass
操作时需注意内存页面的访问权限,并非所有区域都允许读取:
地址 0x7ff600001234 的整数值:42
内存操作注意事项:需要确保地址具有读取权限
实际内存地址常通过动态的多级指针链计算得出。手动逐级解析既低效又易错。Pymem内置的RemotePointer类提供了安全、可靠的多级指针遍历方案。
from pymem.memory import RemotePointer
def get_pointer_address(base_addr: int, offsets: list) -> int:
"""
安全解析多级指针链
:param base_addr: 基地址(如模块基址+静态偏移)
:param offsets: 偏移量列表
:return: 最终目标地址
"""
try:
ptr = RemotePointer(pm.process_handle, base_addr)
# 遍历前N-1级:读取指针值并加上下一级偏移
for offset in offsets[:-1]:
if ptr.value == 0:
raise ValueError(f"遇到空指针,偏移: 0x{offset:X}")
ptr = RemotePointer(pm.process_handle, ptr.value + offset)
# 最后一级:返回指针值+最后偏移
if ptr.value == 0:
raise ValueError("最后一级指针为空")
return ptr.value + offsets[-1]
except Exception as e:
print(f"指针解析失败: {e}")
return 0
# 示例用法(假设基址和偏移)
# target = get_pointer_address(0x1000, [0x10, 0x20, 0x30])
# pm.write_int(target, 999)
print("多级指针解析函数已定义")
相比手动调用read_long,使用RemotePointer能显著提升代码的健壮性与可维护性:
多级指针解析函数已定义
推荐做法:使用RemotePointer代替手动read_long
Pymem为Python在Windows环境下的进程内存操作提供了强大且便捷的底层接口,尤其适用于游戏数据修改、软件逆向分析及内存取证等场景。需要明确的是,内存操作工具本身具有双重性。在涉及生产环境或安全敏感的应用时,开发者必须严格遵守当地法律法规,并确保获得明确的操作授权。在合法合规的框架内进行技术实践,是保障项目可持续性的核心准则。