Проблемы шифрования файлов классов Java

Помимо обфускации, шифрование файлов классов — это легко приходящий на ум метод защиты кода. Многие схемы используют агенты для шифрования файлов классов и их расшифровки при загрузке классов. Однако эти схемы упускают из виду важный момент — встроенный механизм присоединения (attachment) JVM.

Механизм присоединения JVM

Для удобства анализа и мониторинга работы программ обычные JVM оснащены средствами присоединения. Пользователи могут использовать такие инструменты, как jhsdb, для присоединения к процессу JVM, просмотра и анализа данных в памяти. Более того, эти данные в памяти аккуратно организованы в соответствии со структурой данных из исходного файла, что также можно рассматривать как встроенный «чёрный ход» JVM.

Следующая статья описывает, как использовать механизм присоединения JVM для чтения и сохранения информации о файлах классов в памяти.

https://protector4j.com/ru/articles/cracking-encrypted-java-applications-jhsdb/

Помимо инструмента jhsdb, предоставляемого JDK, вы также можете использовать Arthas от Alibaba для анализа работающих процессов Java.

Перехват (HOOK) соответствующих функций для получения информации о динамически загружаемых классах

Некоторые методы защиты загружают информацию о классах динамически через рефлексию, и этот подход также может быть использован для получения информации о загружаемых классах в реальном времени через DLL-инъекцию. Подробнее см. следующие два проекта.

https://github.com/ViRb3/jvm-dump-proxy

https://github.com/zorftw/JVM-Native-Classdumping

Заключение

Из-за наличия механизма присоединения JVM или бинарного механизма HOOK весь так называемый зашифрованный код, который не был отделён от нормальной работы JVM, может быть легко прочитан с помощью инструментов присоединения или перехвачен через DLL-инъекцию. Поэтому это наименее эффективное решение для защиты.