1 方式汇总
代码混淆 | + Oxyry Python Obfuscator; | + 应用的仍是源码,可破解; |
---|---|---|
+ pyobfuscate; | + 基本没用; | |
特定解释器加密 | + 难度大, 效果一般; | |
pyc | + 基本没用; | |
pyd | + Cython解释器; | + 类似于dll; + 优点: 运行速度提高, 难以破解; + 缺点: 兼容性差, 只能特定解释器运行, 迭代麻烦; |
2 Cython模块
2.1 准备工作
2.1.1 提取包
- 命令行安装
pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 试了一次没好使呢,就手动加了
- 文件 | 设置 | 项目 | Python解释器 | 添加 | cython
2.1.2 环境支持
- 需要安装 VS 环境,我参考下面的大佬的文章,采用的方法三-1:见百度网盘;
Microsoft Visual C++ 14.0 is required解决方法
2.2 单文件加密
2.2.1 创建setup.py
from setuptools import setup
from Cython.Build import cythonize
setup(
ext_modules=cythonize("xxx.py", language_level=3)
)
# 第一参数填写所要加密的文件名;
# language_level参数为调用的解释器版本;
# setup.py要放在xxx.py同一目录下;
2.2.2 执行加密
python setup.py build_ext --inplace
- 如果系统中没有VS环境的话,则会出现下列代码提示。需要手动安装对应环境,见2.1.2 环境支持;
error: Microsoft Visual C++ 14.0 is required. Get it with "Build Tools for Visual Studio": https://visualstudio.microsoft.com/downloads/
2.2.3 文件后期处理
- 顺利完成后会生成下列文件:
build
目录;xxx.c
文件;xxx.cp38-win32.pyd
文件;(使用的32位的python3.8)
- 后期处理:
- 删除
xxx.c
文件; - 更改
xxx.cp38-win32.pyd
文件名为xxx.pyd
;
- 删除
- 调用时注意事项:
- 注意解释器的版本,要和
.pyd
文件一致; - 不能封闭入口;
- 注意解释器的版本,要和
2.3 多文件加密
2.3.1 创建create_pyd_file.py
import os
import shutil
import time
import sys
def func(path):
folder_path = os.path.dirname(path)
file_path = os.path.split(path)[1]
os.chdir(folder_path)
with open('setup.py', 'w') as f:
f.write('from setuptools import setup\n')
f.write('from Cython.Build import cythonize\n')
f.write('setup(\n')
f.write("name='test',\n")
f.write("ext_modules=cythonize('%s', language_level=3)\n" % file_path)
f.write(")\n")
os.system('python setup.py build_ext --inplace')
filename = file_path.split('.py')[0]
time.sleep(2)
os.rename('%s\\%s.cp38-win32.pyd' % (folder_path, filename),\
'%s\\%s.pyd' % (folder_path, filename))
# ---------------------------------------------------根据解释器位数和版本更改
os.remove('%s.c' % filename)
build_folder_path = os.path.join(folder_path, 'build')
shutil.rmtree(build_folder_path)
os.remove('setup.py')
os.remove(file_path)
def get_all_file(path):
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(".py"):
file_path = os.path.join(root, name)
func(file_path)
paths = sys.argv[1] # ---------------------------------------------项目路径
get_all_file(paths)
2.3.2 执行加密
create_pyd_file.py C:\Users\ASUS\PycharmProjects\elona
# 后半段代码为所要加密文件路径
# 或者如下代码:
python .\create_pyd_file.py C:\Users\ASUS\PycharmProjects\elona
- 执行前要备份入口文件,加密后要复制回来;