pyarmor加密python脚本
文章目录
- 一、pyarmor是什么?
- 二、原理
- 三、加密的方式
- 1.指定入口脚本
- 2.不指定入口脚本
- 总结
一、pyarmor是什么?
PyArmor 是一个强大的工具,可以有效地保护 Python 代码,防止源代码被逆向工程。简单来说,就是对代码进行加密,防止别人查看到代码内容,了解具体的实现。
二、原理
安装pyarmor 7.x 版本后,使用命令加密一个python项目,项目的结构如下:
├── my.py
│
└── test.py
其中每个脚本都是一个 print语句即可。
加密命令如下:
pyarmor obfuscate test.py
经过一串INFO信息后,将会在同级目录下生成一个dist目录,dist目录内容如下:
├── pytransform
│ ├── __init__.py
│ └── _pytransform.so
├── my.py
└── test.py
进入dist目录后,直接执行python test.py,发现可以直接执行,生成结果。这就是pyarmor的最大特点:加密脚本无缝替换原来的脚本。那就是可以和非加密脚本之间互相替换。pytransform包是pyarmor的运行辅助包,运行加密python脚本必须被导入。
查看一下dist中test.py内容:
from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'\x06\x0f...')
可以发现执行脚本前导入前文提及的运行辅助包。但是my.py脚本内容如下:
__pyarmor__(__name__, __file__, b'\x06\x0f...')
直接python my.py 也会直接报错,只是因为在运行时缺少运行辅助包,但是在原始的test.py 脚本中导入my.py脚本中的函数,可以直接正常运行test.py脚本。
到此处,我们也知道 pyarmor obfuscate test.py 命令的大致含义了,该命令能够将当前目录(子目录则加 -r 参数)下的python脚本进行加密,最后的位置参数 test.py 就是python项目的主入口,类似与main函数。
那么pyarmor是如何加密python代码的呢?
实际上,pyarmor首先对源码进行混淆,比如函数名、类名等替换成无意义的字符串。然后把源代码编译成字节码,然后对字节码中填充一些多余的动作(不影响机器的理解,但是混淆使得人为难以阅读),最后使用加密算法对字节码进行加密即可。
三、加密的方式
章节二基本上将这种方式描述清楚了,但是章节二中的方式主要用来加密单个脚本,对于加密整个工程项目还存在更加标准的方法。
1.指定入口脚本
- 进入加密项目中,使用命令
pyarmor init --entry=main.py
初始化整个项目,并设置项目的唯一入口脚本是main.py(如果有多个,用逗号分隔即可)。 - 使用命令
pyarmor build
加密项目中的python脚本,同级目录中将生成一个dist目录,dist目录的结构在前文已有描述。
2.不指定入口脚本
- 进入加密项目中,使用命令
pyarmor init
- 使用命令
pyarmor build
加密 - 执行命令pyarmor runtime -i 生成运行辅助包 pytransform_bootstrap,将辅助包复制添加到python环境中,比如(site-packages目录下)
- 每一个python文件都必须导入运行辅助包,可以采用在site.py中的main函数中导入pytransform_bootstrap包,pytransform_bootstrap的__init__.py文件中恰好就是:
from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'\x06\x0f...')
site.py 是 Python 启动时自动执行的模块之一。它负责添加一些特定的路径到 sys.path 中(比如site-packages 目录)。
因此,导入pytransform_bootstrap可以使得每个python文件执行时可以导入运行时辅助包。
但是必须放在main函数中,因为site.py 也同时在添加site-packages路径,防砸其他位置,可能找不到。
总结
本文简单介绍了一下使用pyarmor混淆加密的用法。