Pythonのソースコードを難読化するためのPyArmorに関する記事です。
この記事を読めば、PyArmorに関して大体のことを理解できます。
本記事の内容
- PyArmorとは?
- PyArmorのシステム要件
- PyArmorのインストール
- PyArmorでPythonスクリプトを難読化する
それでは、上記に沿って解説していきます。
PyArmorとは?
PyArmorは、Pythonスクリプトの難読化に関するコマンドラインツールです。
最も重要なことは、無料体験版と有料版があるということです。
基本的には、PyArmorは企業が販売している製品だと考えてよいでしょう。
だからこそ、機能的には充実しています。
しかし、ここではそれらを一つ一つ説明しません。
「Pythonスクリプトの難読化」、これだけに絞ります。
Pythonスクリプトの難読化は、無料体験版でも可能です。
また、体験版といっても有効期限は存在しません。
つまり、無料で使い続けることが可能ということです。
もちろん、無料体験版には制約があります。
その制約とは、以下。
- コードオブジェクトの最大サイズは32756バイトまで
- 難読化されたスクリプトは非公開ではない
- 1つのモジュールに32個程度の関数の個数制約がある
- 無断で商用製品のPythonスクリプトに使用できない
「非公開ではない」に関して、説明しておきます。
難読化する際にキー(ライセンスと表現されている)のようなモノがあります。
このキーがあれば、難読化されたスクリプトを動かすことが可能になります。
このキーが、無料体験版ではすべて同じということです。
そのため、「非公開ではない」という表現になるのでしょう。
PyArmorのシステム要件
PyArmorは、企業が開発して販売している製品です。
そのため、OSは以下のすべてで対応しています。
- Windows
- macOS
- Linux
加えて、組み込み系の環境でも動くようです。
そして、Pythonのバージョンもカバー範囲が広いです。
- Python 2.5
- Python 2.6
- Python 2.7
- Python 3
Python 2.7に対応しているオープンソースは、そこそこ存在しています。
しかし、Python 2.6や2.5に対応しているモノはなかなか見ませんね。
やはり、有料だと簡単にはサポートを打ち切れないのでしょう。
では、PyArmorのインストールを行います。
もちろん、無料体験版です。
PyArmorのインストール
PyArmor公式サイト
https://pyarmor.dashingsoft.com/
公式サイトを参考にして、インストールしていきます。
まず、現状のインストール済みパッケージを確認しておきます。
>pip list Package Version ---------- ------- pip 20.3.3 setuptools 51.1.1
必要最低限のパッケージしか入っていない状況です。
とりあえず、pipを更新しておきます。
pipコマンドを使う場合には、常に以下のコマンドを実行しておきます。
python -m pip install --upgrade pip
現時点では、pipは更新されませんでした。
では、PyArmorのインストールコマンドを実行します。
pip install pyarmor
処理自体は、一瞬で終わりました。
インストール済みのパッケージ状況を確認しておきます。
>pip list Package Version ---------- ------- pip 20.3.3 pyarmor 6.5.6 setuptools 51.1.1
PyArmorは、他のライブラリに依存しないことがわかります。
その意味では、シンプルですね。
インストールの確認として、次のコマンドを実行しておきます。
>pyarmor --version INFO Create pyarmor home path: C:\Users\username\.pyarmor INFO Create trial license file: C:\Users\username\.pyarmor\license.lic PyArmor Trial Version 6.5.6 PyArmor is a command line tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts. For more information, refer to https://pyarmor.readthedocs.io
とりあえず、動いているのは確認できました。
では、次では実際に難読化してみます。
PyArmorでPythonスクリプトを難読化する
Pythonのプログラムを書いたスクリプトファイルを用意します。
test.py
print("test")
モノ凄く適当です。
では、このPythonスクリプトを難読化します。
>pyarmor obfuscate test.py INFO PyArmor Trial Version 6.5.6 INFO Target platforms: Native ~~~省略~~~ INFO Start obfuscating the scripts... INFO test.py -> dist\test.py INFO Insert bootstrap code to entry script dist\test.py INFO Obfuscate 1 scripts OK.
実行すると、「dist」ディレクトリが作成されています。
この「dist」に移動。
「dist」フォルダにあるtest.pyの内容は、以下。
from pytransform import pyarmor_runtime pyarmor_runtime() __pyarmor__(__name__, __file__, b'\x50\x59\x41\x52\x4d\x4f\x52\x00\x00\x03\x08\x00\x55\x0d\x0d\x0a\x06\x26\xa0\x01\x00\x00\x00\x00\x01\x00\x00\x00\x40\x00\x00\x00\xcb\x00\x00\x00\x00\x00\x00\x18\xee\x1f\x6e\xde\xc7\x17\x75\xa9\xb1\x62\x82\xb5\x7d\xf1\x75\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x5b\x60\x51\x14\xc4\xcd\x35\x11\x45\x0f\xbb\xe3\xf1\x23\x87\x44\x67\x14\x14\x10\x1a\x6c\xff\x05\x73\xbb\xd8\x1f\x8a\x61\x8e\xe6\x1c\x3a\xd4\x87\x5f\x7a\xa7\xf2\x1b\xb3\x74\x05\x8e\xb2\x65\x8c\xcd\x0c\x88\x15\x9c\x86\xf6\xe0\x4f\xe8\xc0\x36\xef\xc3\x1e\x9b\xce\x61\x2c\x47\xc1\x67\x09\x6b\x87\xa5\x55\xb7\x06\x15\x19\x2c\xa4\xef\x3e\xc3\xf3\x9a\x84\x93\x2e\x9c\x5a\x34\x0a\x20\x87\xed\x36\x45\xd4\xc5\xa5\xd0\xf2\x8f\xc3\xbc\x58\x5c\x25\xa3\xe7\x95\x27\xb1\xde\xc2\x15\x99\xa7\xf6\x85\x4a\xb9\x6c\x8b\x35\xa6\x53\x3a\x5c\x3f\xb1\x3e\xde\x83\x0c\xf6\xff\xe5\x68\x50\x27\xcf\xa7\x33\x78\x21\x8c\xcf\x7f\xce\x25\xc9\xc2\xd9\x53\x7f\x1c\xea\x04\xa8\x2f\x74\xeb\xc6\x62\x0f\x73\x85\x13\x1b\xd8\x85\x30\x7a\x7e\xea\x39\xba\x93\xf6\xdb\x87\x90\x98\x9c\x14\xf3\xf5\x67\xe4\x40\x25\x08\xed\x08\xcd\x65\x96\xe3\x25\x1f\x49', 2)
見事に難読化されています。
では、この難読化されたPythonスクリプトを実行してみます。
>cd dist >python test.py test
難読化されたスクリプトが、問題なく動いていますね。