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 setupfrom Cython.Build import cythonizesetup(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 osimport shutilimport timeimport sysdef 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
- 执行前要备份入口文件,加密后要复制回来;
