Защита Java байт-кода шифрованием
На прошлой неделе довелось реверсить декстопную прогу на java от Microsoft. С виду обычный дистрибутив - папки bin/lib/tmp.
Первым делом бросилось в глаза - был только один jar файл: examengine.jar в папке bin с которого запускалась программа. В папке lib лежали несколько файлов jar и файл exam.exj.set содержащий в себе какие-то-то сериализованные данные. Первым делом вскрыл examengine.jar. В нем оказались всего 3 привычных .class файла с нормальной сигнатурой (EClassLoader, ExamEnter, ESettings) и ещё несколько десятков .eclass с бинарными данными (ATable.eclass, EEngine.eclass, EEngine$Source.eclass, и так далее). Первым делом запускаем наш любимый Java Decompiler и вскрываем файл ExamEnter и видим такую конструкцию Код:
private void loadMain() throws Exception { Вскрываем EClassLoader. Код:
final class EClassLoader extends ClassLoader Код:
private byte[] loadClassBytes(String string) throws IOException { Чтобы получить чистый байткод необходимо приложить небольшие усилия в отладчике чтобы выловить ключ и с его помощью расшифровать каждый файл ресурса - но это не каждый сумеет сделать. При использовании дополнительной обфускации незащищенных классов (с оптимизацией) реинжениринг станет ещё сложнее. Таким образом у меня появилась идея создания относительно стойкой к декомиляции сборки дистрибутива: 1) Обычная компиляция исходных файлов в бинарники и нативных библиотек. 2) Формирование ключа AES / или любого другого алгоритма. 3) Шифрование всех class файлов за исключением загрузчика. 4) Обфускация классов загрузчика и оптимизация остальных классов. 5) Сборка jar-архива приложения с ключом. 6) Создание архива с дистрибутивом. Понижение производительности за счет введения шифрования ресурсов незначительно. Класс загружается единожды в приложении (частую при старте приложения), поэтому особых задержек не составит. Сейчас несколько модифицированная система успешно работает на тестовом проекте. Здесь мой копирайт (с) P.S. Защитил диплом в этот вторник на "отлично" xD |
Re: Защита Java байт-кода шифрованием
Цитата:
а если все в exe файл запилить? |
Re: Защита Java байт-кода шифрованием
А теперь внимание. Время на снятие данной защиты стремится к 0. Знать ключи при этом совершенно не обязательно. Увы, но данный механизм защиты (в прочем, как и любой другой механизм защиты байткода) малоэффективен. Причина - это Java, и рано или поздно придется передать нешифрованный байткод JVM. А данная защита еще плоха тем что не прикрывает одну критичную "дыру".
P.S. К тому же, данное решение затрудняет использование ваших jar в "легальных" целях, например для подключения их к IDE с целью своей разработки и получение нормального code-completition. P.P.S. Боле эффективная защита (но опять же, не идеальная, т.к. Java есть Java) уже реализована, лишенная вышеперечисленных недостатков. |
Re: Защита Java байт-кода шифрованием
Цитата:
Цитата:
Цитата:
Добавлено через 1 минуту Цитата:
|
Re: Защита Java байт-кода шифрованием
Цитата:
Цитата:
Цитата:
|
Re: Защита Java байт-кода шифрованием
Цитата:
Цитата:
|
Re: Защита Java байт-кода шифрованием
Не-не.. именно anymore (сколько угодно) в данном контексте. Это перефразировка.
|
Re: Защита Java байт-кода шифрованием
На счет той защиты (CatsByteGuard) я думаю ее можно взламать сделав дамп всех классов из контекста самого приложения, ну а дальше нормальным декомпилятором.
К примеру после старта приложения 1) запустить сканирование classpath на все файлы классов, 2) каждый найденный класс загружать в javassist.ClassPool ( ClassClassPath ), так как внутри приложения работает модифицированный ClassLoader то после ClassLoader#defineClass мы получим чистые классы. 3) и напоследок выгружать дампы в файлы CtClass#save главное подобрать точку маунта для функции выполняющую дамп. Во время работы открыл для себя много нового :] P.S. Не пойму только смысл наименования jsr167.jar, по логике вещей который должен был ссылаться на jsr167. Только вот кому интересна Portlet Specification под Java 1.4. |
Re: Защита Java байт-кода шифрованием
Вот по приведенному вами методу, а еще конкретнее с использованием механизма ClassTransformation снимается описанная вами защита. C CastByteGuard сложнее. Через ClassTransforamtion это не выйдет, на трансформацию передается шифрованный байткод.
Вариант через энумерацию всех классов через javassist пройдет с любой защитой, как я говорил выше - рано или поздно нужно передать байткод JVM. А почему jsr167? Имя либы не имеет никакого отношения к SR, номер был взят "от балды". P.S. Интесно, что нового открыли для себя? :) |
Re: Защита Java байт-кода шифрованием
Цитата:
Цитата:
Добавлено через 4 минуты Цитата:
К сожалению я не силен в реинженеринге dll, однако очень интересно узнать как работает jsr167.dll |
Текущее время: 00:21. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot