JavaScript – універсальна мова, яка широко використовується в веб-розробці. Однак код на JS є відкритим і може бути легко скопійований або проаналізований. Тому розробники застосовують обфускацію – приведення коду до нечитабельного вигляду для захисту своєї інтелектуальної власності та ускладнення аналізу скриптів.
Обфускація (заплутування) коду – це перетворення читабельного JavaScript у нечитабельний формат, який важко зрозуміти і модифікувати, але який працює так само, як вихідний код.
// До обфускації function greeting(name) { console.log('Hello ' + name); } // Після обфускації function _0x4a12(_0x5980d5){ console['log']('Hello\x20'+_0x5980d5); }
Як бачимо, в обфусцированому коді:
- імена функцій і змінних замінені на беззмістовний набір символів
- рядки зашифровані в шістнадцятковий формат
- структура коду змінена і заплутана
Але функціональність коду залишилася незмінною. При виклику _0x4a12('John')
ми отримаємо той самий висновок, що і при greeting('John')
.
Навіщо потрібна обфускація
Обфускація коду вирішує кілька завдань:
Приховання логіки роботи скриптів. Це допомагає захистити конфіденційні алгоритми і ключові функції від копіювання конкурентами.
Ускладнення аналізу коду і пошуку вразливостей. Заплутаний код важко зрозуміти і відлагодити, що заважає хакерам знайти прогалини в безпеці і впровадити шкідливий код.
Зменшення розміру скриптів. Обфускатори видаляють коментарі, пробіли, переведення рядків і застосовують різні хитрощі для стиснення коду. Це прискорює завантаження сторінок.
Обхід систем виявлення шкідливих скриптів. Антивіруси використовують сигнатури для детектування шкідливого програмного забезпечення. Обфускація дозволяє замаскувати шкідливий код.
Але у медалі є зворотний бік. Обфускація сповільнює виконання скриптів, оскільки потребує додаткових обчислень для розпакування. Крім того, обфусцированний код складно підтримувати та налагоджувати самим розробникам. Тому обфускацію варто застосовувати з розумом і лише там, де це дійсно потрібно.
Основні методи обфускації JavaScript
Існує кілька базових підходів до обфускації JS коду:
1. Перейменування ідентифікаторів
Імена змінних і функцій замінюються на випадковий набір символів, що не має сенсу:
// До обфускації var number = 10; function add(x, y) { return x + y; } // Після обфускації var _0x7daa1 = 0xa; function _0x514a(_0x2abf1a, _0x12c6a2) { return _0x2abf1a + _0x12c6a2; }
2. Кодування рядків
Рядкові літерали конвертуються в юнікод, шістнадцятковий код або інші уявлення:
console.log("Hello World"); // Шістнадцяткове кодування console.log("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64"); // Юнікод console.log("\u0048\u0065\u006C\u006C\u006F\u0020\u0057\u006F\u0072\u006C\u0064"); // Base64 console.log(atob("SGVsbG8gV29ybGQ="));
3. Мертвий код
У код вставляються безглузді операції, які не впливають на результат. Це заплутує логіку роботи скрипта:
4. Заплутування потоку управління
Додаються зайві умови, цикли і переходи. Це маскує реальну послідовність виконання функцій:
function factorial(num) { if (num < 0) return; if (num === 0) return 1; return num * factorial(num - 1); } // Після обфускації function _0x4a2a(_0x3b9439) { if (_0x3b9439 < 0) { if (false) { return; } else { return; } } if (_0x3b9439 === 0) { if (true) { return 1; } } return _0x3b9439 * _0x4a2a(_0x3b9439 - 1); }
5. Динамічна генерація коду
Код збирається по шматочках прямо під час виконання за допомогою eval()
і Function()
:
var add = new Function('x', 'y', 'return x + y'); var result = add(2, 3); console.log(result);
6. Пакування/стиснення коду
Код мінімізується, шифрується і записується в один рядок. Перед виконанням він розпаковується:
eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c])}}return p}('7 3(5,6){4 5+6}1 0=3(2,8);1 9=a(0);b.c(9)',14,14,'result|var|2|add|return|x|y|function|3|encoded|btoa|console|log'.split('|'),0,{}))
Деобфускація JavaScript коду
Деобфускація – це процес перетворення обфусцированного коду назад у читабельний вигляд. Однак якісні обфускатори використовують комбінацію різних технік, що значно ускладнює аналіз. У таких випадках може знадобитися ручна деобфускація. Якщо ви хочете дізнатися більше про деобфускацію JavaScript коду, прийомах відновлення читабельності та інструментах, які можуть у цьому допомогти – читайте нашу докладну статтю Деобфускація JavaScript: як розшифрувати обфускований код.
Інструменти для обфускації JavaScript
Для автоматизації обфускації існує безліч інструментів. Ось деякі з них:
JavaScript Obfuscator Tool – онлайн-сервіс з великим набором налаштувань, включаючи контроль імен змінних, методи шифрування рядків і мертвий код.
JS Obfuscator – Node.js бібліотека для обфускації. Підтримує контроль потоку, шифрування, стиснення і багато іншого. Має плагіни для Webpack, Gulp, Grunt.
Closure Compiler – утиліта від Google, яка мінімізує код, видаляє невикористовувані функції і змінні, але при цьому зберігає читабельність.
Uglify-js – популярний мініфікатор і обфускатор. Надає опції для управління іменами, мертвим кодом, побічними ефектами.
Вибір конкретного інструменту залежить від вимог до рівня обфускації, розміру коду і сумісності з використовуваними фреймворками і системою збірки.
Висновок
Обфускація JavaScript коду – важливий інструмент для захисту інтелектуальної власності та ускладнення аналізу скриптів. Вона перетворює код у нечитабельний формат шляхом перейменування ідентифікаторів, кодування рядків, вставки мертвого коду, заплутування потоку управління, динамічної генерації та упаковки.
Однак обфускація має свої мінуси – вона уповільнює виконання і ускладнює підтримку коду. Тому обфускацію слід застосовувати зважено і багаторівнево, комбінуючи різні підходи.
Деобфускація – процес відновлення вихідного коду. Для боротьби з нею потрібно використовувати комплексні обфускатори на кшталт JavaScript Obfuscator Tool, JS Obfuscator, Closure Compiler, які задіюють просунуті техніки маскування.
Слідуючи порадам з цієї статті, ви зможете ефективно захистити свої JavaScript додатки від копіювання і зламу. Успішної обфускації!