見出し画像

Pythonを難読化しつつEXE化する方法

Pythonアプリを配布する際の覚書です。
スクリプト内容を難読化した上でEXE化する手順をまとめました。
パッケージ化にはPyinstaller、難読化にはPyArmorを使用します。
PyInstallerをそのまま使用するとWindownsDifenderやアンチウィルスソフトに引っかかって不便なのでその対策もします。

実行環境
・Windows10 Home 64bit 
・Python 3.9.5
・pip 21.2.1
インストールしたもの
・PyInstaller 4.5.1
・PyArmor Trial Version 7.2.3
・wheel 0.37.0

Pyinstaller準備

参考記事
pipでインストールしたPyInstallerだと吐き出されたexeファイルがウィルス判定されることがあるため、前もって対策します。
どうやら、ブートローダを自前の環境でビルドすればいいらしいです。

①pyinstallerのリポジトリをクローンします。
※gitコマンドを使うには予めGitを入れておく必要があります。

git clone https://github.com/pyinstaller/pyinstaller

②カレントディレクトリを移動

cd pyinstaller/bootloader

③下記コマンドを実行

python ./waf distclean all

④ブートローダを構築します。
※Error: Building wheels requires the 'wheel' package. Please `pip install wheel` then try again.がでたらpip install wheelをしてから再度実行します。

python ../../setup.py install

PyArmor準備

pipでインストールします。

pip install pyarmor

EXE化手順

参考記事
コマンドプロンプトでパッケージ化したいスクリプトが置いてあるディレクトリへ移動して以下のコマンドを実行します。
-eの後の""内にpyinstallerへ渡すオプションを指定できるみたいです。
※xxx.pyがEXE化したいスクリプトです。

pyarmor pack -e " --onefile --noconsole" xxx.py

いちいちコマンド打つのが面倒なのでバッチファイルにしました。
pythonファイルをバッチにドラッグアンドドロップして使います。

ちなみに、スクリプト以外のリソースファイル(画像データとか)とかを含めたプロジェクトの場合はこんな感じのコマンドにすれば、実現できます。
以下はpythonスクリプトがあるディレクトリにresourcesというフォルダを作成してその中に必要なファイルを入れておく場合。
※リソースファイルは難読化されないので注意

pyarmor pack -e " --onefile --add-data='resources;resources'" xxx.py

exe化したスクリプトでresourcesフォルダ内のファイルを参照する場合はファイルのパス取得にご注意下さい。
以下のような関数を作って参照するといいみたいです。
参考記事

def resourcePath(filename):
  if hasattr(sys, "_MEIPASS"):
      return os.path.join(sys._MEIPASS, filename)
  return os.path.join(filename)

#EXE化時のresourcesフォルダのファイル参照
print(resourcePath("resources/参照したいファイル名"))


この記事が気に入ったらサポートをしてみませんか?