簡單介紹一下pyinstaller打包以及安全性的實現
pyinstaller打包問題
簡單介紹一下pyinstaller常用的引數:
可選引數 | 示例 | 說明 |
---|---|---|
-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 | 設定匯入路徑 |
-i | pyinstaller -i D:\icons\demo.ico demo.py | 給生成的demo.exe檔案設定一個自定義的圖示 |
部分引數可組合使用,比如打包成一個.exe,不使用控制檯:
pyinstaller -w -F demo.py
關於pyinstaller如何把圖片,音樂,字型等素材檔案也打包進exe檔案中。這裡就不整那些花裡胡哨的東西了,直接講講我們該怎麼做才能實現這個功能吧,先宣告一下,其實這東西官網裡就有教程,不明白且想明白為什麼這麼做的自己看官網的介紹吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/runtime-information.html
用表白小軟體為例,有用的就這三個檔案:
其中love.py
是主程式,cfg.py
resources
資料夾裡是一些類似字型,音樂等的素材檔案。先直接試試執行如下命令打包:
pyinstaller -Fw love.py
打包結束後根目錄變成了這樣:
dist
資料夾裡有打包好的exe檔案。開啟資料夾,直接雙擊執行一下,會發現報錯:
原因很簡單,因為你沒把相關的素材檔案打包進這個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')
改成:
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檔案(就是執行最前面那個打包命令時,也會根據你的命令來生成一個love.spec檔案),類似這樣:
開啟該檔案,可以發現該檔案裡的內容是這樣的(為了方便某些懶癌患者複製貼上,我就不截圖而是直接把內容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'],datas=added_files,console=False )
其實就加了一行程式碼(第六行):
added_files = [('C:\\Users\\xx\\Desktop\\NaughtyConfession\\resources','resources')]
然後把(第十行)datas=[],
改成了datas=added_files,
就這麼簡單就完事了,最後在命令列執行:
pyinstaller -F love.spec
同樣地,在dist資料夾裡會生成打包好的exe檔案,雙擊執行一下,可以發現這個exe檔案竟然可以直接執行啦:
至此,我們輕鬆地實現了將python程式的素材檔案一起打包進exe檔案的目標。當然,上面只是介紹了一種個人比較習慣且相對簡單方便的解決方案,想了解更多相關內容以及原理,各位小夥伴還是自己去查閱官方文件吧:
https://pyinstaller.readthedocs.io/en/v3.3.1/index.html
pyinstaller安全性問題
以我們剛剛打包好的exe檔案為例,就是它:
假設我們只把這個exe檔案發給了心儀的小姐姐/小哥哥(然後人家拉黑了你)。那麼對方能不能通過這個exe檔案來獲得你的原始碼呢?可以。讓我們一步步操作下去來實現這個目的。
先到這下載個解包工具:
https://sourceforge.net/projects/pyinstallerextractor/
下載後長這樣:
再下載個十六進位制編輯器,一會要用到:
https://wxmedit.github.io/downloads.html
然後執行如下命令:
python pyinstxtractor.py love.exe
執行後發現根目錄變成了這樣:
多了一個資料夾,開啟後發現裡面一堆ddl,pyd檔案:
在這裡面我們可以找到三個比較關鍵的檔案:
其中love就是你之前打包的那個py檔案對應的pyc檔案。注意,如果exe檔名被改動過,比如一開始打包好的love.exe被改成了pig.exe,那麼你找到的檔案仍然是love.exe.manifest
,而不是pig.exe.manifest
struct也是一個pyc檔案。於是我們現在只需要反編譯這些pyc檔案就行了,隨便搜尋下就可以發現一堆相關的網站:
隨便選一個就OK了:
http://tools.bugscaner.com/decompyle/
開啟love
和struct
檔案(重新命名一下加個字尾就變成pyc檔案):
把struct.pyc
檔案裡的前12個位元組複製到love.pyc
檔案裡,love.pyc
檔案變成了這樣:
儲存,然後拿去線上反編譯,即可拿到原始碼。
可以發現我們已經成功地通過exe檔案獲得了程式的原始碼。
不過pyinstaller提供了–key這個選項,可以實現加密打包,但實際上它只對依賴庫進行了加密,並沒有對主程式做加密處理。
到此這篇關於簡單介紹一下pyinstaller打包以及安全性的實現的文章就介紹到這了,更多相關pyinstaller打包及安全性內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!