Ⅰ. はじめに
タイトルの通り「pyinstallerで作成されたexeをデコンパイルする方法」です。
Ⅱ. やり方
1. pyinstxtractor.py をダウンロードする
2. exe を展開する
python pyinstxtractor.py hello.exe
3. 拡張子を付け足す
cd hello.exe_extracted move hello hello.pyc
4. ヘッダを追加する
先頭16バイトが欠損している為、手動で追加する
オフセット | 説明 |
0x00~0x01 | バージョンのマジックナンバー |
0x02~0x03 | 0x0D 0x0A 固定値 |
0x04~0x0F | ゼロで埋める |
5. uncompyle6 をインストールする
pip install uncompyle6
6. デコンパイルする
uncompyle6 hello.pyc
実行結果
トラブルシューティング
Q. マジックナンバーが分かりません。
2で展開したディレクトリに存在するpython*.dllのバージョンを確認します。
Python 3.7.a2 の場合マジックナンバーは 3391です。
3391を16進数リトルエンディアンで表すと0x3F 0x0Dです。
https://github.com/python/cpython/blob/ab9b31f94737895f0121f26ba3ad718ebbc24fe1/Lib/importlib/_bootstrap_external.py#L261
Q. 以下のようなエラーが出ます。
A. バージョンのマジックナンバーを別の値に変更し、デコンパイルを実行してください
ImportError: Ill-formed bytecode file hello.pyc File hello.pyc doesn't smell like Python bytecode: ImportError: Unknown magic number 3391 in hello.pyc