Гавриленко А.В., ассистент Козаченко А.А.
Государственное высшее учебное заведение «Национальный
горный университет», Украина
Методика защиты JAVA-приложений от декомпиляции
Одним из наиболее важных моментов является
защита от несанкционированного использования программного обеспечения. Не существует программных продуктов,
которые не поддавались бы взлому. И совсем не важно на каком языке
программирования написана программа. Затраты на взлом могут быть различными и
поэтому все основные действия по защите от нелегального использования должны
быть направлены на затруднение возможных действий, связанных с
несанкционированным копированием, отладкой, декомпиляцией и модификацией
программ.
Для несанкционированного использования злоумышленник, как
правило, должен выполнить набор манипуляций по отладке или декомпиляции кода, а
так же его модификации. Защита от отладки и декомпиляции является моментом, на
котором можно максимально затруднить задачу взломщика.
Современные средства, такие как .NET и JAVA платформы,
подвержены декомпиляции, особенно это касается JAVA-программ, которые распространяются
свободно.
В языке программирования Java, компилятор не создает
конечный машинный код, а всего лишь его платформенно независимое представление.
Полученный байт-код содержит очень много осмысленной информации, которая может
помочь разобраться взломщику программы в принципе её работы.
В связи с
данной проблемой было решено разработать методику защиты JAVA-приложений от
декомпиляции. В ее основе лежат принцип шифрования «на лету» и динамическая
загрузка классов.
Для
защиты байт-кода используется его шифрования. В качестве алгоритма шифрования
был выбран алгоритм AES. Advanced Encryption Standard (AES) — это симметричный
алгоритм блочного шифрования (размер блока 128 бит, ключ 128/192/256 бит. Этот
алгоритм хорошо проанализирован и сейчас широко используется.
Однако одно шифрование не позволяет построить стабильную
защиту от декомпиляции JAVA-приложения. Одной из основных особенностей
платформы Java является модель динамической загрузки классов, которая позволяет
загружать исполняемый код в JRE (Java Runtime Environment) не перезагружая
основное приложение. Во время работы приложения, не только система, но и
пользователь (расширяя функциональность класса java.lang.ClassLoader) имеет
возможность создавать загрузчики классов. Связь между различными загрузчиками
регламентируется моделью делегирования загрузки (Рис.1). [1]
Рис.1. Модель
делегирования загрузки
Для
динамической загрузки JAVA-классов было принято решение разработать
пользовательский загрузчик. Классы главной программы шифруются AES
и хранятся в зашифрованном виде. Для безопасного выполнения главной программы
необходимо запустить пользовательский загрузчик, который динамически загрузит,
расшифрованные «на лету» классы данной программы и отправит исполняемый код на
выполнение в JRE.
На данный
момент существующие методы защиты не позволяют эффективно противодействовать
декомпиляции и дизассемблированию. Фактически эти методы только усложняют
потенциальную атаку и увеличивают ее время. Поэтому необходимо использовать
комплекс мероприятий по защите кода от несанкционированного использования и
копирования. Разработанная методика защиты JAVA-приложений реализует такой
комплекс. Она включает в себя полное шифрование кода «на лету». Расшифровка
происходит непосредственно перед выполнением программы, а расшифрованный код
передается в отдельно разработанный пользовательский загрузчик классов, который
динамически загружает JAVA-классы и отправляет их на выполнение в JRE. Таким
образом, данный подход позволяет построить стойкую ко взлому систему защиты
JAVA-приложений.
Литература:
1.
Основы
динамической загрузки классов в Java. Режим доступа: https://
blogs.oracle.com/vmrobot/entry/основы_динамической_загрузки_классов_в.
2. Загрузка классов в Java.
Теория. Режим доступа: http://habrahabr.ru/post/103830/
3. Обзор способов защиты
программных продуктов на Java. Режим доступа: http://kes.narod.ru/people/lexus/JavaSourceCodeProtection.htm