Проблемы обфускации кода
Обфускация кода — это самое раннее решение, применяемое для защиты Java-кода, а также наиболее прямой подход.
Обфускация кода обычно включает следующие четыре метода:
- Преобразование имён пакетов, классов и переменных
- Изменение управляющих структур, например, выравнивание потока управления, добавление неизменяемых предикатов и т.д.
- Обфускация или шифрование строк
- Добавление бесполезного кода
Обфускация кода может значительно снизить читаемость декомпилированного кода и увеличить сложность статического анализа, однако независимо от того, как выполняется обфускация, логика выполнения программы не изменяется.
Байт-код JVM — это очень чёткий и явный семантический промежуточный код с высокой читаемостью. Для обфусцированных файлов классов, даже если их невозможно восстановить до читаемого исходного кода Java, они всё ещё могут быть проанализированы на уровне байт-кода. Благодаря высокой семантичности байт-кода Java этот процесс фактически относительно прост.
Мы разработали движок выполнения байт-кода JVM с использованием языков Java и Kotlin. Пользователи могут использовать этот проект для динамической отладки Java-программ на уровне байт-кода в IntelliJ IDEA. Для получения дополнительной информации обратитесь к статье ниже.
https://protector4j.com/ru/articles/jvm-bytecode-engine-written-with-java-and-kotlin/
И мы использовали этот движок для попытки взлома известного обфусцированного кода. Подробный процесс описан в следующей статье:
http://protector4j.com/ru/articles/deobfuscate-with-vlx-vmengine/
Заключение
Из приведённого анализа видно, что благодаря высокой семантичности байт-кода JVM его очень легко анализировать и читать. Логику выполнения можно легко проанализировать с помощью динамической отладки. Написание инструментов динамической отладки не является очень сложной задачей, поэтому обфускация не является надёжным решением для защиты.