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