見出し画像

Pythonのソースコード難読化のPyarmorの理解にてこずった

色々試行錯誤してPyarmor流の作業手順と勘所を理解した。これでほぼ自由にサクッと自分のPythonソースコードを難読化+exe化して配布状態に持って行ける。

集中しすぎて疲れ果てたのでから寝ればいいのに、寝る前にメモしておこうと思った。そうしないと明日寝て起きて忘れていたら悲しいので。

(約 4,500文字の記事です。)



Pyarmorの検証完了

地味に引っかかった。本当に地味なところに引っかかって6時間消えた。最終的に解決できたのでよかったがそうでなければ地獄だった。Zscriptコーディング時代の地獄を味わった。

最新版でもバグがある、多分

これは私のPythonの知識不足なのかバグなのか分からない。だがドキュメント通りの操作をしてもエラーで実行できないので多分バグ。難読exe化には支障がないのでスルーしてもいいのだが気になってしまったのが運の尽き。難読化Pythonソース出力時に、なぜかエラーで実行できない。本来ならば「人にとって読みづらくても論理的には不変なはずなのでインタプリンタは通るはず」なのだ。だが特定の手順で難読化すると、エラーが発生。は?

だがドキュメントとは違った場所にフォルダを作成して試したらすんなり通った。マジで目が点になる。色々試行錯誤して「たまたまうまくいった」場合と「どうやってもエラーを解消できない場合」が発生。この切り分けに6時間だ。

気になる点が4つあれば、二択だとしても、試すべき事象は2の4乗で16通りある。検証作業に膨大な時間が取られる。0.5×16=8時間だね。単純計算でも。でもその過程で新たな「可能性」が出てくると、もう無限に膨れ上がるわけよ。何が原因なのか結局分からずじまいだが、自分が欲しい機能については上記バグを回避できる手順を明らかにしたので撤退。

バージョンごとに使用可能オプションが大幅に変わっている

ウェブ上にあるPyarmor関連の情報はかなり「ハズレ」が多い。だいぶ前のPyarmorバージョンのオプションの解説だったりする。今の8.5系ではかなり変わっている。信じられるのはドキュメントだけ。

また英語。そう、なのでプログラミングでは英語から逃げない方がお得。だって、何でもかんでも英語なのだから、それを乗り越えれば逆に言えば「何でもかんでも英語で情報が手に入る」とも言えるのだ。逃げるのではなく受け入れる。迎え撃つ!


Pythonの難読化手順は手に入れた

色々試行錯誤してPyarmor流の作業手順と勘所を理解した。これでほぼ自由にサクッと自分のPythonソースコードを難読化+exe化して配布状態に持って行ける。

そしてもしソフトを配布するにしても、

  1. 単一exeに固めるのか

  2. 最小限のexe+フォルダにその他を収録するのか

の二択ある。これについてはPyInstallerのドキュメントを読めばすぐに分かる。ソースコードの秘匿化ならば2しかない。今回はそのテストの仮定でahkソースファイルもPythonソースコードに収めることで2でもahkソースを丸ごと難読化することができた。課題はクリア。

またPyInstallerではできてPyarmorではできないことも、難読化exe完成後に手動でファイルのD&Dなどでフォルダに必要なものを入れればいいことも確認できた。一手間かかるが、今はこれ以上時間をかけられない。自動化についてはいくつか手段があるが、後回し。

とにかくこれで、もしソフトが完成したとしても配布時にある程度のセキュリティーは保たれる。


では次、ライセンス関連の確認。

AutoHotkeyの利用

色々調べて、特にGPL v2.0についてGNU公式サイトの和訳サイトを熟読した結果、問題なく使えるパターンがあることが判明した。なのでこれで堂々とAutoHotkeyを利用したソフトを作れる。もちろんソフトへの組み込み方に配慮しないといけない。AutoHotkeyに限らず「インタプリンタを経由させるだけ」の場合にはAutoHotkeyのソースコードをまったく利用していないのでAutoHotkeyのライセンスを継承する必要はないと判断した。これはGCCコンパイラの例外規定がある趣旨を考えても、改変していないコンパイラやインタプリンタの使用そのものに対してライセンスの継承を義務づけないことからも明らかだろう。

なのでAutoHotkey.exeを外部に置いた状態で自作exeが動作していれば基本的には動的リンクと同じ扱いなのでAutoHotkeyのライセンスは及ばないと判断した。

なお前回と同様にGPLライセンスとソフトウェアについては各自の責任において理解および運用して下さい。私は責任を取りません、念のため。

これでAutoHotkey利用上の懸念も解決。


プラグイン開発の外堀は完成

ここまでの検証作業は全部ソフトウェアの外側の話だ。城で言うところの外堀の設置と言えるだろう。まだ本丸どころか城の形すらできていない。設計図だけだ。まだ着工していない。

だが今回の開発から本格的なソフトウェア開発に入ることになるので、こういう外堀は実はとても重要。仮にソフトが「できちゃった」としても、そこから先のリリースやライセンス関連はいい加減にしていると痛い目にあう。先手で確認作業が必須の項目だ。あとから分かってから撤回や火消しは痛手になる。なので地味だが最初に手を打つ必要があった。

ソースコードの難読化については、まぁそこまでせずとも、とも思ったがPythonのPyInstallerはデコンパイルが比較的容易とのことなので、転ばぬ先の杖と言うことで。気分の問題が大きいが、カジュアルなコピーやパクリは嫌なので。自衛。ついでにAutoHotkeyのソースまで含めてしまえばほぼ安心。

その検証過程でAutoHotkeyによるexe化は難読化ゼロ、ザル状態だということも勉強になった。exeは必ずしも「全部がバイナリデータじゃない」ということを学んだ。


IDE環境に慣れてきた

Pythonの試行錯誤ではPyCharmをいじり回したので、だんだん体になじんできたw 最初は分けの分からない項目だらけだったが少しずつ「これはあの機能、このボタンはあのとき使う」などが分かってきて、少しずつ慣れてきた。同様にVS CodeもAutoHotkeyのソースコード編集では便利。どちらも同じ使い勝手で同じような位置に同じような機能があるので使いやすい。またどちらもリアルタイムデバッグ可能なので些細なミスは即座に波線や警告色で気が付ける。テキストエディタでAutoHotkeyソースをいじっていた頃に比べればかなりの違いだ。

結局期せずしてPyCharmとVS Codeの両方を使っている。悩む必要などなかった。だがやはりというか、Python限定で言えばPyCharmが色々便利だと感じる。何でもかんでもワンセットなので使い込むほど旨味を感じる。VS Codeはエディタなので、高機能エディタなので、両者の違いはよく分かる。今はAutoHotkey専用IDE環境として活用中のVS Code。


ようやく開発環境が揃った

まぁまとめると、ツールとしてはこんな感じ。

  1. AutoHotkey編集環境としてのVS Code

  2. 同様にZscriptもVS Codeで編集予定。高機能エディタなので。

  3. Python関連はPyCharmで編集

  4. ソフトウェアとしての仕上げもPyCharmで編集

  5. 難読化とexe化はPyarmor。PyCharmコンソール上で作業。

ソフトの制御系としては、

  1. マウスやキーボード操作とGUIはAutoHotkey

  2. Zbrushの直接制御はZscript

  3. AutoHotkeyとZscriptの制御はPython

  4. AutoHotkeyとPythonはPython上でデータのやりとり可能

  5. ZscriptとPythonはファイル経由で入出力

  6. Zbrushでのユーザー操作はZscript経由でPythonやAutoHotkeyを呼び出す

そりゃ~こんだけの仕組みを用いればZscriptのみで実現できる領域を遥かに超える「利便性のあるツールを作れる」のは当然でして。Zscriptオンリーでコツコツと「できるかできないかの検討や試行錯誤」をしなくてもいいが楽(結果、何の成果も得られませんでした、の回避)。

AutoHotkeyでやれるのか、Pythonのほうが楽なのか、という検討が来る。できるかどうかの判断は速い。あとはどうやって実装するかという手段が来る。そしてAutoHotkeyもPythonも情報が豊富にある。メジャー言語の強みだ。

ChatGPTの支援

そしてプログラミング言語がメジャーであることの強みはChatGPTなどの生成AIの支援が強力な点。AutoHotkeyについてはVer.1とVer.2で情報が入り交じっているためChatGPT先生も時々混じったソースコードを提示してくるが、Pythonについてはほぼ堅いソースを答えてくれるので大いに役に立つ。というか勉強にもなる。

ChatGPTはときどきPythonでもAutoHotkeyでも自分のコーディングイメージとはかけ離れた「より効率的、プロっぽいw」ソースコードを提案してくれるので助かる。エラーが出れば1行ずつ人間コンパイルするだけ。それよりもアルゴリズムが勉強になる。自分の発想とは違う発想で驚くが、それが恐らくはプロのプログラマのパターンなのだろうと思えるスリムな美しさがある。ここに感心する。

効率化と言うことよりもこういう「驚きに出会える面白さ」があってChatGPTを使っている😊

生成AIを組み合わせれば、実はプラグインのコア部分の実装作業は実は大したことがないんじゃないか?と思っている。いや、実際にはアルゴリズム的には結構面倒臭いことがいくつか分かっているのだが、理解できている段階でほぼ完成は明らか。あとは実装すればいいだけだが、そこについてChatGPT先生に協力してもらえれば、自分が考える以上にスマートなソースコードが出てきそうなので、後はそのバグ潰しをすればアルファ版が完成、というイメージができている。


今まででイメージできて叶わなかったことなどないので、これもおそらくそのように実現されるのだろうな、と思っている。


今日はここまで。


今回の創作活動は約1時間30分(累積 約3,853時間)
(1,103回目のnote更新)

筆者はAmazonアソシエイト・プログラムに参加しています。(AmazonアソシエイトとはAmazon.co.jpの商品を宣伝し所定の条件を満たすことで紹介料をAmazon様から頂けるという大変ありがたい仕組みのこと。)
以下のリンクを経由してAmazonでお買物をするとその購入額の1~3%ほどのお小遣いが私に寄付されます。誰が何を買ったという情報は私には通知されませんのでご安心下さい😊 以下のリンクを経由して頂ければ紹介商品以外のご購入でもOKですよ~。


読んでくれてありがとう。気長にマイペースに書いてます。この出会いに感謝😊