使用 pyarmor 工具对 python 脚本进行加密
前言
Pyarmor是一种命令行工具,旨在使Python脚本混淆,将混淆的脚本绑定到特定的机器,并为混淆的脚本设置到期日期。
关键功能:
- 无缝替换:混淆的脚本保留为标准文件,允许它们在大多数情况下无缝替换原始的Python脚本。
- 平衡混淆:提供多种方法来使脚本平衡安全性和性能。
- 不可逆转的混淆:重命名功能,方法,类,变量和参数。
- C功能转换:将一些Python函数转换为C函数,并使用高优化选项将其编译为机器指令,以进行不可逆的混淆。
- 脚本绑定:将混淆的脚本绑定到特定的机器或设置混淆脚本的到期日期。
- Themida保护:使用Themida(仅Windows)保护混淆的脚本。
现在简单试用一下,后续有更高级的使用会继续更新。
正文
- 安装 pyarmor
pip install pyarmor
- 创建测试目录
mkdir test
cd test
- 创建测试脚本
org.py
import base64
def myfunc():
tst_str = "hello world"
enc_str = base64.b64encode(tst_str.encode()).decode()
print(tst_str)
print(enc_str)
if __name__ == "__main__":
print("### 功能测试")
myfunc()
- 简单加密python脚本
encrypt.sh
#!/bin/bash
file_name=org
echo -e "****** 加密前: "
cat $file_name.py
echo -e "------\n"
echo -e "****** 执行加密前的文件"
python3 ./$file_name.py
echo -e "------\n"
echo "****** 开始加密文件 ******"
pyarmor gen $file_name.py
echo -e "------\n"
echo "****** 加密后:"
cat ./dist/$file_name.py
echo -e "------\n"
echo "****** 执行加密后的文件"
python3 ./dist/$file_name.py
echo -e "------\n"
- 执行加密脚本
chmod +x encrypt.sh
./encrypt.sh
输出
****** 加密前:
import base64
def myfunc():
tst_str = "hello world"
enc_str = base64.b64encode(tst_str.encode()).decode()
print(tst_str)
print(enc_str)
if __name__ == "__main__":
print("### 功能测试")
myfunc()
------
****** 执行加密前的文件
### 功能测试
hello world
aGVsbG8gd29ybGQ=
------
****** 开始加密文件 ******
INFO Python 3.9.2
INFO Pyarmor 9.0.8 (trial), 000000, non-profits
INFO Platform linux.x86_64
INFO search inputs ...
INFO find script org.py
INFO find 1 top resources
INFO start to generate runtime files
INFO target platforms {'linux.x86_64'}
INFO write dist/pyarmor_runtime_000000/pyarmor_runtime.so
INFO generate runtime files OK
INFO start to obfuscate scripts
INFO process resource "org"
INFO obfuscating file org.py
INFO write dist/org.py
INFO obfuscate scripts OK
------
****** 加密后:
# Pyarmor 9.0.8 (trial), 000000, non-profits, 2025-02-20T10:49:39.653461
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00;\x03\x00\x00\x12\t\x04\x00o\x15\x92f\xa2\xc0\x1b\xb9\xd8+\xd7\xad\xcedN\xa9\x00\x00\x00\x00\x00\x00\x00\x00\xc1(\xc4\x1d\x1fH\x84\x80\xb7\xbdQ\xd3T\r\xd5\xff)\x8e?O\x05(6\xda\',\x92d\xf7\xb7<\x8c\xf5\x95\xbb\x0c\x83\x81\x91\xd8-\xd4\xc5\xa4Ut9\x19\xe7PS/\xa1\x7f\x87B\xfd\x96;\xd91>\xb5\x00ph\x85\x0f\xfd8U\xb1\n\xfd|\xa9\x80\x8a\xa2\x8d\x92\x90\x10\xc6g\xcd\x92\x16\x02\x9d_J|c\xbd\x93j-\xd3\x13\x94f\xc3Tn\xa8\x18c\x9b1\xcbi$T\x11\xd2\x8d?\x85\x81S\x80r\x91\x00N\xfa\x816\x97\xb5\xbd\xe7\t}\x1dV\xf2\xa7\x1b\x04(\xe3k\xefG"\xa0lVBM\xcf\xbc\x95-\xc0M\xfai\x01eS\xf2\xe2\x07\x06-\x9c\x14j\xaf\xa2\xe0]\xfa\x94\t|0\xdcsc(K\x9e\x84\xcc\xc9\x08+*n\xb8\xde#\xe9T\xf6\xf2\xd3\xef6\x17\x15\xec\xc6\xda\x84\x9f\xb4\x1f:+f4\xd5z\xc40\xba)4\x01\\\x8b\x0c\xc8\xe4i3\xa0\xeb\x1a\x80\xe2\x03\xd1\x06\xe4$v\xc7\n>\xb2 \xe8\xeb\x13\x15\x93$\x8c\xe4\x13\x96\xda\x86\xeba69\x99\x94p\x0c\x06\xa3\xcc\xe9\xb5\xf2\xb5\xd3\xd4\xb1\x8cNY\xf0!\x87\xf9W\xfcN\xe0\xe3\x0c\x8az\xa2\xe8K\xa8]H\xc4\x9e\x9d\x89ZVz\xe0\x8f\xce\xf7_\x8d\xda\'\xdb\xbd\xdb\xaf}}O\xf2eH\x9d\x0b`\xfd\xa8\x04\x99\x9d\x86\x9a\x00#\xd9\x9b\xc9\xa2\x1c\xa3|\xad\x0b\xd6\xac\x14\xc1B\x16G#Tk\xefs[$\xbb\x1a\x0b|\x10\xa7A\\\xe0Xo6\x81xs\xd3\x03\xd5y\xe4\xd1\xfd\x8f\x84\xae\xb9\xe2c>\x963U\x00\xe4\x7fu\xf8\x03\xd0\r\x18V\xbd \'\x96M\x0f\xe9\xf4\xbe\x92\xfc\xff\xc6\xaa\x0fq7F\xc1753\x8ab\xf2e\x99\x83=8\xd4H\x92i!\x9dB\x86\xe39\x82X\x1e\xed\xc5g\x9f\x87\x91+\xda=\x9c\xc3<2\xe0\x93i#\x84\x94\x05O]\xd2\xf4\x1f\t*"\xce\x86\xe1\xf6\x18\xdd\xb3E\xe6g\xb0\x01\xfd\x02.@\x95\xe0\xe8}\xd9\xff[\x07cT6\x91\x1b\x01\xf3\xe6\xb5WQ\x8b\x80\x17\x9c\xbecnb\xee8\xef\x1d\xa2I\x04J,\xb2\xd7\xe4TRR\x18A\xd7\xe7 \xd4R\xe9\x96*Yw@#T\xd4\x9fv\x0c\xc9\xd6\x9f\xac\x9c\xefdO\xeb\x7f\xa1\xf3\xd7\xb5\x80\xd1h}q+}@A\xa1+\xea\xb5>\x15\xf1\xd2\xd9\x961\x93\xd1\xaa\x9f\x9asU\x91\\\xa0\x11\xff\xfc\xb9\x95*c\xe3\xf2\x97\x00+n\xba\xc7%\x14ca\x00\xf8\x0eY\xbbl;\xdd\x0c\n\xcb\xd1\xe5\xd5\xad\xd0\x13\x06\xb0\x83U>\x81\x8b:\xe2\x81\x7f\xa5\x98\xe7>\xbe\x96\xefR\x00\xae\x15?\x93}\x96\xc6z\xdb`\x98m\x1a\xc4hC\x922LO3\x14s\r\xbd\x9e\xa4\n\x90G\x94\x88$\x98\xf2\xd8\xb4\x12\x1d>@R[~\xd9\xe4\xd8=w\x05\xd9\x87f;9]\xf0!W\xf2e.[\xd1\x7fA\x1a8\xf8\x9d\x1f\x0f\xdbv\x08;\x1b\xec\x1c\xf4\xd5\xe5e\xc0\x10\xd5\x02\xda\x11q\xe8Z\x95\xc9\xeac\xcf\xf1#\xf8X\x9b\xc4\xacC\xea\xc7c\xa7%\xcf~\xd1\xaa\xc4+\xe5(\x82\xa1t\x9bi\x02\n\x18\xfb\x8a\x89\xaf\xa78\xdc\x14-J{?\x85\x1fw\xb4<j\x04\xaf\xee^\x14\xca\xec\xd3\xd13\x8fSA%\xea\xcc^\x88\xd1\xa6v\x85\x93\x02\x13\x9f\xf2#a\x15_FKb[')
------
****** 执行加密后的文件
### 功能测试
hello world
aGVsbG8gd29ybGQ=
------
参考
[1]. https://pyarmor.readthedocs.io/en/latest/tutorial/getting-started.html#what-s-pyarmor
[2]. https://mp.weixin.qq.com/s/FuElKlvm7Wkul2ZnfR0-jQ (这是知道有Pyarmor这个工具的文章,但是文章中的示例不太好使)