25900 авторів і 91 редактор відповіли на 98952 питання,
розмістивши 129771 посилання на 81900 сайтів, приєднуйтесь!

Реклама партнерів:

Що таке обфускація алгоритмів методів?

РедагуватиУ обранеДрук

Швидкий розвиток мультимедіа та Інтернет технологій в останні роки викликає потребу в захисті такої інтелектуальної власності, як програмні продукти (ПП).

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

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

Не варто плутати проектування з програмуванням. Які фактори необхідно враховувати? Типовою обфускаціі є символьна - коли обфуськатор тільки і всього змінює назви типів, полів, методів, властивостей і подій на безглузді. Тип Obfuscator перейменовується в 0, а його метод Run () - теж в 0, а параметри методів просто перенумеруйте - 0,1,2,3,4. Після подібної обфускаціі втрачається логічний зв'язок між класами, аналізувати код код - трудночитаємих.



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

Крім символьної обфускаціі є ще обфускація алгоритмів методів - коли найпростіше множення I * 3 може бути представлено більш складним алгоритмом, наприклад - I * ((1 + 1/2) * 2) або заплутані while і for. Рідко можна зустріти повністю замкнуті, автономні системи, тому типовим випадком буде часткова обфускація. Хоча ідеальної завданням для більш якісної обфускаціі буде якраз написання максимальної замкнутої системи збірок.

Рекомендації з підготовки проекту (продукту) до обфускаціі:

  1. Для ускладнення дизассемблирования можна використовувати підміну типів (яку не завжди можливо реалізувати через sealed типів) Мається на увазі такий прийомчик - якийсь системний тип SomeType успадковується в новому типі AnotherType, який підходить для обфусцірованія (він лежить в межах видимості збірки, його можна призначити як internal). На виході виходить іспоьзованія SomeNamespace.0 замість відомого System.SomeType. Якщо планується використовувати деякі типи як публічні але хотілося б їх максимально захистити, варто їх помістити в «захисну шкаралупу» успадкування. Якийсь тип public SomeType можна перетворити на два класи: internal _SomeType (underground class), який несе всю реалізацію класу, крім публічних властивостей, необхідних для серіалізациі і для використання в зовнішньому для складання коді, і public SomeType, який буде успадковуватися від _ SomeType ( front class), але нести зовнішнє навантаження - мати публічні властивості, необхідні для серіалізациі, конверсії, використання у зовнішньому для складання коді.
  2. Використовуються атрибути в коді. Багато з них досить тісно допомагають взаємодіяти середовищі .Net з класами. Наприклад атрибут TypeConverterAttribute - їм прив'язують до класу клас конвертера SomeConverter. Не кожен обфуськатор «знає» про це - і тому варто вберегти клас конвертера від обфускаціі або перевірити як обфуськатор працює з атрибутами. Інакше зв'язок, встановлена між двома класами допомогою атрибута може бути зруйнована.
  3. Якщо клас йде під обфускаціі, необхідно задуматися про механізм його серіалізациі. Клас- спадкоємець Form серіалізуются себе таким чином що якщо обфуськатор змінив ім'я його типу SomeForm на 0, то виникне проблема при ініціалізації десеріалізациі такого класу - він просто не зможе знайти ресурс 0.resources, так як серіалізовані в в SomeForm.resources.
  4. Використовується так само static string оголошення замість const string - це утруднить пошук ініціалізації цього поля (в метаданих обидва оголошення будуть представлені як поля).
  5. Якщо є список рядків, які представлені як список строкових констант, краще список рядків обьявил / опишіть як строковий масив, а в константах зберігайте індекс до необхідної рядку в строковому масиві.
  6. Якщо необхідно захистити якийсь алгоритм від зайвої перегляду - необхідно отдайть його виконання декількох класах, цим розподіляємо завдання задачу, може бути розвантажуємо пам'ять.
  7. Варто перекласти виконання алгоритмів не одному методу, а частини алгоритму передавати у виконання різних класів, фактично виконання алгоритму буде взаємодією декількох класів.
  8. Необхідно инициализировать класи форми без використання .resx і .resources файлів - до них краще звертатися за індексом щоб уникнути проблем при обфускаціі ресурсів.

Після обфускаціі:

  1. Обов'язкове тестування обфусцірованной збірки.
  2. Після обфускаціі, обов'язково перевірити зборку утилітою peverify, яка йде з .Net Framework SDK - ця утиліта перевіряє метадані збірки на коректність. Якщо складання позначена як CLS-compliant - це тестування обов'язково.
  3. Обов'язково звернути увагу, як обфусцірован сам обфуськатор.
  4. Створюється тестовий проект, який швиденько протестує збірку.

Реклама партнерів:

РедагуватиУ обранеДрук


«Що таке обфускація алгоритмів методів?»

В інших пошукових системах:

GoogleЯndexRamblerВікіпедія

» » Що таке обфускація алгоритмів методів?