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くらいまでしか対応していないっぽいのでこれも辛いところです。

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

pyarmor Python3.8で使えない問題

最近pyarmorの相棒PyInstaller4.0が正式版としてリリースされ、公式的には3.7までのアナウンスなんですがどうやら3.8も動くとのこと。

「exeファイルまでいけないなら無理にpythonのバージョン上げなくてもイイか」と考えてPython3.7を使っていたのですが、exe化対応とあっちゃあ、3.8まで上げざるを得ません。

やっぱ新しいの使いたいじゃないですか。

ところが今度はPyarmorが動かねぇ

一応Pyarmorの方はと言いますと、比較的早い段階で公式にPython3.8への対応はアナウンスされていました。

が、何故か僕の環境では難読化したファイルが実行できない。

いっつもpackコマンドで一気にexe化まで行ってるもんですから、exeファイルが動かない原因がpyarmorあるってことに気づくまで2時間かかりました。

勿論、PyInstaller 単体でexe化したら動いてました(苦笑)

OSError: exception: access violation reading

OSError: exception: access violation reading

さて、問題のPyarmorさんこんな感じの謎のエラー。

最早絶対分からんヤツです。

なんせ難読化しただけのスクリプトの実行が妨げられています。

「Python3.7で難読化した_pytransformの影響でも受けてるのか」とか思ってPath内にある3.7で難読化時に生成された_pytransform削除してみたりしましたが一向に改善しません。

自分では絶対に分からないviolation reading解決方法

やっぱりなんだかんだ言っても同じ問題で困ってるヤツは居るもんです。

で、制作者の方が解決してるやり取りがGitHubにあったので、解決方法だけ、転載しておきます。

Pyarmorインストールフォルダ直下pytransform.py

ここ、探します。

僕の使ってるPyarmorのバージョン6.4.2では328行目でした。

でこのコメントアウトを外します。

これで動きました!(こんなん作ったヤツしかわからんやろ・・・。)

やっと3.8デビューできるぅ。(世間はもう今3.9...)

pyarmorもPyInstaller も素晴らしいツールですので、ちゃんと金払って使いましょう。支援。