Загальні методи обфускації

Методи обфускації коду. Перетворення керуючої логіки та обчислень. Модифікація зв'язків спадкування. Реструктуризація масивів. Конвертація статичних і процедурних даних. Обфускація перешкоджає статичному аналізу програм. Запобігання лінійної розгортки.

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

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

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

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

Загальні методи обфускації

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

- Ефективність: Наскільки програма стає нечитабельною.

- Стійкість: Наскільки складно зламати програму автоматизованими засобами деобфускації.

- Прозорість: Наскільки добре обфусцированний код взаємодіє з рештою коду.

Перетворення керуючої логіки

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

Перетворення обчислень

Є сувора залежність між складністю коду і числом конструкцій, яке міститься в коді. Зі збільшенням числа конструкцій в коді, додати додатковий код стає простіше. Тому, наявність конструкцій, складних для сприйняття надає можливість для подальшої обфускації програми. Наприклад, базовий блок коду, В можна розділити на дві частини шляхом вставки деякої умови PT (яке завжди повертає True) в середину блоку B. Після цього для кожного з блоків можна застосовувати різну техніку обфускації. Також можна обфусцирувати цикл шляхом зміни умови виходу з циклу деяким складно сприймаючим виразом. Це може бути здійснено за допомогою додавання складних блоків умов PT (завжди повертає True) і PF (завжди повертає False) які не впливають на те, скільки разів буде виконуватися тіло циклу.

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

Всього існує два типи таких перетворень: власне, модифікація зв'язків успадкування та реструктуризація масивів даних.

Модифікація зв'язків спадкування

Відповідно складність програми збільшується зі збільшенням глибини дерева успадкування. Разом з цим, можна штучно збільшити складність програми або шляхом поділу класу на кілька частин, або шляхом додавання додаткового фіктивного класу. Вважаючи, що клас C - це клас який буде розділений на C1 і C2, необхідно переконатися в тому, що даний поділ не зашкодить області видимості всіх змінних класу C. Іншими словами, якщо розділити клас на дві частини, в одній частині може помилково не вистачати змінних, які виявилися тільки в другій частині. Крім того, зв'язки спадкування можуть бути перекручені після помилкового рефакторінга. Рефакторінг має місце в наступних випадках. По-перше, при ідентифікації двох класів, що реалізують однакову логіку. По-друге, переміщення логіки, загальної для двох класів у батьківський клас. Помилковий рефакторінг схожий на звичайний рефакторінг, за тим винятком, що помилковий рефакторінг виконується над двома несумісними класами, які не мають загальної логіки.

Реструктуризація масивів

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

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

Таблична інтерпретація

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

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

Вбудовані і не вбудовані методи

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

Клонуючі методи

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

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

Поділ змінних

Деякі змінні можуть бути розділені на дві або кілька змінних. У процесі розбивки змінної V типу T на дві змінні p і q типу U, необхідно забезпечити реалізацію наступних елементів:

Функція f (p, q), яка відображає значення p і q на відповідне значення змінної V.

Функція g (V) яка відображає значення V на відповідні значення p і q.

Нові операції приведення в термінах операцій над p і q.

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

Конвертація статичних і процедурних даних

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

Склеювання скалярних змінних

Цей прийом обфускації заснований на об'єднанні двох або більше скалярних змінних в одну. Змінні v1, v2… vk можуть бути об'єднані в одну змінну Vm, яка містить в собі всі діапазони значень змінних v1, v2… vk. Арифметичні операції які виконувалися над змінними також піддадуться перетворенню, сфальцьованому на операціями над Vm. Однак ступінь ефективність подібних перетворень так само невисока, а стало бути подібні перетворення так само не є панацеєю.

Обфускація перешкоджає статичному аналізу програм

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

Перетворення керуючої логіки здійснюються в два етапи. Перший етап здійснює декомпозицію високорівневих переходів в серію виразів «if-then-goto». Наступний етап передбачає модифікацію виразів goto таким чином, що б адрес переходу обчислювався динамічно а не був заданий у коді явно. Це може бути виконано за допомогою розгалуження коду відповідно з використовуваними змінними. У процесі виконання перетворень буде здійснена заміна безпосередніх адрес переходів на динамічно обчислювані виходячи з значень змінних, які доступні в даному блоці коду і в результаті спрощення графа керуючої логіки. Після проведення перетворень, явно вказані адреси переходів будуть відсутні, а стало бути задача побудови дерева переходів ускладниться - тепер доведеться аналізувати і запам'ятовувати останнє визначення кожної змінної до виконання кожного переходу.

Перетворення потоку даних

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

1) У кожен метод додати довільне число змінних покажчиків.

2) Вставити штучні блоки або коду в існуючих блоках, які встановлюють значення для цих змінних-вказівників.

3) Замінити посилання на змінні і елементи масиву цими покажчиками. Обчислення, що використовують дані змінні повинні бути оновлені таким чином, що б вони здійснювалися через покажчики.

Визначення покажчиків має перебуває в інших блоках, а не в тих де відбувається їх використання.

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

Обфускація коду на етапі дизассемблірованія

Більшість розглянутих прийомів обфускації застосовуються на етапі декомпіляції. Але ми можемо обфусцирувати код і на етапі дизассемблірованія. У даній секції будуть розглянуті два найбільш широко вживані алгоритму статичного дизассемблірованія і прийоми для запобігання кожного з них. Існує два методи дизассемблірованія: статичне дізассембліроване, коли файл, що піддається дизассемблірованія за допомогою дизассемблера не виконується в процесі дизассемблірованія; і динамічне дізассемблірованіе, коли файл виконується з використанням деяких вхідних даних у процесі дизассемблірованія. У даній секції розглядаються тільки прийоми, що запобігають статичне дізассемблірованіе. Існує два види статичного дизассемблірованія: лінійна розгортка і рекурсивний прохід. При лінійної розгортці дізассемблер здійснює обробку інструкцій програми в порядку їх слідування в коді. При рекурсивному проході дізассемблер обробляє інструкції відповідно до керуючої логікою програми. Тобто, коли зустрічається інструкція розгалуження, дізассемблер визначає можливі варіанти виконання програми та здійснює обробку цих гілок.

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

Вставка сміття

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

Запобігання лінійної розгортки

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

Запобігання рекурсивного проходу

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

обфускація обчислення програма масив

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

...

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

  • Регулярний тип даних мови Pascal, що дозволяє в програмі задавати структуру даних, яка називається масивом. Поняття одновимірного та багатовимірного масиву. Прямі методи сортування масивів, типи даних. Таблиця результативності гравців футбольної команди.

    лекция [411,2 K], добавлен 24.07.2014

  • Поняття інформації її властивості. У чому полягає робота брандмауера. Переваги використання брандмауера. Основи роботи антивірусних програм. Методи збору, обробки, перетворення, зберігання і розподілу інформації. Основні методи антивірусного захисту.

    реферат [26,8 K], добавлен 29.05.2014

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

    реферат [40,2 K], добавлен 13.06.2010

  • Внутрішнє представлення в пам’яті комп’ютера даних базових та похідних типів, масивів. Ідентифікатор, зв'язаний з константним виразом та основи представлення даних. Алгоритм представлення цілих, дійсних, логічних і символьних чисел, структур і об’єднань.

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

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

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

  • Поняття та переваги реляційної бази, автоматизація аналізу даних. Опис основних компонентів сховища даних AS/400. Процес перетворення оперативних даних в інформаційні. Багатовимірні бази даних (MDD). Опис даних і створення файлів в інтеграційних базах.

    реферат [36,8 K], добавлен 14.01.2012

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

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

  • Класифікація та склад антивірусного програмного забезпечення. Методи знаходження комп'ютерних вірусів. Технології сигнатурного та імовірнісного аналізу. Можливості антивірусних програм Avast, AVG, Лабораторії Касперського, Norton AntiVirus, BitDefender.

    реферат [26,6 K], добавлен 06.04.2014

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

    магистерская работа [4,2 M], добавлен 17.12.2014

  • Визначення двовимірних масивів. Розміщення елементів на головній та бічній діагоналі. Алгоритми обробки двовимірних масивів. Двовимірні масиви в задачах лінійної алгебри. Ініціалізація елементів матриці за допомогою генератора псевдовипадкових чисел.

    контрольная работа [162,8 K], добавлен 02.12.2014

  • Загальні відомості, методи та постановка задачі динамічного програмування. Практичне застосування методу динамічного програмування на прикладі розподілення вантажів між 4-ма торговими суднами. Рекурентна природа обчислень в динамічному програмуванні.

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

  • Автоматизація бібліотеки Тальнівського будівельно-економічного коледжу УДАУ. Методи автоматизації та проектування. Інфологічна, даталогічна моделі даних. Програмні засоби розробки бази даних. Розробка таблиць та звітів, встановлення зв’язків між таблиць.

    курсовая работа [4,9 M], добавлен 07.06.2010

  • Приклад реалізації крок за кроком методу сортування масивів "бульбашка", характеристика етапів. Графічне представлення методу, фрагмент програми його реалізації. Алгоритми сортування масивів методами вибору та вставок, опис особливостей їх реалізації.

    презентация [824,2 K], добавлен 26.11.2014

  • Спосіб реалізації алгоритму перетворення Фур`є для сигнального процесора ADSP-2181 для 20-розрядних вхідних даних з часовим прорідженням. Механізми обчислення швидкого перетворення Фур`є за заданою основою. Алгоритм перетворення на заданому процесорі.

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

  • Принципи інформаційної безпеки. Статистика атак в Інтернеті. Засоби захисту інформації у системах передачі даних. Загальні поняття та визначення в галузі проектування захищених автоматизованих систем. Захист телефонної лінії від прослуховування.

    магистерская работа [1,2 M], добавлен 07.03.2011

  • Розробка майбутніх програмних продуктів, управління їх вихідним кодом. Концепція та моделі надання послуг хмарних обчислень. Особливості використання системи управління версіями Git. Технологія командної роботи над проектом конфігураційного управління.

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

  • Вживання електричних транспортних засобів з дистанційним управлінням. Канали зв’язку для передачі даних від пульта керування до керуючої машини. Реалізація програмного коду для Arduino Nano. Створення Android-додатку. Автоматизація процесів управління.

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

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

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

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

    курсовая работа [363,2 K], добавлен 01.04.2016

  • Оператори визначення даних. Створення таблиць. Вилучення таблиць. Додавання записів. Модифікація даних. Видалення даних. Пошук даних. Database Desktop. Компонент TQuery.

    реферат [165,8 K], добавлен 13.06.2007

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