为什么要打包?为什么要防止破解?
众所周知,Python是一种脚本语言,其开发效率真的无可挑剔.但是一旦到了发布环节,蛋疼的问题就会接踵而来–
- 用户不会配置Python环境
- 源代码泄露(当然开源软件除外)
- 在某些系统上无法正确配置Python环境
- …
由此看来,打包无疑是一种一劳永逸的办法,一次打包,终身使用~
基础:打包
Pyinstaller:简单快捷
Pyinstaller可以直接把整个Python环境”复制”到可执行文件中,让Python代码运行在他的虚拟环境中,本质上没有改变源代码.
#安装pyinstaller
pip install pyinstaller
在打包之前,需要先确认你的程序是否能正常运行,否则打包后也是不能用的.
pyinstaller有很多参数,我们暂时只需要 -F ,表示将所有文件打包成一个可执行文件:
cd E:/MyCode/test
pyinstaller -F main.py
然后进入dist文件夹即可看到打包好的程序.
Nuitka:Python的开发效率,C++的运行速度
Nuitka可以将Python代码转化为C++代码,然后用C++的编译器将代码编为可执行程序.它可以很大程度上加快程序的运行速度,据说可以提升20%~70%.但需要注意的是,Nuitka仍然在开发中,可能无法适配部分库,而且需要手动解决编译中的许多诡异的bug.
安装方式依然是:
pip install nuitka
打包时还需要很多操作,由于本文重点不在这里,就直接贴出Python与模具大佬的文章啦~Python打包exe的王炸-Nuitka – 知乎 (zhihu.com)
顺便贴一个我常用的打包命令,建议看懂意思后再使用:
nuitka --standalone --mingw64 --show-memory --show-progress --output-dir=o --onefile main.py
进阶:加密
代码混淆:雕虫小技
代码混淆工具可以把简明易懂的Python代码混淆成火星文,降低了代码可读性,但也仅仅是降低可读性,如果进行文本替换等操作,仍然是在别人眼前裸奔.
代码混淆网站:Oxyry Python Obfuscator – The most reliable python obfuscator in the world
效果大致如下:
#混淆前
__all__ = []
class Foo(Bar):
class_public_var = 'class_public_var'
_class_public_var = '_class_public_var'
__class_private_var = 'class_private'
def __init__(self, private):
self.__class_private_var = private
def public_method(self, arg):
self.class_public_var = arg
def __class_priv_method(self, arg):
self.__class_private_var = arg
foo = Foo()
foo.public_method()
#混淆后
__all__ =[]#line:1
class O0OO0O000O0OOO0OO (Bar ):#line:3
class_public_var ='class_public_var'#line:4
_class_public_var ='_class_public_var'#line:5
__O00OO00OOO0O000O0 ='class_private'#line:6
def __init__ (OO0OO0OOOO0OO0O00 ,O00O00O00000OOO0O ):#line:8
OO0OO0OOOO0OO0O00 .__O00OO00OOO0O000O0 =O00O00O00000OOO0O #line:9
def public_method (OOOOO0O0000O0OOO0 ,OO00OOO0O0000O0OO ):#line:11
OOOOO0O0000O0OOO0 .class_public_var =OO00OOO0O0000O0OO #line:12
def __O0O0OO0O000OO000O (O0000OO0O000OO0OO ,OO00OO0OOOOOO00O0 ):#line:14
O0000OO0O000OO0OO .__O00OO00OOO0O000O0 =OO00OO0OOOOOO00O0 #line:15
O000OOOOO00OOO000 =O0OO0O000O0OOO0OO ()#line:17
O000OOOOO00OOO000 .public_method ()#line:18
安全性极低,不推荐.
发布Nuitka打包的程序:有点意思
Nuitka在打包程序的同时,也做到了加密程序,它生成的程序是无法逆向出源代码的.网上也有不少人吹Nuitka的加密,但我觉得有必要纠正一下:Nuitka打包的程序并没有真正加密,在OD等专门的逆向工具面前就是蛋壳一般的存在,对于有经验的Cracker来说,分分钟修改程序不是问题.

Pyinstaller+PyArmor:无懈可击
(才不是广告呢~真的不是~)
PyArmor是一款国人开发的Python加密工具,可以单独加密Python脚本或配合pyinstaller将加密脚本打包为程序.它有专业版和免费版,不过一般免费版是够用的本人也是用过几个月了,经过各种测试暂时没发现被破解的风险.官方文档:Pyarmor 8.2 用户文档 — Pyarmor 8.2.0 文档
Github:dashingsoft/pyarmo
老规矩pip install:
pip install PyArmor
PyArmor有普通模式,高级模式,超级模式,虚拟模式…反正我是看不懂()总之超级模式是最厉害的.
这里贴出我们需要的一个命令,实现把Python脚本加密并打包:
pyarmor pack -e " --onefile" -x " --advanced 4" main.py
结语
虽然加密总是打着”保护开发者的知识产权”的旗号,但我总感觉有些昧着良心…
试想,我们能够快捷方便的开发出自己的程序,哪里离得开优秀的开发者们的无私奉献?每一个优秀的库背后都有着庞大的代码量,可这些开发者却把自己的劳动成果免费分享给了大家,互联网的发展离不开他们的奉献.
总之,我们不要总是想着如何如何保护自己的代码,如何如何与用户斗智斗勇.以一个开放分享的心态分享自己的劳动成果,或许结果会更好.
Leave a Reply