
加密护盾:保护你的Python .exe程序免受反编译的利器
加密护盾:保护你的Python .exe程序免受反编译的利器
前言
- 防止
Python
可执行文件(.exe)被反编译是一项重要的安全措施,尤其是当你希望保护你的知识产权、算法、或者商业逻辑时。虽然绝对的安全是不存在的,但可以采取一些措施来增加反编译的难度,使得攻击者更难以获取你的源代码。
常用方案
pyinstaller
使用 --key
进行加密
- 我们可以在打包命令后面添加
--key
参数来进行加密,例如:
python
复制代码
pyinstaller --onefile -p venv/Lib/site-packages .\print-student\main.py --key '1234'
- 再次解压,抽取的中间结果变为了
.pyc.encrypted
,无法正常反编译。
PyInstaller v6.0
移除加密命令
Bytecode encryption was removed in PyInstaller v6.0. Please remove your --key=xxx argument. For the rationale and alternatives see https://github.com/pyinstaller/pyinstaller/pull/6999
- 官方
github
的一些讨论:
- 大概的意思就是说,解密密钥必须存储在构建的应用程序中的某个位置以使应用程序能够运行,字节码加密对于窥探的眼睛只能起到轻微的威慑作用。任何愿意挖掘
PyInstaller
源代码以获取可执行存档的确切布局和快速十六进制转储的人都可以破解它,一旦您知道在哪里查找即可获取密钥。 - 然而现在,像
PyExtractor
这样的PyInstaller
逆向工程工具已经内置了这一切。例如,在下面的步骤中,我们的窥探用户甚至不需要知道他们试图打开的应用程序是加密的,更不用说必须采取任何巧妙的措施来解密它。
python
复制代码
git clone https://github.com/Rdimo/PyExtractor.git
cd PyExtractor
pip install -r requirements.txt
python main.py some/pyinstaller/application
- 由于逆向工程的知识障碍,加密构建现在与常规构建相同,用户可能被误导认为加密的
PyInstaller
构建是放置 API 密钥等内容的安全位置。最后即使添加了更多代码混淆最终会导致相同的结果,因此完全删除加密功能。 - 当然也有朋友提出将加密密码交给使用者运行时填入,但是对于源码的加密实际上并没有很大的实际意义,且会增加维护成本。
使用Cython配合加密打包程序
Python
在打包或优化运行速度时会生成.pyc文件,类似于Java
的.class文件。这些.pyc文件可以被简单地反编译为.py文件,就像Java
的.class文件可以反编译为Java
源代码一样。然而,相比之下,由C语言编译生成的机器码更难以反编译。实际上,机器码反编译后通常是汇编代码或难以阅读的C语言代码。目前还没有一种直接将机器码转换回Python
代码的方法。因此,我们可以利用这一点来加密我们的代码。Cython
是一个编译器,可以将Cython
源代码转换为高效的C或C++
源代码。然后,我们可以将这些源代码编译 为Python
扩展模块或独立的可执行文件。通过使用Cython
将我们的Python
代码转换为C或C++,可以大大增加反编译的难度。
安装 Cython
txt
复制代码
pip install cython
配置 Cython
文件 & 编译
- 配置
build_pyd.py
文件:
txt
复制代码
from distutils.core import setup
from Cython.Build import cythonize
setup(
name='一个名字',
ext_modules=cythonize(
[
"Python脚本文件.py",
"Python脚本文件夹/*.py",
# ...
],
language_level=3
),
)
// 编译
python build_pyd.py build_ext --inplace
- 可以看到生成了一些.pyd文件,这是Windows的DLL文件,相对来说破解和反编译都比.pyc文件要难一些,可以达到一定的加密效果。生成.pyd文件后的目录结构:
txt
复制代码
│ app.c
│ app.cp38-win_amd64.pyd
│ app.py
│ build_pyd.py
│ config.c
│ config.cp38-win_amd64.pyd
│ config.py
│ gui.c
│ gui.cp38-win_amd64.pyd
│ gui.py
│ log.c
│ log.cp38-win_amd64.pyd
│ log.py
│ run.py
│
├─.idea
│ ......省略......
│
├─build
│ ......省略......
│
├─images
│ icon.ico
│
├─logs
│ ......省略......
│
├─venv
│ ......省略......
│
└─__pycache__
重新打包
txt
复制代码
pyinstaller -F run.py --hidden-import json --hidden-import tkinter --hidden-import tkinter.filedialog --hidden-import requests --hidden-import docx --hidden-import openpyxl --hidden-import log --hidden-import gui --hidden-import tkinter.ttk --hidden-import config
- 当我们将
Python
源文件编译成.pyd文件时,由于.pyd文件是二进制文件,PyInstaller
在分析需要导入的包时无法直接解析.pyd文件。导致PyInstaller
不知道.pyd文件中导入了哪些模块。 - 因此,我们需要使用–hidden-import参数告诉
PyInstaller
我们需要导入哪些模块,以便正确地打包应用程序。
总结
- 本文介绍了两种常见的
Python .exe
源码加密方式,但实际上无论哪种方式都无法做到完全加密,只是相对的提高了反编译的难度。简单来说,Python
属于解释型语言,执行器解析的是源码,即使进行加密,运行时也需要解密为源码,不同于C、C++
等编译型语言,执行器执行的机器码,机器码的反编译难度指数级上升。
这里给大家分享一份Python全套学习资料,包括学习路线、软件、源码、视频、面试题等等,都是我自己学习时整理的,希望可以对正在学习或者想要学习Python的朋友有帮助!
CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
1️⃣零基础入门
① 学习路线
对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
② 路线对应学习视频
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
③练习题
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
因篇幅有限,仅展示部分资料
2️⃣国内外Python书籍、文档
① 文档和书籍资料
3️⃣Python工具包+项目源码合集
①Python工具包
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
②Python实战案例
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
③Python小游戏源码
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
4️⃣Python面试题
我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
5️⃣Python兼职渠道
而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
上述所有资料 ⚡️ ,朋友们如果有需要 📦《全套Python学习资料》的,可以扫描下方二维码免费领取 🆓
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
更多推荐
所有评论(0)