当前位置: 首页 > 后端技术 > Python

pyinstaller打包和安全随便说说

时间:2023-03-26 00:51:56 Python

原文链接回答一个问题,随便说说pyinstaller打包和安全mp.weixin.qq.com简介感觉经常有朋友问我pyinstaller打包的问题,??如果你不会'回复,你可以说是冷漠无情了。一个一个回复,感觉很浪费时间。就这两个问得比较多的问题,就写一篇文章说说吧。相关文档本文涉及的所有相关文档均可通过关注微信公众号“查尔斯的皮卡丘”并在公众号内回复“pyinstaller包”获取。关于pyinstaller如何将图片、音乐、字体等素材文件打包成exe文件的打包程序素材。其实很久以前就有一篇文章讲过,可能是我没有解释清楚,所以经常有人问我类似的问题。这里我们先跳过所有花里胡哨的东西,只说说实现这个功能应该怎么做。我们先声明一下。其实这个东西官网上有教程的。如果不明白,想明白为什么要这么做,可以看官网的介绍。:https://pyinstaller.readthedocs.io/en/v3.3.1/runtime-information.html还是以之前的告白软件为例:情人节到了,是不是该拿出祖传小程序了?相关文件可以在这里下载:https://github.com/CharlesPikachu/Tools/tree/master/NaughtyConfession这三个文件很有用:其中love.py是主程序,cfg.py是配置文件,还有resources文件夹里面有一些字体、音乐等素材文件,先尝试运行如下命令打包:pyinstaller-Flove.py-w打包完成后,根目录变成这样:有一个打包好的exedist文件夹中的文件。打开文件夹,直接双击运行,会发现报错:原因很简单,因为你没有把相关的素材文件打包到这个exe文件中,而这些素材文件在这个目录下是读取不到的到程序本身的设置。需要将exe文件移动到主程序love.py所在目录,然后双击运行:如果要将素材文件打包成exe文件,首先要修改程序,改成程序中的素材资源加载路径相关代码来自(cfg.py文件中):#背景音乐路径BGM_PATH=os.path.join(os.getcwd(),'resources/music/bgm.mp3')#字体路径FONT_PATH=os.path.join(os.getcwd(),'resources/font/STXINGKA.TTF')#背景图片路径BG_IMAGE_PATH=os.path.join(os.getcwd(),'resources/images/bg.png')#ICON路径ICON_IMAGE_PATH=os.path.join(os.getcwd(),'resources/images/icon.png')更改为:ifgetattr(sys,'frozen',False):cur_path=sys._MEIPASSelse:cur_path=os.path.dirname(__file__)#背景音乐路径BGM_PATH=os.path.join(cur_path,'resources/music/bgm.mp3')#字体路径FONT_PATH=os.path.join(cur_path,'resources/font/STXINGKA.TTF')#背景图片路径BG_IMAGE_PATH=os.path.join(cur_path,'resources/images/bg.png')#ICONpathICON_IMAGE_PATH=os.path.join(cur_path,'resources/images/icon.png')并新建一个.spec文件,当然为了方便,可以直接打开刚刚生成的.spec文件(就是你运行第一个打包命令的时候,也会根据你的命令生成一个love.spec文件),类似这样:打开文件,可以发现里面的内容文件是这样的(为了方便一些懒癌患者复制粘贴,我就不截图了,直接复制内容):#-*-mode:python;编码:utf-8-*-block_cipher=Nonea=Analysis(['love.py'],pathex=['C:\\Users\\ThinkPad\\Desktop\\NaughtyConfession'],binaries=[],datas=[]、hiddenimports=[]、hookspath=[]、runtime_hooks=[]、excludes=[]、win_no_prefer_redirects=False、win_private_assemblies=False、cipher=block_cipher、noarchive=False)pyz=PYZ(a.pure,a.zipped_data,cipher=block_cipher)exe=EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name='love',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=False)通过修改这个文件,可以将所有指定的素材资源打包到exe文件中。具体修改后的文件如下:#-*-mode:python;编码:utf-8-*-block_cipher=Noneadded_files=[('C:\\Users\\ThinkPad\\Desktop\\NaughtyConfession\\resources','resources')]a=Analysis(['love.py'],pathex=['C:\\Users\\ThinkPad\\Desktop\\NaughtyConfession'],binaries=[],datas=added_files,hiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)pyz=PYZ(a.pure,a.zipped_data,cipher=block_cipher)exe=EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name='love',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,upx_exclude=[],runtime_tmpdir=None,console=False)其实现就加了一行代码(第六行):added_files=[('C:\\Users\\ThinkPad\\Desktop\\NaughtyConfession\\resources','resources')]然后把(第十行):datas=[],改成:datas=added_files,就这么简单,完了,是不是很惊喜?最后在命令行运行:pyinstaller-Flove.spec同样会在dist文件夹下生成一个打包好的exe文件,双击运行,可以发现直接运行exe文件即可:,我们已经轻松实现了将python程序的素材文件打包成exe文件的目的,当然以上只是我习惯的比较简单方便的方案。如果想详细了解相关内容和原理,请自行查阅官方文档。走吧:https://pyinstaller.readthedocs.io/en/v3.3.1/index.html打包安全也是一样的,我们抛开那一堆花里胡哨的前言,直接开始吧。不如废话一波,有兴趣的朋友自然会自行深入探索。以我们刚才打包的exe文件为例,就是这样:假设我们只把这个exe文件发给我们喜欢的小姐姐/大哥(然后他们就屏蔽了你)。那么对方能不能通过这个exe文件得到你的源代码呢?先贴出答案,是的。让我们一步一步来实现这个目标。首先去这里下载一个解包工具:https://sourceforge.net/projects/pyinstallerextractor/下载后是这样的:然后运行如下命令:pythonpyinstxttractor.pylove.exe运行后发现root了目录变成了这样:more一个文件夹,打开后发现里面有一堆ddl和pyd文件:我们可以在里面找到三个关键文件:其中love就是你之前打包的py文件对应的pyc文件。注意,如果exe文件的名字发生了变化,比如打包后的love.exe改成了pig.exe,那么你找到的文件还是:love.exe.manifest而不是:pig.exe.manifeststruct是还有一个pyc文件。所以现在我们只需要反编译这些pyc文件,随便搜一下就能找到一堆相关的网站:随便选一个:http://tools.bugscaner.com/decompyle/嗯,对了,还要下载一个十六进制编辑器,例如:https://wxmedit.github.io/downloads.html或直接使用notepad++。打开love和struct文件(重命名加后缀就成了pyc文件,这个不用我教T_T):将struct.pyc文件中的前12个字节复制到love.pyc文件中,说Inhuman术语,大家都知道:1B=8bit就是说一个十六进制数需要4bit,剩下的计数工作就不用我教了。总之,经过短暂的操作,love.pyc文件变成了这样:保存,然后拿去在线反编译:可以发现,我们通过单个exe文件成功获取了程序的源代码。但是pyinstaller提供了--key选项,可以实现加密打包,但实际上只是对依赖库进行加密,并没有对主程序进行加密。所以,不想自己的代码泄露的朋友们,在写程序和打包的时候要知道该怎么做。