Javaクラスファイルの暗号化に関する問題
難読化に加え、クラスファイルの暗号化はコード保護の手段として容易に考えられます。多くの手法では、エージェントを用いてクラスファイルを暗号化し、クラスのロード時に復号化します。しかし、これらの手法は重要な点、つまりJVMに組み込まれたアタッチメント機構を見落としています。
JVM接続メカニズム
プログラムの動作の分析と監視を容易にするために、一般的なJVMにはアタッチメントが付属しています。ユーザーはjhsdbなどのツールを使用してJVMプロセスにアタッチし、メモリデータを表示・分析できます。さらに、これらのメモリデータはソースファイルのデータ構造に従って適切に整理されており、これはJVMに組み込まれたバックドア機構とも言えます。
次の記事では、JVM アタッチ メカニズムを使用してクラス ファイル情報をメモリに読み取って保存する方法について説明します。
https://protector4j.com/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-ネイティブクラスダンプ
結論
JVMアタッチメントメカニズムまたはバイナリフックメカニズムの存在により、通常のJVM動作から切り離されていないいわゆる暗号化コードは、アタッチメントツールによって簡単に読み取られたり、DLLインジェクションによってフックされたりする可能性があります。したがって、これは最も効果のない保護ソリューションです。