Pyarmor 包

尝试使用 pyarmor 包混淆 python 服务

step1 安装

在虚拟环境中使用 pip 下载

uv pip install pyarmor

查看版本

uv pip list | grep pyarmor

# 输出
Using Python 3.12.12 environment at: .env-multi-agent
pyarmor                                           9.2.3
pyarmor-cli-core                                  8.1.0

step2 准备工作

确保服务可以正常启动

# 进入项目
cd /path/to/your/project

# 启动服务
uvicorn main:app --reload

# 服务正常启动会输出
INFO:     Will watch for changes in these directories: ['/path/to/your/project']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [54433] using WatchFiles
__start__
__start__
__start__
INFO:     Started server process [54435]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

step3 混淆

第一次尝试使用 pyarmor 混淆

pyarmor gen --output=dist --include="**/*.py" .

遇到报错信息如下

INFO     Python 3.12.12
INFO     Pyarmor 9.2.3 (trial), 000000, non-profits
INFO     Platform darwin.x86_64
INFO     search inputs ...
INFO     find package at .
INFO     find 1 top resources
...
INFO     write dist/./.env-multi-agent/lib/python3.12/site-packages/nest_asyncio.py
INFO     obfuscating file typing_extensions.py
ERROR    out of license

Pyarmor 9.2.3 (trial), 000000, non-profits

查询后发现,通过 pip 安装的 pyarmor 9.2.3版本为 trial(实验)版,混淆过多文件会提示超出限制。

随后查看 trial 版支持的命令用法

pyarmor gen -h

支持参数如下:

参数 简写 类型/值 中文说明 使用建议
-O PATH --output PATH 路径字符串 指定混淆后文件的输出目录 必填,例如 -O dist
-r --recursive 无值(开关) 递归处理子目录中的 .py 文件 处理包结构时必加
--exclude PATTERN 路径模式(可多次使用) 排除匹配的文件或目录(支持通配符) 用于跳过虚拟环境、缓存等,如 --exclude .env-multi-agent
--obf-module {0,1} 01(默认 1 是否混淆整个模块(文件)
1=是,0=否
一般保持默认
--obf-code {0,1,2} 0/1/2(默认 1 函数级代码混淆强度:
0=不混淆函数体
1=基本混淆
2=增强混淆(更慢但更安全)
试用版可能限制 2
--no-wrap 无值 禁用“包装模式”(wrap mode) 高级选项,一般不用
--mix-str 无值 混淆字符串常量(防明文提取) 增强保护,推荐开启
--assert-call 无值 运行时检查函数是否被混淆(防篡改) 增强安全性
--assert-import 无值 运行时检查模块是否被混淆 同上
--enable {jit,bcc,rft,themida} 特性名 启用高级混淆技术(部分需专业版) 试用版通常不可用
--private 无值 启用私有模式(脚本级隔离) 适用于单脚本分发
--restrict 无值 启用包限制模式(防止被其他代码导入) 保护核心模块时可用
-i 无值 将运行时文件嵌入到输出包内(不生成独立 pyarmor_runtime_xxx 目录) 方便分发,减少文件数
--prefix PREFIX 字符串 为运行时包设置导入前缀(用于多版本共存) 高级场景使用
--platform NAME 平台名(如 linux.x86_64 交叉平台混淆(在 A 平台生成 B 平台代码) 跨平台部署时使用
--outer 无值 启用外部运行时密钥(配合授权绑定) 需专业版
-e DATE --expired DATE 日期(如 2025-12-31 设置代码过期时间 试用版可能不支持
--period N 整数(天数) 定期检查运行时密钥有效性 配合授权使用
-b DEV --bind-device DEV 设备标识(如 mac=aa:bb:cc:dd:ee:ff 绑定到特定设备 需专业版
--bind-data STRING or @FILENAME 字符串或 @文件路径 在运行时密钥中嵌入自定义数据 高级授权用途

开始尝试混淆单个文件

pyarmor gen --output=dist example/test.py

看到正常输出后说明参数正确,开始尝试白名单混淆整个项目

pyarmor gen -O dist -r main.py app controller core model

正确的输出了 dist 文件夹且命令行无报错,进入dist 文件夹查看服务是否可以正常启动

# 进入项目
cd dist

# 启动服务
uvicorn main:app --host 0.0.0.0 --port 8000

# 服务正常启动会输出
__start__
__start__
__start__
INFO:     Started server process [53613]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

服务启动正常且文件混淆成功,证明 pyarmor 的 trial 版本是满足混淆预期的。