Framy
世事漫随流水,算来一梦浮生.
Framy's Blog

可能是最全面的Python程序打包和防逆向破解指南!

可能是最全面的Python程序打包和防逆向破解指南!

为什么要打包?为什么要防止破解?

众所周知,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来说,分分钟修改程序不是问题.

https://framy.top/wp-content/uploads/2023/05/image-3-1024x587.png
Nuitka打包的程序可以直接提取字符串并修改

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

结语

虽然加密总是打着”保护开发者的知识产权”的旗号,但我总感觉有些昧着良心…
试想,我们能够快捷方便的开发出自己的程序,哪里离得开优秀的开发者们的无私奉献?每一个优秀的库背后都有着庞大的代码量,可这些开发者却把自己的劳动成果免费分享给了大家,互联网的发展离不开他们的奉献.

总之,我们不要总是想着如何如何保护自己的代码,如何如何与用户斗智斗勇.以一个开放分享的心态分享自己的劳动成果,或许结果会更好.

Donate
# # # #
Homepage      技术      可能是最全面的Python程序打包和防逆向破解指南!

Leave a Reply

textsms
account_circle
email

Framy's Blog

可能是最全面的Python程序打包和防逆向破解指南!
为什么要打包?为什么要防止破解? 众所周知,Python是一种脚本语言,其开发效率真的无可挑剔.但是一旦到了发布环节,蛋疼的问题就会接踵而来-- 用户不会配置Python环境 源代码泄露(…
Scan QR code to continue reading
2023-05-20