Гавриленко А.В., ассистент Козаченко А.А.

Государственное высшее учебное заведение «Национальный горный университет», Украина

Методика защиты 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