前面簡單介紹了將python代碼和文件編譯成可脫離環境運行的可執行文件exe。
有編譯就有反編譯,本文來反編譯一下前文中編譯的exe文件。
幾種python文件
在反編譯前,先了解幾種常見的python文件格式:
.py: 源代碼文件,可以用文本編輯器查看和編輯;
.pyc: 源代碼py文件編譯后生成的二進制文件,無法用文本編輯器進行編輯,由python的虛擬機來執行,pyc文件的內容跟python版本相關;
.pyo: 源代碼py文件優化編譯后生成的二進制文件,無法用文本編輯器進行編輯,Python3.5之后,不再使用.pyo文件名,而是使用類似"xxx.opt-n.pyc的文件名;
.pyd: python的動態鏈接庫(dll),允許程序共享執行特殊任務所必需的代碼和其他資源;
.pyz: zipapp打包文件(類似於pyinstaller打包成exe文件)
反編譯exe文件
使用pyinstxtractor.py工具可以將pyinstaller 生成的exe文件解包成pyc文件,項目地址:
https://sourceforge.net/projects/pyinstallerextractor/
將下載的pyinstxtractor.py文件拷到exe相同的目錄,執行命令:
python pyinstxtractor.py 應用程序名稱.exe
執行結果將生成"應用程序名稱.exe _extracted"的文件夾,如下圖所示:
在根目錄下,包括main二進制文件(對應原來main.py)
在PYZ-00.pyz_extracted子文件夾中,包括了引用類庫文件mylib.pyc的二進制文件(對應原來的mylib.py)
轉換pyc文件
pyc是二進制文件,無法直接查看和編譯,需要轉換成py文件。可以使用在線的工具:
http://tools.bugscaner.com/decompyle/
可是直接生成的pyc文件無法直接轉換為py文件,這里分兩種情況來看:
第一種,使用010 Editor,可以看到,根目錄下的pyc文件(如main.pyc)相對於對應原始pyc文件,缺失16個字節。
在E3前插入正確的16個字節即可,這16個字節可在根目錄中struct.pyc下獲得。
轉換后,可能中文會存在編碼顯示問題,可使用在線編碼轉換工具:https://tool.chinaz.com/tools/unicode.aspx
第二種,與前一種類似,但不相同,即引用的文件(如mylib.pyc) 相對於對應原始pyc文件,在第8個字節后,缺少四個字節。補齊后即可轉換成功。
結果邏輯分析
有了py源代碼,接下來就是分析代碼中的業務邏輯了,至於加密文件的解密,在后期的文章中分享。