Javaクラスファイル暗号化の問題点
難読化に加えて、クラスファイル暗号化はコード保護の容易に思いつく方法です。多くのスキームでは、エージェントを使用してクラスファイルを暗号化し、クラスのロード時に復号化します。しかし、これらのスキームはJVMの組み込みアタッチメカニズムという重要な点を見落としています。
JVMアタッチメカニズム
プログラムの動作分析と監視を容易にするために、通常のJVMにはアタッチメント機能が付属しています。ユーザーはjhsdbなどのツールを使用してJVMプロセスにアタッチし、メモリデータを表示・分析できます。さらに、これらのメモリデータはソースファイルのデータ構造に従って適切に整理されており、JVMの組み込みバックドアメカニズムとも理解できます。
以下の記事では、JVMアタッチメカニズムを使用してメモリ内のクラスファイル情報を読み取り保存する方法を紹介しています。
https://protector4j.com/ja/articles/cracking-encrypted-java-applications-jhsdb/
JDKが提供するjhsdbツールに加えて、Alibaba社のArthasを使用して実行中のJavaプロセスを分析することもできます。
HOOK関連機能による動的ロードされたクラス情報の取得
一部の保護方法はリフレクションを通じてクラス情報を動的にロードし、このアプローチではDLLインジェクションを通じてリアルタイムでロードされたクラス情報を取得することもできます。詳細については、以下の2つのプロジェクトを参照してください。
https://github.com/ViRb3/jvm-dump-proxy
https://github.com/zorftw/JVM-Native-Classdumping
結論
JVMアタッチメカニズムまたはバイナリHOOKメカニズムの存在により、通常のJVM操作から分離されていないすべてのいわゆる暗号化コードは、アタッチツールを使用して簡単に読み取ったり、DLLインジェクションを通じてフックしたりできます。したがって、これは最も効果のない保護ソリューションです。