コード難読化の問題
コード難読化は、Java コード保護に適用された最も初期のソリューションであり、最も直接的なソリューションでもあります。
コードの難読化には通常、次の 4 つの方法が用いられます。
- パッケージ名、クラス名、変数名の変換
- 制御フローの平坦化、不変述語の追加など、制御構造が変更されます。
- 文字列の難読化または暗号化
- 無駄なコードを追加する
コード難読化により、逆コンパイルされたコードの可読性が大幅に低下し、静的分析の難易度が高まりますが、コード難読化をどのように実行しても、プログラムの実行ロジックは変更されません。
JVMバイトコードは、非常に明確で明示的なセマンティック中間コードであり、非常に可読性が高いです。難読化されたクラスファイルは、たとえ可読なJavaソースコードに復元できない場合でも、バイトコードレベルで解析可能です。Javaバイトコードの高いセマンティック性により、このプロセスは実際には比較的容易です。
JavaとKotlin言語を用いたJVMバイトコード実行エンジンを開発しました。このプロジェクトを利用することで、IntelliJ IDEAでJavaプログラムをバイトコードレベルで動的にデバッグできます。詳細については、以下の記事をご覧ください。
https://protector4j.com/articles/jvm-bytecode-engine-written-with-java-and-kotlin/
そして、このエンジンを使って、よく知られている難読化されたコードを解読しようとします。具体的な手順については、次の記事を参照してください。
http://protector4j.com/articles/deobfuscate-with-vlx-vmengine/
結論
上記の分析から、JVMバイトコードの高いセマンティシティにより、解析・読み取りが非常に容易であることがわかります。実行中のロジックは動的デバッグによって容易に解析できます。動的デバッグツールの作成はそれほど複雑な作業ではないため、難読化は信頼できる保護ソリューションではありません。