Обфускація

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Обфуска́ція (від лат. obfuscare — затіняти, затемнювати; англ. obfuscate — робити неочевидним, заплутаним, збивати з пантелику) або заплутування коду — приведення сирцевого тексту або виконуваного програмного коду до виду, який зберігає її функціональність, але ускладнює аналіз, розуміння алгоритму роботи і модифікації при декомпіляції.

«Заплутування» коду може здійснюватися на рівні алгоритму, сирцевого тексту та/або асемблерного тексту. Для створення заплутаного асемблерного тексту можуть використовуватися спеціалізовані компілятори, які використовують неочевидні або недокументовані можливості середовища виконання програми. Існують також спеціальні програми, що виробляють обфускацію, які називаються обфускаторами (англ. Obfuscator).

Цілі обфускації[ред.ред. код]

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

Технології[ред.ред. код]

На рівні сирцевого коду[ред.ред. код]

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

Сирцевий код:

 int COUNT = 100;
 float TAX_RATE = 0.2;
 for (int i=0; i<COUNT; i++)
 {
   tax[i] = orig_price[i] * TAX_RATE;
   price[i] = orig_price[i] + tax[i];
 }

Код після обфускації:

 for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}

На рівні машинного коду[ред.ред. код]

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

Найпростіший спосіб обфускаціі машинного коду — вставка в нього недіючих конструкцій (таких як or ax, ax ).

На рівні проміжного коду[ред.ред. код]

На відміну від звичайних мов, таких як C++ і Pascal, які компілюють в машинний код, мова Java, NetP і мови платформи .NET компілюють сирцевий код в проміжний код (байт-код), який містить досить інформації для адекватного відновлення джерельного коду. З цієї причини, для цих мов застосовується обфускація проміжного коду.

Призначення[ред.ред. код]

Ускладнення дослідження коду[ред.ред. код]

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

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

Найпростіший приклад обфускованого HTML:

 <b>Євро</b><b>па</b>

При перегляді користувач побачить слово «Європа», в той час як у сирцевому коді воно розчленоване і сприймається як два роздільних слова.

Оптимізація[ред.ред. код]

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

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

Недоліки[ред.ред. код]

Втрата гнучкості коду[ред.ред. код]

Код після обфускаціі може стати більш залежним від платформи або компілятора.

Складності зневадження[ред.ред. код]

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

Недостатня безпека[ред.ред. код]

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

Помилки в обфускаторах[ред.ред. код]

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

Виклик класу за іменем[ред.ред. код]

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

Див. також[ред.ред. код]

Посилання[ред.ред. код]