Проблемы шифрования файлов классов 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-инъекцию. Поэтому это наименее эффективное решение для защиты.