使用Pyarmor加密、混淆Django项目源码再使用PyInstaller打包

2024 年 12 月 24 日更新:

完善 Linux 环境下的混淆与部署。

Pyarmor、PyInstaller简介

PyArmor 是一个用于保护 Python 脚本的工具,旨在防止源代码被反编译或未经授权的访问。它通过对 Python 文件进行加密和混淆,增强了代码的安全性,特别适合在分发和部署 Python 应用程序时保护核心逻辑。

PyInstaller 是一个将 Python 程序打包为独立可执行文件的工具。通过 PyInstaller,我们可以将 Python 脚本打包成无需安装 Python 解释器即可运行的程序,这对于分发 Python 应用非常有用。

自然而然,先使用 PyArmor 对 Python 项目进行加密和混淆,保护代码逻辑免遭反编译或未经授权的修改,然后再通过 PyInstaller 将加密后的项目打包为独立的可执行文件,这是一种双重保护代码资产并便于分发应用的有效方法。

使用 Pyarmor 加密、混淆 Django 项目

使用 Pyarmor-webui 加密项目

Pyarmor 官方手册:

1. 使用教程 — Pyarmor 9.0.0 文档

Pyarmor-webui Github 地址:

dashingsoft/pyarmor-webui: A webui tool used to obfuscate and pack python scripts based on pyarmor (github.com)

首先安装 Pyarmor 和 Pyarmor-webui。

PyArmor-WebUIPyArmor 的一个基于 Web 的图形用户界面工具。它为用户提供了一种更加直观和便捷的方式,来管理 PyArmor 的加密、混淆以及代码保护操作,而无需使用命令行。这特别适合不熟悉命令行工具的开发者或需要更高效率的用户。

1
2
pip install -U pyarmor
pip install -U pyarmor-webui

该代码升级指定的包到最新版本,或

1
2
pip install pyarmor
pip install pyarmor-webui

安装完成后在命令行输入:

1
pyarmor-webui

该命令还有一些常用参数:

  1. -h-help
    • 显示帮助信息
  2. --port
    • 指定 Web UI 启动时使用的端口号
  3. --host
    • 指定 Web UI 的主机名,默认为 127.0.0.1 只允许本地主机上服务,绑定为 0.0.0.0 允许任何 IP 访问。

打开图形化界面。

pyarmor-webui图形化页面

页面端口默认为 9096,右上角English可以切换语言为简体中文。

  1. 点击我的工程 -> 创建

  2. 修改工程类型(这里建议选择加密工程中的所有脚本,直接选择打包会出现奇怪错误 Command '['D:\\ProgramData\anaconda3\envs\\prodfm backend\\python.exe','-m','Pylnstaller','--clean',--workpath','.pyarmor\\pack\\build','api_doc_img.spec']'returned non-zero exit status 1.,这里只加密,后面手动进行打包)

    修改工程类型
    打包报错
  3. 修改源路径,即需要打包的 Django 项目

    修改源路径
  4. 排除路径,即不需要加密或混淆处理的文件或文件夹。

  5. 输出加密模式高级选项可根据需要进行设置。

  6. 点击构建(调试),便可以加密项目,如果遇到错误能够输出报错内容。 如无问题,会把加密后的代码保存到源路径的dist文件夹下。

    成功加密结果

    加密后生产的文件夹:

    dist内容

加密之后就是正常的 Django 项目,在 PyCharm 里打开命令行,切换到 dist 目录,可以使用命令:

1
python manage.py runserver

可以成功运行加密后的项目。

成功运行

到此,加密的步骤已经完成。

使用 PyInstaller 打包项目

PyInstaller 官方文档:

PyInstaller Manual — PyInstaller 6.11.1 documentation

安装 PyInstaller:

1
pip install -U pyinstaller

安装完成后运行:

1
pyinstaller manage.py

其中,manage.py是项目的入口脚本。

该命令会创建一个 manage.spec文件,用于后面构建 Django 项目,后续我们需要编辑该文件。

运行结果

接着我们运行:

1
pyinstaller manage.spec

该代码用于打包项目:

打包结果

图上是说明打包后保存的 dist 路径不为空,是否需要移除,输入y即可。

如果部署在 Windows 环境下,输入代码:

1
manage.exe runserver --noreload

如果部署在 Linux 环境下,输入代码:

1
./manage runserver --noreload

如果不添加--noreload,可能会有莫名报错:

1
RuntimeError: Script runserver not found

--noreload 的作用:禁用 Django 开发服务器的自动重载功能。

然后不出所料,应该会遇到各种的ModuleNotFoundError: No module named 'XXX',这是因为在打包的时候,PyInstaller 自动依赖检测工具可能漏掉了一些动态导入的模块或子模块,这个时候我们需要手动添加上去

ModuleNotFoundError 问题

打开之前的manage.spec文件,编辑其中的hiddenimports字段,把没导入的模块手动添加上去,然后再运行pyinstaller manage.spec重新构建项目,然后再运行manage.exe runserver --noreload重新运行项目,这个时候还可能会出现ModuleNotFoundError: No module named 'XXX'问题,那么需要重复手动添加模块,直到可以正常运行,下图是我多次尝试手动添加的结果:

手动添加多个包

顺利的话,多次尝试之后最终可以顺利运行:

最终结果

需要注意的是,打包的 Django 项目建议是纯后端项目,不建议携带网页以及各种静态 CSS、JS 资源,否则可能会出现加载不出来网页和静态资源找不到的问题(如打开 rest_framework 的相关默认页面)。


使用Pyarmor加密、混淆Django项目源码再使用PyInstaller打包
https://excelius.xyz/使用pyarmor加密、混淆django项目源码再使用pyinstaller打包/
作者
Excelius
发布于
2024年12月20日
许可协议