作用: 用于python脚本的加密
切换到虚拟环境python3.x下(这里是用的3.6,个人开发环境下推荐使用miniconda3来实现虚拟环境管理)
这里演示的脚本叫 diff_demo.py ,用于比较 old和new 这2个文件的差异
1 原始文件和目录如下:
tree
.
├── diff_demo.py
├── new
└── old
pip install pyarmor
2 加密文件
pyarmor obfuscate diff_demo.py
3 查看目录结构
tree
.
├── compare.html
├── diff_demo.py
├── dist
│ ├── diff_demo.py
│ └── pytransform
│ ├── __init__.py
│ └── _pytransform.so
├── new
└── old
其中, dist/diff_demo.py 就是加密后的文件
$ cat dist/diff_demo.py
from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'\x50\x59\x41\x52\x4d\x4f\x52\x00\x00\x03\x06\x00\x33\x0d\x0d\x0a\x09\x34\xe0\x02\x00\x00\x00\x00
下面内容省略
...
4 创建有效期文件
pyarmor licenses -e 2020-12-21 r001 # 故意设置一个过期的日期
5 查看目录结构
tree
.
├── compare.html
├── diff_demo.py
├── dist
│ ├── diff_demo.py
│ └── pytransform
│ ├── __init__.py
│ ├── __pycache__
│ │ └── __init__.cpython-36.pyc
│ └── _pytransform.so
├── licenses
│ └── r001
│ ├── license.lic
│ └── license.lic.txt
├── new
└── old
6 执行加密
pyarmor obfuscate --with-license licenses/r001/license.lic diff_demo.py
7 执行测试
python dist/diff_demo.py
这里直接提示 License is expired
另外,我们进到 dist 目录下执行也行。 或者把文件拷贝到其它地方(确保依赖相对路径的一致就行)去执行都可以。
8 此外,还可以绑定到网卡mac, 如果更换机器后 网卡mac不一致就无法执行
pyarmor hdinfo
日志如下
INFO PyArmor Trial Version 7.7.4
INFO Python 3.6.13
Hardware informations got by PyArmor:
Failed to get harddisk information.
Default Mac address: "00:0c:29:4e:e7:f6"
Multiple Mac addresses: "<00:0c:29:4e:e7:f6,02:42:53:d3:63:0c>"
Ip address: "x.x.x.x"
Domain name: "(none)"
Change logs
v6.2.0(r21): Remove trailing dot from harddisk serial number
v6.4.2(r34): Support binding multiple mac addresses
v6.5.3(r37): Support binding named harddisk
v6.7.5(r45): Support mmc/sd card in Linux
9 这里故意绑定一个错误的mac地址
pyarmor licenses --bind-mac "00:0c:29:4e:f7:ff" r002
日志如下:
INFO PyArmor Trial Version 7.7.4
INFO Python 3.6.13
INFO Generate licenses with capsule /root/.pyarmor/.pyarmor_capsule.zip ...
INFO Make output path of licenses: licenses
INFO The license file is generated in restrict mode
INFO The license file is generated in period mode disabled
INFO Make path: licenses/r002
INFO Generate license: *IFMAC:00:0c:29:4e:f7:ff*CODE:r002
INFO Write license file: licenses/r002/license.lic
INFO Write information to licenses/r002/license.lic.txt
INFO Generate 1 licenses OK.
10 查看下当前目录结构
tree
.
├── compare.html
├── diff_demo.py
├── licenses
│ └── r002
│ ├── license.lic
│ └── license.lic.txt
├── new
└── old
11 使用mac地址绑定方式来加密文件
pyarmor obfuscate --with-license licenses/r002/license.lic diff_demo.py
日志如下:
......
INFO Start obfuscating the scripts...
INFO diff_demo.py -> dist/diff_demo.py
INFO Insert bootstrap code to entry script dist/diff_demo.py
INFO Obfuscate 1 scripts OK.
12 执行测试
python dist/diff_demo.py
提示 License is not for this machine
13 此外,还可以打包成独立可执行文件
$ pip install pyinstaller # 需要确保 pyinstaller已安装
$ pyarmor pack diff_demo.py
$ cd dist/diff_demo
$ ./diff_demo old new 这样可以执行成功
# 如果把 diff_demo 拷贝到其它目录(如/tmp/下,则执行会报错,因为会提示找不到.so文件)下面是拷贝到/tmp下执行的样子
$ ./diff_demo old new
[11552] Error loading Python lib '/tmp/libpython3.6m.so.1.0': dlopen: /tmp/libpython3.6m.so.1.0: cannot open shared object file: No such file or directory
14 开启web页面 (生产上基本用不到,了解下即可)
pip install pyarmor-webui
pyarmor-webui --host 0.0.0.0