Pythonスクリプトの難読化



PyInstallerだけだとちょっとこなれた程度の人には効きますが、それでも比較的簡単にデコンパイルされてしまいます。

何としても表に出したくないコードがあったため、必死にPythonスクリプトの難読化を調べました。

単純に全部難読化するだけならちょっとググるだけでどこにでも情報は出てくるのですが、各種条件全部適用させるために割と時間食ったのでメモ書き。

PyArmorの pack コマンドで一気にexeファイル化までいける

超結論からです。

PyArmorのpackコマンドからPyInstallerが立ち上がります。
そのまま放っておいたら勝手に難読化した上でexeファイル化出来る事が分かりました。

リバースエンジニアリング不可レベルの難読化かけれるのはPyArmorくらいみたいですね。ほぼ一択。

それでもその気になれば解析できるのかもしれませんが、とりあえずデコンパイルしようとする相手の心を折って、戦意喪失させるのが目的ですの。

ぱっと調べた限りPyArmorのdecryptツール的なものは見当たらなかったので、これで行こうと思います。

リバースエンジニアリングも、結局時間かければ出来るのは間違いなんでしょうが、そこはもうコストとリターンの話なので。

packコマンドの実行内容

Execute pyarmor obfuscate to obfuscate myscript.py
Execute pyinstaller myscipt.py to create myscript.spec
Update myscript.spec, replace original scripts with obfuscated ones
Execute pyinstaller myscript.spec to bundle the obfuscated scripts

https://pyarmor.readthedocs.io/en/latest/usage.html

順次これらの操作を実行している模様。シームレスでこれらの作業をやってくれるコマンドですね。

ちなみにPyarmor自体はあくまでスクリプト自体を難読化するためのツールですので、packコマンドを使うためには別途PyInstallerのインストールは必須です。
両方ともpipで入るので、インストールは割愛。

とりあえず、簡単にやるならパッケージのトップの.pyファイルを指定して以下のコマンドでOK。

これだけで難読化→exe化まで一気に行けます。

が、いっぱい余計なファイルが生成されたり、GUIで作ってるのにexeから起動したら黒いコンソール立ち上がったりしてちょっとウザい。

PyArmorから立ち上がるPyInstallerにそこら辺のオプション渡せてないのが原因ですね。

PyInstallerにonefileとnoconsoleを渡す

PyInstallerで作ったexeファイル起動時に、依存関係にあるファイルを全てまとめて単一のexeファイルにするコマンドオプションが "--onefile" 、黒いコンソールを立ち上げないようにするコマンドオプションが "--noconsole" です。

-eオプションでPyInstallerに渡すオプションを指定できるようです。
ダブルクォーテーションで囲っているのと、はじめにスペースが入るのがミソです。

https://buildmedia.readthedocs.org/media/pdf/pyarmor/latest/pyarmor.pdf

引数で渡すファイル名はPythonパッケージファイル群の最上位になるファイルです。__main__.py とかが多いんですかね?それさえ渡せば後は勝手に解析してやってくれます。

僕はあまりそういった作り方しないので、疎いです。

にしても、PyInstallerめっちゃ重たいですね。--onefile指定すると特に重たくなります。py2exeはちょっと軽いらしいけどPython3.4くらいまでしか対応していないっぽいのでこれも辛いところです。

重たい原因判明しました↓