JavaScript Obfuscator
Описание JavaScript Obfuscator
JavaScript Obfuscator — это мощный и бесплатный обфускатор для JavaScript и Node.js, содержащий большое количество функций и возможностей для защиты вашего исходного кода.
Доступен как в виде локального инструмента с открытым исходным кодом, так и в виде онлайн сервиса.
Что это такое?
Этот инструмент трансформирует ваш оригинальный исходный код JavaScript в новое представление, которое труднее понять, скопировать, повторно использовать и модифицировать без должного разрешения автора. Обфусцированный результат будет иметь в точности такую же функциональность, как и оригинальный код.
Этот инструмент похож на UglifyJS, Closure Compiler и пр.?
Да и нет. В то время как UglifyJS (и другие уменьшители) на выходе дают код, который труднее понять (сжатый или уродливый), используя JS Beautifier он может быть с лёгкостью трансформирован во что-то читаемое.
Этот инструмент предотвращает это, используя различные преобразования и «ловушки», такие как самозащита и защита от отладки.
Как работает обфускация?
Посредством ряда преобразований, таких как переименование переменных/функций/аргументов, удаление строк и другие, ваш исходный код преобразуется во что-то нечитаемое, но работает точно так же, как и раньше.
Домашняя страница: https://obfuscator.io
GitHub: https://github.com/javascript-obfuscator/javascript-obfuscator
Автор: Timofey Kachalov
Лицензия: BSD-2-Clause
Справка по JavaScript Obfuscator
Использование:
javascript-obfuscator <ФАЙЛ> [ОПЦИИ]
Опции:
-v, --version
Вывести номер версии
-o, --output <ПУТЬ>
Файл вывода для обфусцированного кода
--compact <true|false>
Отключить однострочное сжатие кода
--config <СТРОКА>
Имя конфигурационного файла js / json
--control-flow-flattening <true|false>
Включает выравнивание потока управления
--control-flow-flattening-threshold <ЧИСЛО>
Вероятность того, что преобразование выравнивания потока управления будет применено к узлу
--dead-code-injection <true|false>
Включает внедрение мёртвого кода
--dead-code-injection-threshold <ЧИСЛО>
Вероятность того, что мёртвый код будет добавлен к узлу
--debug-protection <true|false>
Отключение Отладочной панели браузеров (может вызвать зависание браузера c DevTools)
--debug-protection-interval <true|false>
Отключение отладочной панели браузера даже после того, как веб страница была загружена (может вызвать зависание браузера c DevTools)
--disable-console-output <true|false>
Разрешает вывод сообщений console.log, console.info, console.error and console.warn в консоль браузера
--domain-lock <СПИСОК> (разделённый запятой, без белых пробелов)
Блокирует выполнение кода в доменах, которые не соответствуют переданным шаблонам RegExp (через запятую)
--exclude <СПИСОК> (разделённый запятой, без белых пробелов)
Имя файла или подстановочные символы, которые указывает файлы, которые нужно исключить из обфускации
--identifier-names-generator <СТРОКА>
Устанавливает генератор имён идентификаторов. Варианты: hexadecimal, mangled, dictionary. По умолчанию: hexadecimal
--identifiers-prefix <СТРОКА>
Устанавливает префикс для всех глобальных идентификаторов.
--identifiers-dictionary <СПИСОК> (через запятую, без белых пробелов)
Словари идентификаторов (через запятую) для опции `--identifier-names-generator dictionary`
--log <true|false>
Включает запись информации в консоль
--reserved-names <СПИСОК> (через запятую, без белых пробелов)
Отключить обфускацию и генерацию идентификаторов, которые соответствуют переданным шаблонам RegEx (через запятую)
--reserved-strings <СПИСОК> (через запятую, без пробелов)
Отключено преобразование строковых литералов, которые соответствуют переданным шаблонам RegEx (через запятую)
--rename-globals <true|false>
Позволяет включить обфускацию имён глобальных переменных и функций с объявлением.
--rotate-string-array <true|false>
Включить ротацию значений строкового массива во время обфускации
--seed <СТРОКА|ЧИСЛО>
Устанавливает начало (seed) для генератора случайных чисел. Это полезно для создания повторяемых результатов.
--self-defending <true|false>
Отключает самозащиту для обфусцированного кода
--shuffle-string-array <true|false>
Перемешивает в случайном порядке элементы строковых массивов
--source-map <true|false>
Включает генерацию карты источников
--source-map-base-url <СТРОКА>
Устанавливает базовый URL в исходный URL-адрес карты импорта, когда `--source-map-mode=separate`
--source-map-file-name <СТРОКА>
Устанавливает имя файла для выходной карты источника, когда `--source-map-mode=separate`
--source-map-mode <СТРОКА>
Указывает режим вывода карты источника. Значения: inline, separate. По умолчанию: separate
--split-strings <true|false>
Разбивает строки литералов на куски с длиной значения параметра `splitStringsChunkLength`
--split-strings-chunk-length <ЧИСЛО>
Устанавливает длину фрагмента опции `splitStrings`
--string-array <true|false>
Отключает сбор всех литеральных строк в массив и замену каждой литеральной строки вызовом массива
--string-array-encoding <string|boolean>
Кодирует все строки в массиве строк, используя base64 или rc4 (эта опция может замедлить скорость вашего кода). Значение: true, false, base64, rc4. По умолчанию: false
--string-array-threshold <ЧИСЛО>
Вероятность того, что литеральная строка будет вставлена в stringArray (По умолчанию: 0.8, Min: 0, Max: 1)
--target <СТРОКА>
Позволяет установить целевую среду для обфусцированного кода. Значения: browser, browser-no-eval, node. По умолчанию: browser
--transform-object-keys <true|false>
Включает преобразование ключей объекта
--unicode-escape-sequence <true|false>
Позволяет включить/отключить преобразование строки в escape (экранированные) последовательность Юникода
-h, --help
Вывод справки
Руководство по JavaScript Obfuscator
Страница man отсутствует.
Вопросы и ответы по JavaScript Obfuscator
Зачем мне обфусцировать мой код JavaScript?
Существует множество причин, по которым рекомендуется защищать код, например:
- Не позволяйте никому просто копировать/вставлять вашу работу. Это особенно важно для 100% клиентских проектов, таких как игры HTML5;
- Удаление комментариев и пробелов, которые не нужны. Ускорение загрузки и сложность для понимания;
- Защита работ, которые ещё не оплачены. Вы можете показать свою работу клиенту, зная, что у него не будет исходного кода, пока счёт не будет оплачен.
Этот обфускатор абсолютно надёжен?
Нет, хотя восстановить исходный исходный код точно невозможно, кто-то, обладающий временем, знаниями и терпением, может его реконструировать.
Поскольку JavaScript запускается в браузере, движок JavaScript браузера должен уметь читать и интерпретировать его, поэтому предотвратить это невозможно. И любые обещания по этому поводу являются нечестными.
Почему мой обфусцированный код больше моего исходного кода?
Потому что обфускатор вводит новые фрагменты кода, предназначенные для защиты, в том числе от отладки и обратного инжиниринга. Также строки преобразуются в шестнадцатеричный код \xAB, чтобы немного усложнить понимание. Вам не нужно слишком сильно беспокоиться о размере кода, поскольку из-за большого количества повторений обфусцированный код будет очень хорошо сжиматься вашим веб-сервером (если на вашем сервере включено сжатие GZIP, что в настоящее время делается на большинстве серверов).
Могу ли я запустить минимизатор, такой как UglifyJS или Google Closure Compiler, для обфусцированного вывода?
Нет, это не рекомендуется, и в некоторых случаях это нарушит код (например, если вы включите самозащиту). Вы можете предварительно пропустить свой код через минификатор, чтобы убедиться, что он удаляет мёртвый код и выполняет другие оптимизации.
Можно ли восстановить исходный код из обфусцированного?
Нет, восстановить обфусцированный код обратно в исходный код невозможно, поэтому сохраните исходный код в безопасности.
Этот инструмент работает с исходным кодом Node.js?
Да.
Объяснение опций JavaScript Obfuscator
Далее названия опций приводятся как они записаны в веб интерфейсе.
Compact Code
Удаляет разрывы строк из выходного обфусцированного кода.
Identifier Names Generator
Используйте эту опцию, чтобы управлять тем, как идентификаторы (имена переменных, имена функций и т. д.) будут обфусцированы.
dictionary
Генерирует имена идентификаторов, используя имена из списка identifiersDictionary
hexadecimal
Генерирует случайные имена идентификаторов, используя шестнадцатеричный шаблон (например, 0xabc123)
mangled
Используются короткие имена идентификаторов (например, a, b, c и т. д.)
Identifiers Dictionary
Этот параметр устанавливает список идентификаторов для опции identifierNamesGenerator: dictionary
Identifiers Prefix
Эта опция заставляет все глобальные идентификаторы иметь определённый префикс.
Используйте эту опцию, когда обфусцируете несколько файлов, которые загружаются на одной странице. Эта опция помогает избежать конфликты между глобальными идентификаторами этих файлов. Используйте разные префиксы для каждого файла.
Rename Globals
Эта опция может сломать ваш код. Включайте её только если понимаете что именно она делает.
Включает обфускацию глобальных переменных и имён функций с помощью объявления.
Self Defending
Эта опция делает выходной код устойчивым к форматированию и переименованию переменных. Если кто-то на обфусцированном коде попытается использовать программы для красивого представления кода JavaScript, то код больше не будет работать, что усложнит его понимание и изменение.
Требуется включение настройки Compact Code.
Control Flow Flattening
Этот параметр сильно влияет на производительность, скорости выполнения до 1,5 раз медленнее.
Включает выравнивание потока управления кодом. Сглаживание потока управления — это структурное преобразование исходного кода, которое затрудняет понимание программы. Посмотрите страницу JavaScript's obfuscator GH для примера того, как работает преобразование.
Control Flow Flattening Threshold
Вы можете использовать этот параметр, чтобы настроить вероятность (от 0 до 1), что преобразование controlFlowFlattens будет применено к узлу.
В больших кодовых базах рекомендуется уменьшать это значение, потому что большее количество преобразований потока управления может увеличить размер вашего кода и замедлить его.
Dead Code Injection
Эта опция значительно увеличивает размер обфусцированного кода (до 200%).
Эта функция добавляет случайные блоки мёртвого кода (т. е. код, который не будет выполнен) к обфусцированному выводу, что усложняет процесс реверсирования. Посмотрите документы страницу JavaScript Obfuscator's GH для примера того, как эта функция работает.
Требуется опция String Array.
Dead Code Injection Threshold
Вы можете использовать этот параметр, чтобы настроить вероятность (от 0 до 1), что на узел будет влиять опция deadCodeInjection.
Требуется опция String Array.
Split Strings
Эта опция увеличивает размер обфусцированного кода.
Эта функция разбивает буквенные строки на куски с длиной значения параметра splitStringsChunkLength.
Split Strings Chunk Length
Вы можете использовать этот параметр для установки длины фрагмента параметра splitStrings.
String Array
Удаляет строковые литералы и помещает их в специальный массив. Например, строка "Hello World" в var m = "Hello World"; будет заменена на вызов функции, которая получит её значение во время выполнения, например: var m = _0xb0c3('0x1');
Ниже приведены варианты, как настроить эту функцию более или менее устойчивой к деобфускации.
Rotate String Array
Сдвигает массив stringArray на фиксированные и случайные (генерируемые при обфускации кода) места. Это затрудняет согласование порядка удалённых строк с их первоначальным местом.
Эта опция рекомендуется, если ваш исходный код не маленький, так как вспомогательная функция может привлечь внимание.
Shuffle String Array
Случайно перемешивает элементы массива stringArray.
Encode String Literals
Эта опция может немного замедлить ваш скрипт.
Кодируйте все строковые литералы stringArray, используя Base64 или RC4, и вставляйте специальную функцию, которая используется для его декодирования обратно во время выполнения.
Помните, что опция RC4 медленнее, чем опция Base64, примерно на 30-35% медленнее, но получить строки обратно сложнее.
String Array Threshold
Вы можете использовать этот параметр для настройки вероятности (от 0 до 1), что строковый литерал будет вставлен в stringArray.
Этот параметр полезен в больших кодовых базах, так как повторяющиеся вызовы функции stringArray могут замедлить ваш код.
Transform Object Keys
Преобразует (обфусцирует) ключи объекта.
Например, этот код var a = {enabled: true}; когда обфусцирован с этой опцией, будет скрывать ключи enabled объектов: var a = {}; a[_0x2ae0[(‘0x0’)] = true;
Посмотрите официальную документацию JavaScript Obfuscator на GitHub для полного примера.
Идеально используется с настройкой String Array.
Escape Unicode Sequence
Преобразует все строки в их представление Unicode. Например, строка "Hello World!" будет преобразована в "'\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21".
Это преобразование довольно легко вернуть к исходному виду, и оно значительно увеличит размер обфусцированного кода. Это не рекомендуется для больших баз кода.
Disable Console Output
Отключает использование console.log, console.info, console.error и console.warn, заменяя их пустыми функциями. Это затрудняет использование отладчика.
Debug Protection
Примечание: может привести к зависанию браузера, если вы откроете Инструменты разработчика.
Эта опция делает практически невозможным использование вкладки Консоль (Console) инструментов разработчика (как в Google Chrome, так и в Mozilla Firefox).
Debug Protection Interval
Если этот флажок установлен, интервал используется для принудительного включения режима отладки на вкладке «Консоль» (Console), что затрудняет использование других функций инструментов разработчика.
Как это работает? Специальный код, который вызывает debugger; повторно вставляется по всему запутанному исходному коду.
Domain Lock
Блокирует обфусцированный исходный код, чтобы он работал только на определённых доменах и/или поддоменах. Это делает очень трудным для кого-то просто скопировать и вставить ваш исходный код и запустить в другом месте.
Несколько доменов и поддоменов
Можно заблокировать ваш код для более чем одного домена или субдомена. Например, чтобы заблокировать его, чтобы код работал только на www.example.com, добавьте www.example.com, чтобы он работал на любом поддомене с example.com, используйте .example.com.
Reserved Names
Отключает деобфускацию и генерацию идентификаторов, которые соответствуют переданным шаблонам RegExp.
Например, если вы добавите ^someName, обфускатор гарантирует, что все переменные, имена функций и аргументы функций, начинающиеся с someName, не будут искажены.
Reserved Strings
Запрещает преобразование строковых литералов, которые соответствуют переданным шаблонам RegExp.
Например, если вы добавите ^some *string, обфускатор будет гарантировать, что все строки, начинающиеся с some string, не будут перемещены в `stringArray`.
Source Map
Не загружайте обфусцированный исходный код со встроенной inline source map, поскольку она содержит ваш исходный код.
Source Map могут быть полезны для отладки исходного кода Java Script. Если вы хотите или нуждаетесь в отладке на рабочем месте, вы можете загрузить отдельный файл Source Map в секретное место, а затем указать там свой браузер. Узнайте больше о Source Map на веб-сайте Google Chrome Developer Tools.
Встроенная исходная карта (Inline Source Map)
Эта опция встраивает Source Map вашего источника в результат обфусцированного кода. Полезно, если вы просто хотите отладить локально на вашем компьютере.
Отдельная исходная карта (Separate Source Map)
Это создаёт отдельный файл с Source Map. Полезно для отладки кода в рабочей среде, так как это позволяет вам загрузить Source Map в секретное место на вашем сервере, а затем указать браузеру, чтобы использовать её.
Используйте Source Map Base URL и Source Map File Name, чтобы настроить свойство sourceMappingURL, которое будет добавлено в конец вашего обфусциованного кода.
Например, если для Base URL установить значение "http://localhost:9000", а для File Name - "example", вы получите: добавление //# sourceMappingURL=http://localhost:9000/example.js.map в конец вашего обфусцированного кода.
Seed
По умолчанию (seed = 0) каждый раз, когда вы обфусцируете свой код, вы получаете новый результат (т.е. разные имена переменных, разные переменные, вставленные в stringArray и т. д.). Если вы хотите, чтобы результаты были повторяемыми, установите значение seed на определённое целое число.
Target
Вы можете установить целевую среду запутанного кода на одну из следующих:
- Browser
- Browser No Eval
- Node
Примечание: в настоящее время вывод browser и node идентичны.
Примеры запуска JavaScript Obfuscator
Обфусцировать JavaScript код в файле script.js:
javascript-obfuscator script.js
Обфусцирвоанный код будет сохранён в файл script-obfuscated.js.
Обфусцировать JavaScript код в файле ВХОДНОЙ_ФАЙЛ.js, включить однострочное сжатие кода (--compact true) и отключить самозащиту для обфусцированного кода (--self-defending false):
javascript-obfuscator ВХОДНОЙ_ФАЙЛ.js --compact true --self-defending false
Обфусцировать JavaScript код в файле ВХОДНОЙ_ФАЙЛ.js, сохранить новый код в указанный файл (--output ФАЙЛ_ВЫВОДА.js), включить однострочное сжатие кода (--compact true) и отключить самозащиту для обфусцированного кода (--self-defending false):
javascript-obfuscator ВХОДНОЙ_ФАЙЛ.js --output ФАЙЛ_ВЫВОДА.js --compact true --self-defending false
Обфусцировать все файлы в указанной директории (ДИРЕКТОРИЯ_ВХОДНЫХ_ФАЙЛОВ), включить однострочное сжатие кода (--compact true) и отключить самозащиту для обфусцированного кода (--self-defending false):
javascript-obfuscator ДИРЕКТОРИЯ_ВХОДНЫХ_ФАЙЛОВ --compact true --self-defending false
Установка 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 онлайн
Вместо установки на компьютер, вы можете использовать онлайн сервис от авторов, он расположен по адресу: https://obfuscator.io/
Как установить графический интерфейс 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 https://github.com/javascript-obfuscator/javascript-obfuscator-ui cd javascript-obfuscator-ui/ yarn npm run updatesemantic npm run webpack:dev node server.js
После этого веб-интерфейс будет доступен по адресу http://localhost:3000/
Установка веб интерфейса JavaScript Obfuscator в BlackArch
sudo pacman -S npm yarn git clone https://github.com/javascript-obfuscator/javascript-obfuscator-ui cd javascript-obfuscator-ui/ yarn npm run updatesemantic npm run webpack:dev node server.js
После этого веб-интерфейс будет доступен по адресу http://localhost:3000/
Информация об установке в другие операционные системы будет добавлена позже.
Comments are Closed