Если вы не принимаете меры предосторожности с вашим кодом JavaScript, вы облегчаете жизнь любому, кто хочет его клонировать. Но если ваши процессы программирования выполняются на расстоянии более одного клика, злоумышленники предпочтут клонировать программное обеспечение конкурента. Боты и другие злоумышленники, прочесывающие Интернет для получения учетных данных AWS или Azure, обычно не связываются с запутанным кодом — данные для входа на следующий веб-сайт можно также использовать для майнинга биткойнов и собирать с меньшими усилиями.
Запутывание JavaScript используется для быть сложным. Тем не менее, процесс стал значительно проще в течение последних нескольких лет. Сегодня даже небольшие компании могут и должны защищать свой код от посторонних глаз. В некоторых случаях обеспечение безопасности — это просто вызов пакета Node.js.
Следующие шаги знакомят с часто используемым обфускатором JavaScript, а также рассматривают несколько других тем, связанных с данной проблемой.
Содержание статьи
- 1 01. Проверка версии
- 2 02. Установите программу
- 3 03. Создайте образец
- 4 04. Добавьте некоторый код
- 5 05. Реализация шифрования
- 6 06. Первое запутывание
- 7 07. Перенаправление вывода
- 8 08. Анализ результатов
- 9 09. Запретить сбор строк
- 10 10. Посмотрите на результаты еще раз
- 11 11. Понимание рандомизации
- 12 12. Перейти после строки
- 13 13. Введите случайный код
- 14 14. Наслаждайтесь хаосом
- 15 15. Агрессивно изменять поток программ
- 16 16. Раздражать отладчик
- 17 17. Оценить технические проблемы
- 18 18. Играйте в игры в кошки-мышки
- 19 19. Быстрое запутывание в сети
- 20 20. Подробнее
- 21 21. Смертельный враг обфускатора
01. Проверка версии
Наш JavaScript-обфускатор живет в среде выполнения Node. Давайте начнем с проверки используемых версий. В приведенных ниже выходных данных указано состояние версии, найденное на вашей рабочей станции, используемой для следующих шагов:
tamhan @ tamhan-thinkpad: ~ $ node --version v8.12.0 tamhan @ tamhan-thinkpad: ~ $ npm - версия 6.4.1
02. Установите программу
Javascript-obfuscator должен быть установлен в глобальный кэш сборок вашей рабочей станции. Вызовите npm с параметром -g и не забудьте предоставить права суперпользователя — фактический процесс развертывания должен быть выполнен за несколько секунд.
tamhan @ tamhan-thinkpad: ~ $ sudo npm install -g javascript-obfuscator [sudo] пароль для tamhan:. , , + javascript-obfuscator@0.18.1 добавил 103 пакета от 162 участников в 4.4s
03. Создайте образец
Тестирование запутывания работает лучше всего, если у нас есть некоторый «реальный» код. Итак, давайте начнем с небольшой веб-страницы HTML. Он загружает файл JavaScript с именем worker.js, объявляет кнопку и содержит небольшой встроенный сценарий. Когда он загружен в браузер, нажмите кнопку, чтобы отобразить текстовое поле.
04. Добавьте некоторый код
Worker.js начинается со строковой переменной. Они являются классической целью атаки — если ПЗУ нужно декодировать, ассемблер обычно начинает с поиска таблиц, содержащих последовательности строк. Кроме того, шифрование выполняется с использованием набора переменных с очень «говорящими» именами.
var myString = "Hello from Future plc" function doTheTrick () {var chiffrat; chiffrat = rot13 (myString); возвратный шиффрат; }
05. Реализация шифрования
Поскольку это не предназначено для шифрования 101, мы должны остановиться на сравнительно простом шифре замещения. ROT13 не сложен, но его можно запрограммировать довольно многословно. Реализация Dsoares поставляется с набором «говорящих» переменных и обеспечивает много еды для нашего обфускатора.
функция rot13 (str) {var re = new RegExp ("[a-z]", "i «); var min = 'A'.charCodeAt (0); var max = 'Z'.charCodeAt (0); коэффициент вариации = 13; var result = ""; str = str.toUpperCase (); для (var i = 0; i <str.length; i ++) {result + = (re.test (str [i])? String.fromCharCode ((str.charCodeAt (i) - min + factor)% (max- min + 1) + min): str [i]); } вернуть результат; }
06. Первое запутывание
Выполнение запутывания кода очень просто. Вызвать javascript-obfuscator и передать точку, чтобы программа работала со всеми файлами, найденными в текущем рабочем каталоге. Это показывает результат на рабочей станции автора IBM:
tamhan @ tamhan-thinkpad: ~ / FutureObfuscate / code $ javascript-obfuscator.
07. Перенаправление вывода
Выжигание файлов непосредственно в папку контейнера неэффективно, так как имена должны быть изменены перед использованием. Лучший способ заключается в использовании параметра output . Если javascript-obfuscator найдет его, программа создаст подпапку в текущем рабочем каталоге и сохранит там результаты своей работы.
tamhan @ tamhan-thinkpad: ~ / FutureObfuscate / код $ javascript-обфускатор. --output ./obfusca
08. Анализ результатов
Погрузиться в папку «obfusca» и открыть новая версия worker.js, чтобы полюбоваться мерзостью, показанной на этом шаге. Форматирование кода было искажено плохо. Однако имена методов остались прежними, поскольку они необходимы для внешних вызовов. Кроме того, теперь строки располагаются в массиве, где злоумышленник может их удобно собрать.
var a0_0xb9e2 = ['Hellox20fromx20Futurex20plc''[a-z]', 'test', ' charCodeAt '];
09. Запретить сбор строк
Javascript-obfuscator поставляется с набором алгоритмов сортировки строк, которые можно настроить с помощью — string-array-encoding . Имейте в виду, что выходной каталог должен очищаться перед каждым вызовом, потому что забывание этого приводит к «рекурсивному» запутыванию выходных файлов из предыдущего запуска.
tamhan @ tamhan-thinkpad: ~ / FutureObfuscate / code $ javascript-obfuscator. --output ./obfusca --string-array-encoding base64
10. Посмотрите на результаты еще раз
На этом этапе вывод нашего обфускатора выглядит иначе — массив в верхней части файла теперь гораздо менее читабелен. Это, однако, не решает всех проблем. Если вы выполните несколько циклов запутывания, вы в конечном итоге получите наценку, аналогичную той, которая сопровождает этот шаг:
var a0_0x31e5 = ['bGVuZ3Ro','dGVzdA==',' ZnJvbUNoYXJDb2Rl','Y2hhckNvZGVBdA==',' dG9VcHBlckNhc2U=']; , , , , , , var myString = 'Hello x20from x20Future x20plc'
11. Понимание рандомизации
Обфускаторы работают в поле давления между высокой производительностью и защитой кода. Одним из способов решения проблемы является «рандомизация» элементов. Затрачиваемые на время выполнения запутывания добавляются не ко всем узлам, а только к подмножеству. Обнаружение, если узлы затронуты или нет, обычно выполняется с помощью генератора случайных чисел, чья чувствительность может быть настроена.
12. Перейти после строки
Вышеупомянутый генератор случайных чисел испускает числа в диапазоне от нуля до единицы. Если число превышает пороговое значение, изменение не будет иметь места. Установка для stringArrayThreshold значения, равного единице, означает, что все числа меньше порогового значения, гарантируя, что каждая строка искажается.
tamhan @ tamhan-thinkpad: ~ / FutureObfuscate / код $ javascript-обфускатор. --output ./obfusca --string-array-encoding base64 --stringArrayThreshold 1
13. Введите случайный код
Инструменты анализа, такие как JSNice, выигрывают от наличия небольшой базы кода. Учитывая, что javascript-obfuscator в любом случае разбивает код на AST, ничто не говорит против вставки «мусорного кода» на лету. Поскольку эта функция добавляет значительный объем, разработчики должны активировать ее вручную с помощью двух параметров, показанных рядом с этим:
- dede-code-инъекция - dead-code-инъекция-порог
14. Наслаждайтесь хаосом
Запуск обфускатора с обоими — dead-инъекция true и — мертвый код-порог внедрения 1 приводит к размеру файла около 2,5 КБ. Попытка изгнать код приводит к почти неразрешимой стене в основном тавтологического JavaScript.
15. Агрессивно изменять поток программ
Разбивка кода на AST позволяет проводить глубокие преобразования. Установка для атрибута controlFlowFlattens значения true указывает программе, что она может деинлайн-вызовы функций. Это приводит к значительному расширению сгенерированного кода — имейте в виду, что результаты могут нанести 150-процентный удар по производительности.
16. Раздражать отладчик
Артефакты отладки являются величайшим подарком хакерам в мире. Несколько вызовов console.log () и его друзей могут дать злоумышленнику ценную информацию о том, что происходит внутри программы. Хорошим примером может служить фрагмент кода:
function doTheTrick () {var chiffrat ; console.log («Подготовка к шифрованию шифрата»); chiffrat = rot13 (myString); console.log («Возвращение шиффрата»); возвратный шиффрат; }
17. Оценить технические проблемы
Мы можем попытаться повторно запутать программу с помощью команды ниже. Он отключает функцию кэширования строк и должен отключить ведение журнала консоли с помощью перенаправления.
tamhan @ tamhan-thinkpad: ~ / Desktop / DeadStuff / 2018Nov / FutureObfuscate / code $ javascript-obfuscator. --output ./obfusca --string-array-encoding false --disableConsoleOutput true
18. Играйте в игры в кошки-мышки
Поставщики обфускаторов и браузеров ведут долгую и ожесточенную битву за функцию отладчика. Из-за этого «агрессивные» меры, такие как перенаправление консоли прерывателей потока программы, показанных на этом шаге, обычно не работают долго.
debugProtection: false, debugProtectionInterval: false,
19. Быстрое запутывание в сети
Установка всего пакета Node.js для запутывания одного или двух файлов не имеет смысла. Посетите obfuscator.io, чтобы получить доступ к онлайн-версии программы, которая находится в вашем браузере. Отметки и поля со списком под основным входом позволяют изменять поведение программы, как описано в приведенных выше шагах.
20. Подробнее
Команда разработчиков ведет относительно подробную документацию, объясняющую как различные параметры командной строки взаимодействуют друг с другом. Просто зайдите сюда, если вывод «краткой справки», показанный выше, не поможет вам достичь вашей цели.
21. Смертельный враг обфускатора
ETH Zurich предоставляет служба удаления запутывания, размещенная на сайте jsnice.org. Он использует нейронные сети и базу знаний, составленную из существующего кода, для определения имен переменных. Хотя процесс форматирования обычно работает довольно хорошо, некоторые имена, например pixelSizeTargetMax в подпрограмме шифрования, сопровождающей этот шаг, могут быть довольно забавными.
функция rot13 (PL $ 120) {/ ** @type {! RegExp} * / var достаточныйRegExp = новый RegExp (a0_0x395d ("0x1"), "i"); var pixelSizeTargetMax = "A" ["charCodeAt"] (0); var zeroSizeMax = "Z" ["charCodeAt"] (0); / ** @type {number} * / var minh = 13; / ** @type {string} * / var out = "";
Эта статья была первоначально опубликована в выпуске 283 журнала креативного веб-дизайна Веб-дизайнер . Купите номер 283 здесь или подпишитесь на веб-дизайнера здесь .
Статьи по теме: