Смекни!
smekni.com

Захист програмного забезпечення (стр. 4 из 5)

Істотним недоліком розглянутого методу є його легке виявлення і у випадку відсутності перетворення оригінальним коду виконуваного файлу - легка можливість обходу захисного фрагмента шляхом відновлення оригінальної точки входу.

2.5 Обфускація програмного коду

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

2.5.1 Символьна обфускація

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

Символьна обфускація включає в себе обфускацію імен класів, назв методів, параметрів і т. п. Дані обфускатори застосовують такі методи:

· Перейменування методів, змінних і т.д. в набір безглуздих символівНаприклад: метод класу GetPassword(), після обфускаціі буде мати ім'я KJHS92DSLKaf(). Проте існує одна проблема - багато декомпіляторів, зустрічаючи на своєму шляху подібного роду імена замінюють їх на більш читабельні (method_1, method_2), тим самим зводячи всю роботу обфускатора нанівець.

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

· Використання для імен змінних нечитабельних символів. Частина обфускаторов вставляють в імена нечитабельні символи, наприклад символи японської мови. Не всі декомпілятори адекватно обробляють такі символи. Деякі замінюють імена з такими символами на більш зрозумілі, деякі проставляють замість незрозумілих символів їх код, деякі просто відмовляються працювати з даними символами.

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

· Використання імен, які змінюють зміст. Цей тип обфускації використовує психологічний чинник. Припустимо, був клас SecurityInformation з методом GetInformation, а став Car, з методом Wash. Звичайно, це може заплутати голову недосвідченому зломщикові, але процесу декомпіляції ніяк не зашкодить.

2.5.2 Обфускація даних

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

Обфускація даних складається з таких методів, як:

· Зміна місця розташування даних - об'єднання декількох сутностей в одну або навпаки поділ однієї сутності на кілька. Наприклад: два рядки можуть бути об'єднані в масив рядків.

· Кодуючі перетворення. Деякі дані кодуються і в процесі виконання або завантаження програми декодуються.

· Заміна статичних членів на виклики методів. Деякі статичні члени замінюються на виклики методів.

· Додавання невикористовуваних даних. На основі невикористовуваних даних надалі формують помилкові умови.

· Зміна способу зберігання даних. Деякі відкриті члени робляться закритими і навпаки.

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

2.5.3 Обфускація графа потоку керування

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

· Перетворення обчислень. Даний метод полягає у вставці в алгоритми помилкових умов.

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

· Перемішування випадковим чином лінійних ділянок.


3. Захист від дослідження ПЗ створеного за допомогою технології.NET

3.1 .NET Framework

Microsoft .NET— програмна технологія, запропонована корпорацією Microsoft як платформа для створення як звичайних програм, так і веб-програм. Багато в чому є продовженням ідей та принципів, покладених в технологію Java.

Одною з ідей .NET є сумісність служб, написаних різними мовами.

Кожна бібліотека (збірка) в .NET містить інформацію про свою версію, що дозволяє усунути можливі конфлікти між різними версіями збірок.

.NET — кросплатформена технологія, на даний момент існує реалізація для платформи Microsoft Windows, FreeBSD (від Microsoft) і варіант технології для ОС Linux в проекті Mono (в рамках угоди між Microsoft з Novell).

Захист авторських прав відноситься до створення середовищ виконання (CLR — Common Language Runtime) для програм .NET. Компілятори для .NET випускаються багатьма фірмами для різних мов вільно.

.NET поділяється на дві основні частини — середовище виконання (по суті віртуальна машина) та інструментарій розробки.

Середовища розробки .NET-програм: Visual Studio .NET (C++, C#, J#), SharpDevelop, Borland Developer Studio (Delphi, C#) і т. д. Середовище Eclipse має додаток для розробки .NET-програм. Програми також можна розробляти в текстовому редакторі та використовувати консольний компілятор.

Також як і технологія Java, середовище розробки .NET створює байт-код, призначений для виконання віртуальною машиною. Вхідна мова цієї машини в .NET називається CIL (Common Intermediate Language), також відома як MSIL (Microsoft Intermediate Language), або просто IL. Застосування байт-кода дозволяє отримати кроссплатформеність на рівні скомпільованого проекту (в термінах .NET: збірка), а не на рівні початкового тексту, як, наприклад, в С. Перед запуском збірки в середовищі виконання (CLR) байт-код перетворюється вбудованим в середовище JIT-компілятором (just in time, компіляція на льоту) в машинні коди цільового процесора.

3.2 Декомпіляція .NETзбірок за допомогою .NET Reflector

У зв’язку з тим, що програми створені за допомогою .NETкомпілюються у проміжний MSILкод, а не у звичайні машинні коди, декомпіляція таких програм стає досить простою. Одним із найбільш функціональних декомпіляторів для .NETє .NETReflector.

.NET Reflector — безкоштовна утиліта для Microsoft .NET, комбінуюча браузер класів, статичний аналізатор и декомпілятор.

Програма може використовуватися для навігації, пошуку та аналізу вмісту. NET-компонентів, а також збірок і переводити двійкові дані у форму, придатну для читання людиною. Reflector дозволяє проводити декомпіляцію. NET-збірок на мови C#, Visual Basic.NET і MSIL. Reflector також включає дерево викликів, яке може використовуватися для навігації вглиб IL-методів з метою визначення, які методи вони викликають. Програма відображає метадані, ресурси і XML-документацію. .NET Reflector може бути використаний .NET-розробниками для розуміння внутрішньої роботи бібліотек коду, для наочного відображення відмінностей між двома версіями збірок, і того, як різні частини. NET-додатків взаємодіють один з одним.

.NET Reflector може використовуватися для знаходження місць, які мають проблеми з продуктивністю і пошуку багів. Він також може бути використаний для пошуку залежностей збірки. Програма може бути використана для ефективної конвертації коду між C # і VB.NET.


3.2.1 Приклад роботи .NET Reflector

Головне вікно .NET Reflector показує список збірок із складу .NET Framework. Про кожну із них можна подивитися інформацію, а також переглянути списки класів і тонкощі реалізації кожної із них.

Для демонстрації можливостей декомпілятора, відкриємо виконуваний файл популярного графічного редактору Paint.NETі переглянемо код методу PainDotNet.Tools.FloodToolBase, який, судячи з назви відповідає за заливку зображення деяким кольором.

Код програми можна дизасемблювати не тільки в C#, але й в MSIL, VB.NET, Delphi, MC++.

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

3.3 Способи захисту коду .NETпрограм від дослідження

Розглянемо методи захисту .NET збірки від дослідження:

· Обфускація коду програми. Цей метод є найбільш простим і поширеним.

· Компіляція збірки у машинний (native)код при його встановленні на комп’ютер користувача. Зокрема, це можна виконати з допомогою утиліти ngen, яка поставляється у комплекті із .NETFramework.Але, цей метод може призвести до деяких непередбачуваних наслідків, наприклад, при встановленні нової версії .NETFramework, програма, встановлена таким чином, може припинити працювати.

· Використання оптимізуючих компіляторів.

· Розроблення критичних частин програмного коду на ManagedC++, що дещо ускладнить процес декомпіляції.