1 方式汇总


代码混淆 + Oxyry Python Obfuscator + 应用的仍是源码,可破解;
+ pyobfuscate; + 基本没用;
特定解释器加密 + 难度大, 效果一般;
pyc + 基本没用;
pyd + Cython解释器 + 类似于dll;
+ 优点: 运行速度提高, 难以破解;
+ 缺点: 兼容性差, 只能特定解释器运行, 迭代麻烦;

2 Cython模块


2.1 准备工作


2.1.1 提取包

  1. 命令行安装
  1. pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple/
  2. # 试了一次没好使呢,就手动加了
  1. 文件 | 设置 | 项目 | Python解释器 | 添加 | cython

2.1.2 环境支持

  • 需要安装 VS 环境,我参考下面的大佬的文章,采用的方法三-1:见百度网盘

Microsoft Visual C++ 14.0 is required解决方法


2.2 单文件加密


2.2.1 创建setup.py

  1. from setuptools import setup
  2. from Cython.Build import cythonize
  3. setup(
  4. ext_modules=cythonize("xxx.py", language_level=3)
  5. )
  6. # 第一参数填写所要加密的文件名;
  7. # language_level参数为调用的解释器版本;
  8. # setup.py要放在xxx.py同一目录下;

2.2.2 执行加密

  1. python setup.py build_ext --inplace
  • 如果系统中没有VS环境的话,则会出现下列代码提示。需要手动安装对应环境,见2.1.2 环境支持
  1. 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

  1. import os
  2. import shutil
  3. import time
  4. import sys
  5. def func(path):
  6. folder_path = os.path.dirname(path)
  7. file_path = os.path.split(path)[1]
  8. os.chdir(folder_path)
  9. with open('setup.py', 'w') as f:
  10. f.write('from setuptools import setup\n')
  11. f.write('from Cython.Build import cythonize\n')
  12. f.write('setup(\n')
  13. f.write("name='test',\n")
  14. f.write("ext_modules=cythonize('%s', language_level=3)\n" % file_path)
  15. f.write(")\n")
  16. os.system('python setup.py build_ext --inplace')
  17. filename = file_path.split('.py')[0]
  18. time.sleep(2)
  19. os.rename('%s\\%s.cp38-win32.pyd' % (folder_path, filename),\
  20. '%s\\%s.pyd' % (folder_path, filename))
  21. # ---------------------------------------------------根据解释器位数和版本更改
  22. os.remove('%s.c' % filename)
  23. build_folder_path = os.path.join(folder_path, 'build')
  24. shutil.rmtree(build_folder_path)
  25. os.remove('setup.py')
  26. os.remove(file_path)
  27. def get_all_file(path):
  28. for root, dirs, files in os.walk(path):
  29. for name in files:
  30. if name.endswith(".py"):
  31. file_path = os.path.join(root, name)
  32. func(file_path)
  33. paths = sys.argv[1] # ---------------------------------------------项目路径
  34. get_all_file(paths)

2.3.2 执行加密

  1. create_pyd_file.py C:\Users\ASUS\PycharmProjects\elona
  2. # 后半段代码为所要加密文件路径
  3. # 或者如下代码:
  4. python .\create_pyd_file.py C:\Users\ASUS\PycharmProjects\elona
  • 执行前要备份入口文件,加密后要复制回来;