こん○○は、よふかしわーくすの、よふかしさんです
Pythonで作ったコードを他者に共有することがあります
ちょっとしたものならソースコードを渡したり
Python環境のない人ならexe化して渡したりしてました
ただ、苦労して解析した仕様を織り込んだものなんかだと
別に有償化したい訳ではないけど、ソースコードは開示したくないなぁ
と思うこともありました
という訳で
難読化してexe化するところまでやってみて、アイコン等のデータ埋め込みなど
色々ハマったので備忘録的に残しておきます
Pyinstallerでの秘匿化
今まではPyinstallerを使って下記のコマンドで暗号化してました
pyinstaller "***.py" --key password
passwordは任意の暗号化キーの文字列です
な ん で す が
既に公式で書かれている通り、ある時点のVersionから–keyコマンドが削除されました
理由は、ざっくり要約すると
- 暗号化キーはアプリ内に保存される
- Pyinstallerのコードを解析すれば暗号化キーの保存場所はわかる
- なので、簡単に復号化可能
- さらに、復号化ツールも配布されている
- 意味ないんでヤメタ
とのこと…
やりたいことをぱっと作って実行するのにPythonは非常に便利なので
他者に中身を開示したくないとき
わざわざネイティブ環境で作成し直すとか結構面倒です
C#もILと呼ばれる中間言語を挟むので、結局オリジナルコードが取り出せるってことで
一般的には難読化で対応してる感じ
ってことで、焼け石に水かもですがPythonを難読化してみようかと思った次第です
難読化ツール
ぱっと見つかるのが、PyminifierとPyarmor
公式で言及されているのはPyminifierなんですが
なんかうまく動作させられなくって、Pyarmorを試してうまくいったので残しておきます
今回使用するVersionは
- Python:3.12.4
- Pyarmor:9.0.7
- Pyinstaller:6.11.1
で解説していきます
Pyarmorをインストールしてみた
まずはインストール
pip install pyarmor
インストール後、バージョン確認
pyarmor --version
結果はこんな感じ
Pyarmor 9.0.7 (trial), 000000, non-profits
License Type : pyarmor-trial
License No. : pyarmor-vax-000000
License To :
License Product : non-profits
BCC Mode : No
RFT Mode : No
CI/CD Mode : No
Notes
* Can't obfuscate big script and mix str
This is trial license
Pyarmorで難読化してみる
このバージョンのPyarmorの場合、下記のコマンドで難読化できます
pyarmor gen test.py
これでdistフォルダに難読化されたtest.pyが作成されます
今回はひとつのexeファイルにまとめて配布したいので
Pyinstallerがインストールされている状態で、下記コマンドを使用します
pyarmor gen --pack onefile test.py
これでdistフォルダに難読化されたコードをベースに実行形式にしたtest.exeが作成されます
さらにexeにアイコン付けたい、アイコンをexeに埋め込みたいなどの場合は下記コマンドを使用します
ついでにコンソール画面も出ない様にします
pyarmor cfg pack:pyi_options = " --noconsole --icon icon1.ico --add-data icon2.ico;./"
pyarmor gen --pack onefile test.py
この辺りはPyinstallerのオプションに従いますが
pyi_optionsの最初のダブルクォーテーションの後に半角スペースを入れる点に注意です
また、
–icon=icon1.ico、ではなく
–icon icon1.ico、とイコールではなく、半角スペースにする点に注意です
ざっと参照したドキュメントを記載しておきます
Pyarmorに関しては、下記の公式ドキュメント
https://pyarmor.readthedocs.io/en/latest/index.html
特にコマンド、オプションに関しては下記
https://pyarmor.readthedocs.io/en/latest/reference/man.html
実行ファイル形式に関しては下記
https://pyarmor.readthedocs.io/en/latest/topic/repack.html
旧バージョンのPyarmorの使い方
難読化コマンドをネットで調べるとよく見つかるのは下記コマンドです
pyarmor obfuscate test.py
この”obfuscate”コマンドはPyarmorのVersion 8世代までは使われていましたが
Version 9世代からは先述の通り”gen”コマンドに変わっています
また、Python 3.11以降に対応していないため
PythonとPyarmorのバージョンの整合を合わせる必要があります
試しに、
- Python3.10世代の最新
- PyarmorのVersion 7世代
の組み合わせて使ってみるトライを仮想環境を使用して実施してみたので備忘録
PowerShellの管理者権限で…
### この項目は初回のみ実施
# Chocolateyをインストール
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
# Chocolateでpyenvをインストール
choco install pyenv-win
# pyenvをアップデート
pyenv update
# Python 3.10.11をインストール
pyenv install 3.10.11
# pipenvをインストール
pip install pipenv
# 任意の作業ディレクトリに移動
cd C:\test
# pyenvで実行するPythonのバージョンを指定
pyenv local 3.10.11
# pipenvで実行するPythonのバージョンを指定
pipenv --python 3.10.11
# 仮想環境を実行
pipenv shell
# 仮想環境にパッケージをインストール
# ***はインストールしたいパッケージ名
# 通常だとpip install ***で指定する名称に相当
pipenv install ***
# Pyarmorで難読化
pyarmor obfuscate test.py
と、こんな感じでトライアルはうまくいきました
終わりに
ひとまず、PythonコードをPyarmorで難読化、そしてexe化するところまでできました
Pyarmorには他にもオプションが色々あるのと
今回使用したのはTrial Editionなので
使用する場合は利用規約に注意です
公開日時:2025/01/15 0:05:55
コメント