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