Обфускация JavaScript кода

cracker92

Местный
372
128
22 Июн 2019
Нужно ли обфусцировать JavaScript
JavaScript код работает в веб браузерах пользователей и доступен им для изучения и других действий. Если вы задались вопросом «Зачем мне обфусцировать мой код JavaScript?», то существует множество причин, по которым рекомендуется защищать код, например:

  • Не позволяйте никому просто копировать/вставлять вашу работу. Это особенно важно для 100% клиентских проектов, таких как игры HTML5;
  • Удаление комментариев и пробелов, которые не нужны. Ускорение загрузки и повышение сложности для понимания;
  • Защита работ, которые ещё не оплачены. Вы можете показать свою работу клиенту, зная, что у него не будет исходного кода, пока счёт не будет оплачен;
  • Защита от проксирования сайта, программы для проксирования могут менять все внутренние ссылки, благодаря обфускации JavaScript можно защититься от автоматических парсеров.
Обфусцированный JavaScript медленнее!
В статье, ссылка на которую приведена выше, объясняется различие между минимизацией и обфускацией исходного кода. Кроме способа их выполнения и простоты восстановления в исходный вид, полученный результат также различается производительностью.

Минимизированный код: скачивается с сервера быстрее, так как имеет меньший размер, время выполнения (производительность) такая же, как и у кода в исходном варианте.

Обфусцированный код: обычно имеет больший размер и практически всегда является более медленным (на десятки процентов), поскольку кроме основной функции, выполняются сопутствующие действия, необходимые для запуска кода.

Итак, минимизированный код: легко восстановить в исходную форму, производительность не падает.

Обфусцированный код: (очень) трудно восстановить в исходную форму, производительность кода падает. В обфусцированный код можно добавить самозащиту и защиту от отладки, а также бессмысленные фрагменты кода, которые сильно усложнят его анализ.

Вывод: обфусцируйте только тот код, который вы хотите защитить. То есть имеет смысл обфусцировать свой код, но нет смысла обфусцировать код популярных JavaScript библиотек, которые и так общедоступны в исходном виде.

Программы для минимизации и обфускации JavaScript
В этой статье будут рассмотрены различные инструменты и способы защиты и оптимизации JavaScript скода.

Функции btoa и atob
В простых случаев для защиты от парсеров не нужны громоздкие инструменты обфускации и достаточно просто «спрятать» некоторые строки.

Функции btoa и atob являются встроенными функциями JavaScript и всегда доступны.

Функция btoa переводит указанную строку в набор символов (работает наподобие Base64), а функция atob выполняет обратную операцию.

Принцип действия в двух строках:

btoa('Some text'); // U29tZSB0ZXh0

atob('U29tZSB0ZXh0'); // Some text

Итак, посмотрим, во что превратиться строка «Для просмотра ссылки Войди или Зарегистрируйся»:

<script>

document.write(btoa('https://google.com'));

</script>

Результат:

aHR0cHM6Ly9nb29nbGUuY29t


Теперь в моём простом коде делаем с помощью функции atob обратное преобразование этой строки, получаем:

if (/(www\.)?google\.com/.test(window.location.hostname)) {



}

else {

window.location = atob('aHR0cHM6Ly9rYWxpLnRvb2xz');

}

Данные код делает именно то, что нужно — проверяет на каком домене сайт был открыт и в случае если это не kali.tools, то делает редирект на kali.tools. При этом при проксировании сайта, парсеры не видят строку kali.tools и не делают никаких изменений в этом фрагменте кода.

JavaScript Obfuscator
JavaScript Obfuscator — это мощнейший обфускатор с множеством опций. С помощью JavaScript Obfuscator будет получен код, в котором действительно трудно разобраться. Дополнительно JavaScript Obfuscator может встроить защиту от отладки (при открытии панели «Отладка» в Инструментах веб-мастера в браузере, браузер будет зависать), самозащиту кода (вставка бессмысленных фрагментов и пр.). У JavaScript Obfuscator множество тонкий опций подстройки процесса обфускации.

Данный инструмент имеет как графический интерфейс, так и интерфейс командной строки.

JavaScript Obfuscator онлайн
Вместо установки на компьютер, вы можете использовать онлайн сервис от авторов, он расположен по адресу: Для просмотра ссылки Войди или Зарегистрируйся

Установка JavaScript Obfuscator
Установка в Kali Linux

sudo apt install npm

sudo npm install --save-dev javascript-obfuscator

sudo ln -s ~/node_modules/javascript-obfuscator/bin/javascript-obfuscator /usr/local/bin

javascript-obfuscator -h

Установка в BlackArch

sudo pacman -S npm

sudo npm install --save-dev javascript-obfuscator

sudo ln -s ~/node_modules/javascript-obfuscator/bin/javascript-obfuscator /usr/local/bin

javascript-obfuscator -h

Как установить графический интерфейс JavaScript Obfuscator
Установка веб интерфейса JavaScript Obfuscator в Kali Linux


sudo apt remove cmdtest

sudo apt install npm

sudo npm install -g yarn

sudo npm cache clean -f

sudo npm install -g n

sudo n stable

git clone Для просмотра ссылки Войди или Зарегистрируйся

cd javascript-obfuscator-ui/

yarn

npm run updatesemantic

npm run webpack:dev

node server.js

После этого веб-интерфейс будет доступен по адресу Для просмотра ссылки Войди или Зарегистрируйся

Установка веб интерфейса JavaScript Obfuscator в BlackArch

sudo pacman -S npm yarn

git clone Для просмотра ссылки Войди или Зарегистрируйся

cd javascript-obfuscator-ui/

yarn

npm run updatesemantic

npm run webpack:dev

node server.js

После этого веб-интерфейс будет доступен по адресу Для просмотра ссылки Войди или Зарегистрируйся

Чтобы в командной строке обфусцировать JavaScript код в файле script.js:

javascript-obfuscator script.js


Например, с опциями по умолчанию код:

if (/(www\.)?kali\.tools/.test(window.location.hostname)) {



}

else {

window.location = atob('aHR0cHM6Ly9rYWxpLnRvb2xz');

}

Превращается в:

var _0x2001=['test','aHR0cHM6Ly9rYWxpLnRvb2xz','location','hostname'];(function(_0x20ce42,_0x200145){var _0x20e03c=function(_0x46b9e3){while(--_0x46b9e3){_0x20ce42['push'](_0x20ce42['shift']());}};_0x20e03c(++_0x200145);}(_0x2001,0xed));var _0x20e0=function(_0x20ce42,_0x200145){_0x20ce42=_0x20ce42-0x0;var _0x20e03c=_0x2001[_0x20ce42];return _0x20e03c;};if(/(www\.)?kali\.tools/[_0x20e0('0x3')](window['location'][_0x20e0('0x2')])){}else{window[_0x20e0('0x1')]=atob(_0x20e0('0x0'));}
fb795e2331da0fbad62d8.png