反編譯python打包的exe到源代碼


前言

簡單了解反編譯,為保證自己python工程有一定的安全性,嘗試反編譯文件。

目標

Python exe -> pyc -> py

環境

  • windows 7
  • python 3.7
  • PyInstaller 3.5

工具

  • uncompyle6     3.6.4 ( 注:安裝命令  pip install uncompyle)
  • pyinstallerextractor
  • archive_viewer.py (注:該文件位於PyInstaller包中PyInstaller\utils\cliutils\archive_viewer.py)
  • 010 editor (字節查看修改,用於補全pyc文件中的缺失部分)

使用方法

用archive_viewer打開exe文件,x命令解壓(x)需要的文件,輸出到指定文件,並退出(q)

# 法一 單個文件
python archive_viewer.py main.exe
? x struct
to filename? struct.pyc
? q
#########################
# 法二 所有文件
python pyinstxtractor.py main.exe

對比過程,可直接修改要修改的文件。

  1. 到工程目錄下的__pycache__復制一個文件a.cpython-37.pyc
  2. 到解壓的main.exe_extracted\PYZ-00.pyz_extracted中找到對應的文件,記為a.pyc
  3. 使用010editor打開兩個文件,進行對比發現a.pyc少了4個字節,在字節8開始處插入4個0字節后保存(對比發現8到16個字節不同,但是已經可以反編譯了,故忽略)

 

 

 

 

使用uncompyle6 反編譯文件pyc到py

uncompyle6 a.pyc > a2.py
uncompyle6 a.cpython-37.pyc > a1.py

生成的py文件相同,且與源代碼相同

 

總結:

1. 使用pyinstxtractor或者archive_viewer將exe文件解碼出pyc文件(注,只適用於用pyinstaller編譯生成的exe文件)

2. 使用二進制編輯工具,在第8個字節處插入4個0字節

3. 使用uncompyle6反編譯pyc文件到py文件。

注:

參考文檔:

反編譯python打包的exe文件

 

pyc文件格式

1 最開始4個字節是一個Maigc int, 標識此pyc的版本信息, 不同的版本的 Magic 都在 Python/import.c 內定義
2 接下來四個字節還是個int,是pyc產生的時間(TIMESTAMP, 1970.01.01到產生pyc時候的秒數, 本文就是通過添加4個字節為0的時間戳字段來反編譯pyc文件)
3 接下來是個序列化了的 PyCodeObject(此結構在 Include/code.h 內定義),序列化方法在 Python/marshal.c 內定義

Python腳本解壓
import uncompyle6
with open("a.py", "w") as file:
    uncompyle6.decompile_file("a.pyc", file)

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM