簡單介紹一下pyinstaller打包以及安全性的實現(xiàn)
pyinstaller打包問題
簡單介紹一下pyinstaller常用的參數(shù):
可選參數(shù) | 示例 | 說明 |
---|---|---|
-F | pyinstaller -F demo.py | 只在dist文件夾中生成一個程序demo.exe文件,適用于一個模塊沒有多依賴.py文件 |
-D | pyinstaller -D demo.py | 默認選項,除了主程序demo.exe外,還會在在dist文件夾中生成很多依賴文件,推薦使用這個 |
-c | pyinstaller -c demo.py | 默認選項,只對windows有效,使用控制臺 |
-w | pyinstaller -w demo.py | 只對windows有效,不使用控制臺 |
-p | pyinstaller -p D:\project\demo.py | 設(shè)置導(dǎo)入路徑 |
-i | pyinstaller -i D:\icons\demo.ico demo.py | 給生成的demo.exe文件設(shè)置一個自定義的圖標 |
部分參數(shù)可組合使用,比如打包成一個.exe,不使用控制臺:
pyinstaller -w -F demo.py
關(guān)于pyinstaller如何把圖片,音樂,字體等素材文件也打包進exe文件中。這里就不整那些花里胡哨的東西了,直接講講我們該怎么做才能實現(xiàn)這個功能吧,先聲明一下,其實這東西官網(wǎng)里就有教程,不明白且想明白為什么這么做的自己看官網(wǎng)的介紹吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/runtime-information.html
用表白小軟件為例,有用的就這三個文件:
其中love.py
是主程序,cfg.py
是配置文件,resources
文件夾里是一些類似字體,音樂等的素材文件。
先直接試試運行如下命令打包:
pyinstaller -Fw love.py
打包結(jié)束后根目錄變成了這樣:
dist
文件夾里有打包好的exe文件。打開文件夾,直接雙擊運行一下,會發(fā)現(xiàn)報錯:
原因很簡單,因為你沒把相關(guān)的素材文件打包進這個exe文件,而在該目錄下根據(jù)程序本身的設(shè)定是無法讀取到這些素材文件的。你需要先把該exe文件移動到love.py這個主程序所在的目錄,然后雙擊運行:
想要把素材文件也打包進exe文件的話,得先修改下程序,把程序中關(guān)于素材資源加載路徑的相關(guān)代碼從(在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')
改成:
if getattr(sys, 'frozen', False): cur_path = sys._MEIPASS else: 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') # ICON路徑 ICON_IMAGE_PATH = os.path.join(cur_path, 'resources/images/icon.png')
然后新建一個.spec文件,當然,為了方便,你可以直接打開剛剛生成的那個.spec文件(就是運行最前面那個打包命令時,也會根據(jù)你的命令來生成一個love.spec文件),類似這樣:
打開該文件,可以發(fā)現(xiàn)該文件里的內(nèi)容是這樣的(為了方便某些懶癌患者復(fù)制粘貼,我就不截圖而是直接把內(nèi)容copy下來了):
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis(['love.py'], pathex=['C:\\Users\\xx\\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 ; coding: utf-8 -*- block_cipher = None added_files = [('C:\\Users\\xx\\Desktop\\NaughtyConfession\\resources', 'resources')] a = Analysis(['love.py'], pathex=['C:\\Users\\xx\\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\\xx\\Desktop\\NaughtyConfession\\resources', 'resources')]
然后把(第十行)datas=[],
改成了datas=added_files,
就這么簡單就完事了,最后在命令行運行:
pyinstaller -F love.spec
同樣地,在dist文件夾里會生成打包好的exe文件,雙擊運行一下,可以發(fā)現(xiàn)這個exe文件竟然可以直接運行啦:
至此,我們輕松地實現(xiàn)了將python程序的素材文件一起打包進exe文件的目標。當然,上面只是介紹了一種個人比較習慣且相對簡單方便的解決方案,想了解更多相關(guān)內(nèi)容以及原理,各位小伙伴還是自己去查閱官方文檔吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/index.html
pyinstaller安全性問題
以我們剛剛打包好的exe文件為例,就是它:
假設(shè)我們只把這個exe文件發(fā)給了心儀的小姐姐/小哥哥(然后人家拉黑了你)。那么對方能不能通過這個exe文件來獲得你的源代碼呢?可以。讓我們一步步操作下去來實現(xiàn)這個目的。
先到這下載個解包工具:
https://sourceforge.net/projects/pyinstallerextractor/
下載后長這樣:
再下載個十六進制編輯器,一會要用到:
https://wxmedit.github.io/downloads.html
然后運行如下命令:
python pyinstxtractor.py love.exe
運行后發(fā)現(xiàn)根目錄變成了這樣:
多了一個文件夾,打開后發(fā)現(xiàn)里面一堆ddl,pyd文件:
在這里面我們可以找到三個比較關(guān)鍵的文件:
其中l(wèi)ove就是你之前打包的那個py文件對應(yīng)的pyc文件。注意,如果exe文件名被改動過,比如一開始打包好的love.exe被改成了pig.exe,那么你找到的文件仍然是love.exe.manifest
,而不是pig.exe.manifest
struct也是一個pyc文件。于是我們現(xiàn)在只需要反編譯這些pyc文件就行了,隨便搜索下就可以發(fā)現(xiàn)一堆相關(guān)的網(wǎng)站:
隨便選一個就OK了:
http://tools.bugscaner.com/decompyle/
打開love
和struct
文件(重命名一下加個后綴就變成pyc文件):
把struct.pyc
文件里的前12個字節(jié)復(fù)制到love.pyc
文件里,love.pyc
文件變成了這樣:
保存,然后拿去在線反編譯,即可拿到源碼。
可以發(fā)現(xiàn)我們已經(jīng)成功地通過exe文件獲得了程序的源代碼。
不過pyinstaller提供了–key這個選項,可以實現(xiàn)加密打包,但實際上它只對依賴庫進行了加密,并沒有對主程序做加密處理。
到此這篇關(guān)于簡單介紹一下pyinstaller打包以及安全性的實現(xiàn)的文章就介紹到這了,更多相關(guān)pyinstaller打包及安全性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Scrapy基于Python構(gòu)建強大網(wǎng)絡(luò)爬蟲框架實例探究
這篇文章主要為大家介紹了Scrapy基于Python構(gòu)建強大網(wǎng)絡(luò)爬蟲框架實例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01python實現(xiàn)微信接口(itchat)詳細介紹
這篇文章主要介紹了python實現(xiàn)微信接口(itchat)詳細介紹,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。2017-10-10