首先是用pyinstxtractor
這個網上很多教程,不詳說了。
生成一個xxx.exe_extracted目錄
生成過程中,如果pyinstaller用key加密了,會
[!] Error: Failed to decompress PYZ-00.pyz_extracted\Cython\__init__.pyc, probably encrypted. Extracting as is.
這個說是fail了,其實可以解決,後面詳說。
這個目錄裡,一堆xxx.pyc檔案和一個PYZ-00.pyz_extracted目錄
反編譯.pyc和.pyc.encrypted
Unsupported Python version, 3.9.0, for decompilation
這堆xxx.pyc檔案是沒有加密的,直接用uncompyle6(也叫decompile3)(僅支援到python3.8,而我這個是3.9)或者pycdc(部分支援3.9及以上)
而PYZ-00.pyz_extracted裡的.pyc.encrypted是加密了的,需要解密。(這裡看情況,一些的程式不需要研究PYZ-00.pyz_extracted里加密了的庫檔案)
pycdc(也叫Decompyle++)
(有個線上支援3.9的網站,https://tool.lu/pyc,我懷疑也是用的pycdc。要會員才能多次用,我就沒繼續用。)
據說Windows上編譯比較麻煩,我直接用的編譯好的。
https://github.com/serfend/pydumpck
pip安裝之後
site-packages\pydumpck\pyc_checker\lib_pycdc\pycdc.exe
我是把pycdc.exe複製出來單獨執行的,因為我嫌pydumpck生成了幾個單獨的目錄看著麻煩。
[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
.\pycdc.exe .\a.pyc > .\a.py
這裡注意,部分.pyc檔案會處理發編譯部分程式碼缺失的情況,會出現報錯,因為pycdc並沒有完善地支援python3.9+(Unsupported opcode )
struct magic number
https://github.com/MrWQ/reverse_pyinstaller
https://bbs.kanxue.com/thread-277811.htm
多個部落格中說需要給.pyc檔案前邊加幾個位元組的魔數。不過我沒加也用pycdc成功反編譯了。不知道為什麼
(這兩個檔案是否帶.pyc字尾和你使用的pyinstxtractor.py工具版本有關係。V2.0以前的版本,會生成兩個不帶.pyc字尾的檔案,手動為它新增.pyc字尾即可。如下圖所示:)
加密的key隱藏在哪:pyimod00_crypto_key.pyc
解密邏輯參考:
https://tylinux.com/post/2023-09-05-decrypt-pyinstaller-generated-executable-file/
https://blog.csdn.net/GalaxySpaceX/article/details/130591614