Захист виконуваного коду java

Розробка рекомендацій з реалізації захисту програмного продукту, написаного мовою Java, шляхом шифрування скомпільованого байт-коду програми. Аналіз проблеми захисту виконуваного коду Java. Шифрування виконуваного коду. Тестування програмного засобу.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 28.04.2016
Размер файла 376,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ЗМІСТ

ВСТУП

1. АНАЛІЗ ПРОБЛЕМ ЗАХИСТУ ВИКОНУВАНОГО КОДУ JAVA

1.1 Архітектура Java

1.2 Завантажувач класів в Java

1.3 Проблеми захисту виконуваного коду Java

1.4 Методи захисту виконуваного коду Java

1.4.1 Обфускація

1.4.2 Перенесення логіки на сервер

1.4.3 Шифрування виконуваного коду

1.5 Висновки

2. ПРОГРАМНА РЕАЛІЗАЦІЯ ШИФРУВАННЯ БАЙТ-КОДУ JAVA

2.1 Реалізація шифрування

2.2 Реалізація завантажувача класу

2.3 Тестування програмного засобу

ВИСНОВОК

ПЕРЕЛІК ВИКОРИСТАНИХ ДЖЕРЕЛ

ВСТУП

java шифрування код програма

В основі кожного програмного продукту лежить інтелектуальна власність його розробників. Адже на створення програми пішло багато годин роботи програмістів, тестувальників та служби маркетингу. Хочеться, щоб при комерційному релізі унікальний продукт не був вивчений, скопійований і модифікований конкурентами, а для цього програми необхідно захищати від аналізу.

Проблема запобігання декомпіляції Java байт-коду має майже такий самий вік як і сама мова. Незважаючи на велику кількість методів захисту коду, Java програмісти придумують нові способи захистити свою інтелектуальну власність. Одним із таких способів є шифрування байт-коду.

Актуальність цієї роботи полягає в отриманні рекомендацій, які дозволяють підвищити надійність захисту програмного продукту від несанкціонованого дослідження, копіювання та модифікації.

Метою даної роботи є формулювання рекомендацій по реалізації захисту програмного продукту, написаного мовою Java, шляхом шифрування скомпільованого байт-коду програми.

1. АНАЛІЗ ПРОБЛЕМ ЗАХИСТУ ВИКОНУВАНОГО КОДУ JAVA

1.1 Архітектура Java

Java Virtual Machine (скорочено Java VM, JVM) - віртуальна машина Java - основна частина виконуваної системи Java, так званої Java Runtime Environment (JRE). Віртуальна машина Java інтерпретує байт-код Java, попередньо створений з вихідного тексту Java-програми компілятором Java (javac). JVM може також використовуватися для виконання програм, написаних на інших мовах програмування. Наприклад, вихідний код на мові Ada може бути відкомпільований в байт-код Java, який потім може виконатися за допомогою JVM.

JVM є ключовим компонентом платформи Java. Так як віртуальні машини Java доступні багатьом апаратним і програмним платформам, Java може розглядатися і як сполучне програмне забезпечення, і як самостійна платформа, звідси принцип «написано одного разу, запускається скрізь» (write once, run anywhere).

Програми, призначені для запуску на JVM повинні бути скомпільовані в стандартизованому переношуваному двійковому форматі, який зазвичай представляється у вигляді файлів .сlass. Програма може складатися з безлічі класів, розміщених в різних файлах. Для полегшення розміщення великих програм, частина файлів виду .сlass можуть бути упаковані разом у так званий .jar файл (скорочення від Java Archive).

Рисунок 1 - Архітектура Java

Віртуальна машина JVM виконує файли .class або .jar, емулюючи інструкції, написані для JVM, шляхом інтерпретування чи використання just-in-time компілятора (JIT), такого, як HotSpot від Sun microsystems. У наші дні JIT компіляція використовується в більшості JVM в цілях досягнення більшої швидкості. Існують також ahead-of-time компілятори, що дозволяють розробникам додатків прекомпілювання файлів класів в рідній для конкретної платформи код.

Як і більшість віртуальних машин, Java Virtual Machine має stack-орієнтовану архітектуру, властиву мікроконтролерам в мікропроцесорах.

JVM, яка є екземпляром JRE (Java Runtime Environment), вступає в дію при виконанні програм Java. Після завершення виконання, цей екземпляр видаляється збиральником сміття. JIT є частиною віртуальної машини Java, яка використовується для прискорення виконання додатків. JIT одночасно компілює частини байт-коду, які мають аналогічну функціональність, і, отже, зменшує кількість часу, необхідного для компіляції.

1.2 Завантажувач класів в Java

Однією з основних особливостей платформи Java є модель динамічного завантаження класів, яка дозволяє завантажувати виконуваний код у JRE без перезавантаження основі додатку. Така особливість широко використовується в серверах додатків, які отримали останнім часом високу популярність.

Рисунок 2 - Завантаження класів в Java

Будь-який клас (екземпляр класу java.lang.Class в середовищі і .сlass файл у файловій системі), використовуваний в середовищі виконання був так чи інакше завантажений яким-небудь завантажувачем в Java. Для того, щоб отримати завантажувач, яким був завантажений клас А, необхідно скористатися методом A.class.getClassLoader ().

Класи завантажуються в міру потреби, за невеликим винятком. Деякі базові класи з rt.jar (java.lang. зокрема) завантажуються при старті програми. Класи розширень ($ JAVA_HOME / lib / ext), призначені для користувача і більшість системних класів завантажуються в міру їх використання.

Розрізняють 3 види завантажувачів в Java. Це - базовий завантажувач (bootstrap), системний завантажувач (System Classloader), завантажувач розширень (Extension Classloader).

Bootstrap - реалізований на рівні JVM і не має зворотного зв'язку з середовищем виконання. Даним завантажувачем завантажуються класи з директорії $ JAVA_HOME / lib. Тобто rt.jar завантажується саме базовим завантажувачем. Тому, спроба отримати завантажувач з класів java. завжди закінчуватись null'ом. Це пояснюється тим, що всі базові класи завантажені базовим завантажувачем, доступу до якого з керованого середовища немає. Керувати завантаженням базових класів можна за допомогою ключа-Xbootclasspath, який дозволяє перевизначати набори базових класів.

System Classloader - системний завантажувач, реалізований вже на рівні JRE. У Sun JRE - це клас sun.misc.Launcher $ AppClassLoader. Цим завантажувачем завантажуються класи, шляхи до яких вказані у змінній оточення CLASSPATH. Керувати завантаженням системних класів можна за допомогою ключа-classpath або системної опцією java.class.path.

Extension Classloader - завантажувач розширень. Даний завантажувач завантажує класи з директорії $ JAVA_HOME / lib / ext. У Sun JRE - це клас sun.misc.Launcher $ ExtClassLoader. Керувати завантаженням розширень можна за допомогою системної опції java.ext.dirs.

Рисунок 3 - Процес завантаження класів в Java

Розрізняють поточний завантажувач (Current Classloader) і завантажувач контексту (Context Classloader).

Current Classloader - це завантажувач класу, код якого в даний момент виконується. Поточний завантажувач використовується за умовчуванням для завантаження класів у процесі виконання. У часності, при використанні методу Class.forName ("") / ClassLoader.loadClass ("") або за будь-якої декларації класу, що раніше не завантажений.

Context Classloader - завантажувач контексту поточного потоку. Отримати та встановити даний завантажувач можна за допомогою методів Thread.getContextClassLoader () / Thread.setContextClassLoader (). Завантажувач контексту встановлюється автоматично для кожного нового потоку. При цьому, використовується завантажувач батьківського потоку.

1.3 Проблеми захисту виконуваного коду Java

На відміну від C або C++, Java компілятор не створює кінцевий машинний код, а всього лиш його платформенно незалежне подання - байт-код. Отриманий байт-код містить дуже багато осмисленої інформації, яка може допомогти розібратися зломщикові програми в принципі її роботи.

При створенні програми, в більшості, вводяться явні назви для класів та їх методів. Наприклад, клас ConfigMgr швидше за все бдует представляти сервіс для управління конфігруцією програмного продукту. А його метод getRootCataloog - повертатиме кореневий коталог, де фізично розташована програма. Це, звичайно, істотно полегшує розуміння програми для програміста, але і одночасно допомагає зловмисникові, адже при декомпіляції Java байт-коду виходять реальні назви класів та їх методів. Тобто при декомпіляції скомпільованого .class файлу початковий код відображається майже ідентичний до написаного програмістом.

1.4 Методи захисту виконуваного коду Java

1.4.1 Обфускація

У більшості випадків для обходу захисту, зловмисникові потрібно вивчити принцип роботи її коду, і те, як вона взаємодіє з самою захищуваною програмою, цей процес вивчення називається процесом реверсивної (зворотної) інженерії. Цей процес часто залежить від властивостей людської психіки, тому використання цих властивостей дозволяє знизити ефективність самого процесу реверсивної інженерії.

Обфускація ("obfuscation" - заплутування), це один з методів захисту програмного коду, який дозволяє ускладнити процес реверсивної інженерії коду захищуваного програмного продукту.

Суть процесу обфускаціі полягає в тому, щоб заплутати програмний код і усунути більшість логічних зв'язків у ньому, тобто трансформувати його так, щоб він був дуже важкий для вивчення і модифікації сторонніми особами (будь то зломщики, або програмісти які збираються дізнатися унікальний алгоритм роботи захищуваної програми).

Процеси обфускаціі можна класифікувати за видами, в залежності від способу модифікації коду програми:

Лексична обфускація. Найбільш проста, полягає у форматуванні коду програми, зміні його структури, таким чином, щоб він став нечитабельним, менш інформативним, і важким для вивчення.

Обфускація даних. Така обфускація пов'язана з трансформацією структур даних. Вона вважається більш складною, і є найбільш просунутою і часто використовуваною.

Обфускація управління. Обфускація такого виду здійснює заплутування потоку управління, тобто послідовності виконання програмного коду. Більшість її реалізацій грунтується на використанні непрозорих предикат, в якості, яких виступають, послідовності операцій, результат роботи яких складно визначити (саме поняття "предикат" висловлює властивість одного об'єкта (аргументу), або відносини між кількома об'єктами).

1.4.2 Перенесення логіки на сервер

Так як Java - кроссплатформенна мова програмування, то вона дозволяє виконувати програму в браузері за допомогою так званих Java-аплетів. Java-аплети виконуються у браузері з використанням віртуальної Java машини (JVM), або в Sun's AppletViewer, автономному засобі для випробування аплетів.

Це дозволяє перенести основну логіку програми на сервер, а на стороні клієнта, в браузері буде лише відображатись результат виконання програми. Тому зловмисник не отримає доступу до початкового коду програми і не буде знати як вона працює.

1.4.3 Шифрування виконуваного коду

Одним із ефективних способів захисту виконуваного коду від зловмисників є шифрування. В цьому випадку скомпільований .class файл зашифровується надійними алгоритмами шифрування і окремо пишеться програма, яка буде розшифровувати його і передавати JVM на виконання. Таким чином зловмисник, навіть якщо отримає зашифрований .class файл, не зможе його декомпілювати і не зможе витягнути з нього ніякої корисної інформації.

1.5 Висновки

В цьому розділі було розглянуто архітектуру Java. Її недостатком виявляється проблематичний захист виконуваного коду, тому що компілятор Java компілює у проміжковий байт-код, який можна з легкістю декомпілювати та дослідити, а не машинний код.

Розглянуто також способи захисту виконуваного коду Java, та обрано метод захисту шифруванням, тому-що зашифрований байт-код неможливо дослідити, а розшифрувати його дуже проблематично.

2. ПРОГРАМНА РЕАЛІЗАЦІЯ ШИФРУВАННЯ БАЙТ-КОДУ JAVA

2.1 Реалізація шифрування

Для реалізації шифрування обрано розширення Java Cryptography Extension із бібліотеки java.security та алгоритм шифрування AES.

Створимо клас AES та реалізуємо в ньому такі методи:

Метод для збереження довжини ключа:

private static String safePassword(String unsafe)

Цей метод використовується для збереження корректної довжини ключа для алгоритму шифрування AES в 128 біт. Тобто коли ключ буде коротший за потрібний то до нього додається необхідна кількість біт з цього самого ключа, а коли довший то залишок ключа відрізається.

Метод шифрування:

public static byte[] encrypt(byte[] value, String password)

В цьому методі створюємо екземпляр алгоритму шифрування AES, ініціалізуємо його та зашифровуємо масив байтів, який було передано в метод.

В основному методі main зчитуємо з .class файлу масив байтів, передаємо його в метод encrypt, та записуємо в новий файл масив байтів, який повернув метод шифрування.

2.2 Реалізація завантажувача класу

В головному класі CrySec створимо такі методи:

private static String safePassword(String unsafe) - як і в попередньому випадку цей метод для збереження довжини ключа.

public static byte[] decrypt(byte[] value, String password) - оберенений до методу зашифрування, який розшифровує переданий йому масив байтів.

Створимо клас class CryptoClassLoader та унаслідуємо клас extends ClassLoader. В ньому перевизначимо метод findClass(String name), в якому отримуємо масив байтів з вже розшифрованим байт-кодом захищуваної програми та передамо його віртуальній машині методом defineClass(null, classBytes, 0, classBytes.length), де null - імя класу, його вказувати не обов`язково; classBytes - масив байтів з байт-кодом; 0 - початок масиву та classBytes.length - довжина масиву.

Далі в класі CryptoClassLoader створюємо метод private byte[] loadClassBytes(), який зчитує зашифрований .class файл в масив байтів та розшифровує його.

Метод public void runClass(String name) отримує метод main з головного класу захищуваної програми та передає його віртуальній машині Java.

2.3 Тестування програмного засобу

В якості тестової захищуваної програми використаємо Main.class, в якості декомпілятора використаємо популярний декомпілятор Java JAD (Java Decompiler).

Спочатку спробуємо декомпілювати Main.class

Рисунок 4 - Результат декомпілювання Main.class

Як видно, програма декомпілюється нормально (Рисунок 4). Збережені назви класів, методів, полей, що дає змогу дослідити її.

Тепер зашифруємо Main.class за допомогою програми шифрування AES. Вона не має інтерфейсу, тому просто запускаємо її. Після запуску з`являється файл Main_c.class, вміст якого зашифрований. Якщо спробувати декомпілювати його, то декомпілятор видасть помилку (Рисунок 5), а якщо просто відкрити в текстовому редакторі то побачимо незрозумілі символи (Рисунок 6).

Рисунок 5 - Результат декомпілювання Main_с.class

Рисунок 6 - Вміст файлу Main_c.class

Тепер запустимо наш завантажувач зашифрованих класів. Він зчитує зашифрований Main_c.class, розшифровує його та передає байт-код віртуальній машині Java. Захищувана програма працює (Рисунок 7).

Рисунок 7 - Прогама Маятник Main.class

ВИСНОВОК

В цій роботі було розглянуто принцип роботи Java Virtual Machine та принципи динамічного завантаження класів в JVM.

Головною проблемою захисту виконуваного коду Java є компіляція в проміжковий код - байт-код, що дозволяє зловмиснику з легкістю дослідити програму.

Для забезпечення захисту розглянуто такі методи як обфускація, що заплутує код програми і може зупинити недосвідченого зловмисника але не професіонала; перенесення логіки програми на віддалений сервер, що унеможливлює дослідження, так як виконуваний код недоступний клієнту, на стороні якого виконується програма; та шифрування, що ускладнює дослідження програми, тому-що розшифрувати файл, зашифрований сучасними алгоритмами шифрування дуже складно.

Було обрано метод шифрування для захисту виконуваного коду Java, та алгоритм шифрування AES. Розроблена програма зашифровує скомпільований .class файл, та при необхідності запуску розшифровує його та передає Java Virtual Machine на виконання.

ПЕРЕЛІК ВИКОРИСТАНИХ ДЖЕРЕЛ

Хорстманн Кей, Корнелл Гари - Java 2. Библиотека профессионала. 7-е издание. Том 2 - Тонкости программирования - 2007

Java 2 Ноутон, Шилдт. (2007)

Войтович О. П. Методичні вказівки до виконання курсового проекту з дисципліни "Захист програмного забезпечення" для студентів напряму підготовки 6.170101 “Безпека інформаційних і комунікаційних систем” / Олеся Войтович, Валентина Каплун - Вінниця: ВНТУ, 2010. - 57 с.

Единая система конструкторской документации.. Общие требования к текстовым документам : ГОСТ 2.105-95. - [Чинний від 1996-01-07]. - Мінськ: Межгосударственный совет по стандартизации, метрологии и сертификации, 1996. - 29 с. - (Міждержавний стандарт).

Дудатьєв А.В. Захист програмного забезпечення. Ч.1 : навчальний посібник / Андрій Дудатьєв, Валентина Каплун, Василь Семеренко - Вінниця: ВНТУ, 2005. - 140 с.

Майданюк В.П. Захист програмного забезпечення. Ч.2 : навчальний посібник / Володимир Майданюк, Валентина Каплун - Вінниця: ВНТУ, 2011. - 150 с.

Каплун В.А. Захист програмного забезпечення: Конспект лекцій. - Вінниця: ВНТУ, 2013.

http://habrahabr.ru/post/103830/

http://kes.narod.ru/people/lexus/JavaSourceCodeProtection.htm

Размещено на Allbest.ru

...

Подобные документы

  • Розробка логічної гри "Тетріс" у складі набору об’єктно-орієнтованих моделей, програмного коду з використанням об’єктно-орієнтованної мови Java. Проектування архітектури гри, аналіз вимог до неї, опис реалізації, кодування та тестування програми.

    курсовая работа [2,2 M], добавлен 24.10.2010

  • Основні поняття щодо захисту програмного забезпечення. Класифікація засобів дослідження програмного коду: відладчики, дизасемблери, діскомпілятори, трасировщики та слідкуючі системи. Способи вбудовування захисних механізмів в програмне забезпечення.

    курсовая работа [41,7 K], добавлен 14.11.2010

  • Основи криптосистем та їх використання. Шифрування методом гамування, його зміст, прийоми та етапи реалізації. Вимоги до програмного продукту, його структура та принципи роботи, схеми алгоритму, вимоги до функціональних можливостей. Лістинг програми.

    курсовая работа [245,5 K], добавлен 25.08.2014

  • Дослідження алгоритму роботи та коду програми. Оцінка методом "чорного ящика". Тестування і налагодження розробленої програми на алгоритмічній мові високого рівня. Оцінювання якості програмного забезпечення за об’єктно-орієнтованими метриками зв’язності.

    курсовая работа [143,1 K], добавлен 11.03.2021

  • Створення діаграм: варіантів використання, взаємодії, класів, станів та компонентів. Генерування коду на основі створених діаграм за допомогою StarUML на об'єктно-орієнтовній мові програмування Java. Головне вікно програми "Цифровий диктофон", лістинг.

    отчет по практике [1,9 M], добавлен 21.12.2015

  • Неекспортовані символи ядра. Оптимальний підхід до реалізації пошуку символів у ядрі. Виконання, підміна, додавання та приховання системних викликів. Завантаження модуля ядра із програмного коду та з коду іншого модуля. Робота з UNIX-сигналами.

    курсовая работа [84,0 K], добавлен 23.05.2013

  • Розробка та тестування додатків, які базуються на елементах мови програмування Java, принципи програмування в її середовищі. Вивчення переваг Java-платформи, прикладний програмний інтерфейс та особливості сучасних засобів створення Java-додатків.

    дипломная работа [2,8 M], добавлен 22.06.2011

  • Розробка програми калькулятора, що може виконувати найголовніші арифметичні операції над двома числами. Вимоги до апаратного і програмного забезпечення. Опис форм та компонентів програми. Розробка алгоритмів програмного забезпечення. Опис коду програми.

    курсовая работа [57,1 K], добавлен 31.05.2013

  • Аналіз аналогової системи передачі. Порівняння завадостійкості системи зв’язку. Розрахунок інформаційних характеристик системи передачі. Декодування коректуючого коду. Шифрування кодами Цезаря та Віженера. Структурна схема цифрової системи передачі.

    курсовая работа [1,7 M], добавлен 15.04.2013

  • Коректне використання операторів та конструкцій, побудова ефективних алгоритмів для розв'язку типових задач. Розробка алгоритмів та програми для створення бази даних телефонних номерів. Використання засобів розробки програмного забезпечення мовою Java.

    курсовая работа [1,0 M], добавлен 25.01.2016

  • Архитектура уровня команд платформы Java, формат файла класса Java. Компилятор ассемблероподобного языка, позволяющий создавать файлы классов, корректно обрабатываемые реальной JVM, поддерживающий все команды байт-кода Java и важнейшие возможности JVM.

    курсовая работа [292,6 K], добавлен 17.09.2008

  • Огляд засобів створення програмного забезпечення сучасних мікроконтролерів. Аналіз методів та налаштувань контролерів. Засоби генерації коду налаштувань. Детальний опис розробки програми генератора налаштувань ядра Cortex M4 та методики її тестування.

    курсовая работа [1,3 M], добавлен 20.05.2015

  • Основи безпеки даних в комп'ютерних системах. Розробка програми для забезпечення захисту інформації від несанкціонованого доступу: шифрування та дешифрування даних за допомогою криптографічних алгоритмів RSA та DES. Проблеми і перспективи криптографії.

    дипломная работа [823,1 K], добавлен 11.01.2011

  • Визначення параметрів цифрового сигналу на виході АЦП. Розробка структури цифрового лінійного тракту, розрахунок його завадостійкості. Аналіз роботи демодулятора. Ймовірність помилкового прийому комбінації коду Хемінга та безнадлишкового коду МТК-2.

    курсовая работа [1,1 M], добавлен 06.08.2013

  • Поняття компілятора та теоретичні основи його роботи. Введення коду програми завантаженням текстового файлу. Опрацювання тексту лексичним та синтаксичним аналізаторами. Генерація та оптимізанія об'єктного коду. Побудова графічного інтерфейсу програми.

    курсовая работа [586,6 K], добавлен 22.01.2014

  • Види секретної інформації та методи захисту. Тип і об’єм вхідних даних. Програмна реалізація системи алгоритму шифрування зі стисненням. Призначення та опис програмного продукту Export. Алгоритми захисту зберігання та обміну секретною інформацією.

    дипломная работа [1,1 M], добавлен 19.09.2012

  • Характеристика видів крипто-аналітичних атак. Особливості симетричних та асиметричних систем шифрування. Розробка програми, призначеної для криптографічного дешифрування повідомлення методом гамування за допомогою лінійного рекурентного регістру.

    курсовая работа [171,4 K], добавлен 25.08.2014

  • Архитектура Java и Java RMI, их основные свойства, базовая система и элементы. Безопасность и виртуальная Java-машина. Интерфейс Java API. Пример использования приложения RMI. Работа с программой "Calculator". Универсальность, портативность платформ.

    курсовая работа [208,6 K], добавлен 03.12.2013

  • Розробка програми, яка вираховує з введених чисел парні та непарні та додає парні числа. Особливості синтаксису й семантики операторів мови С++. Перевірка коректності введення кількості чисел. Написання коду програми, проведення її тестування на прикладі.

    лабораторная работа [860,5 K], добавлен 20.12.2012

  • Розробка програми для розв’язання квадратних рівнянь з текстовим та графічним інтерфейсами користувача без дублювання їх коду. Алгоритм розв’язання квадратного рівняння у програмах з будь-яким інтерфейсом користувача, а саме: "консольний" та "форма".

    лабораторная работа [14,9 K], добавлен 14.05.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.