備忘録

備忘録

pyinstallerで作成されたexeをデコンパイルする方法

Ⅰ. はじめに

タイトルの通り「pyinstallerで作成されたexeをデコンパイルする方法」です。

Ⅱ. やり方

1. pyinstxtractor.py をダウンロードする

https://github.com/countercept/python-exe-unpacker

2. exe を展開する
python pyinstxtractor.py hello.exe
3. 拡張子を付け足す
cd hello.exe_extracted
move hello hello.pyc
4. ヘッダを追加する

先頭ヘッダ16バイトが欠損している為、手動で追加する
f:id:kagasu:20190326205644p:plain

オフセット 説明
0x00~0x01 バージョンのマジックナンバー
0x02~0x03 0x0D 0x0A 固定値
0x04~0x0F ゼロで埋める
5. uncompyle6 をインストールする
pip install uncompyle6
6. デコンパイルする
uncompyle6 hello.pyc

実行結果

f:id:kagasu:20190326210345p:plain

トラブルシューティング

Q. マジックナンバーが分かりません。

はじめに、展開されたディレクトリに存在するpython*.dllのバージョンを確認します。
f:id:kagasu:20190326183325p:plain

Python 3.7.0a2 の場合マジックナンバーは 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