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/

Информация об установке в другие операционные системы будет добавлена позже.

Скриншоты JavaScript Obfuscator

Инструкции по JavaScript Obfuscator


Близкие программы:

  • JSFuck (100%)
  • mat (50%)
  • shred (50%)
  • wipe (50%)
  • secure-delete (srm, sfill, sswap) (50%)
  • JStillery (RANDOM - 16.7%)
  • Рекомендуется Вам:

    Comments are Closed