Способи вбудовування захисних механізмів в програмне забезпечення



 

Вбудовування захисних механізмів можна виконати наступними основними способами:

· вставкою фрагмента перевірочного коду у виконуваний файл;

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

· вставкою перевірочного механізму у вихідний код на етапі розробки та налагодження програмного продукту;

· комбінуванням зазначених методів.

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

· висока трудомісткість виявлення захисного фрагмента при статичному дослідженні (особливо актуальна при вбудовуванні в вихідний код програмного продукту);

· висока трудомісткість виявлення захисного фрагмента при динамічному дослідженні (при налагодженні і трасування по зовнішніх подій);

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

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

У разі доповнення динамічних бібліотек можлива корекція зазначеним чином окремих функцій.

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

 

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

 

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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


Дата добавления: 2019-07-15; просмотров: 165; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!