Что отменяет этот инструмент
Многие обфускаторы JavaScript — включая тот, что есть на этом же сайте, — переписывают код с помощью небольшого набора механических, чисто статических преобразований: переносят каждый строковый литерал в один массив и заменяют каждое использование вызовом функции-геттера, экранируют обычные символы как последовательности \xNN или \uNNNN, разворачивают простую арифметику в эквивалентные, но более длинные выражения, оборачивают настоящий код в заведомо истинный или заведомо ложный if, переписывают a.b как a['b']. Этот инструмент отменяет ровно эти пять вещей:
- Подстановка массива строк — находит конструкцию вида
var _s = ["foo", "bar"]; function _g(i){ return _s[i]; }и заменяет каждый вызов вида_g(0), у которого индекс — литеральное число, на реальную строку, а затем удаляет массив и функцию, если на них больше никто не ссылается. - Декодирование escape-последовательностей — показывает
\x48\x69какHi, а не в экранированном виде. - Свёртка констант — превращает
1 + 2в3,"a" + "b"в"ab"и подобную литеральную арифметику, избегая всего, что потребовало бы догадок (например, деления на литеральный ноль). - Удаление мёртвых веток —
if (true) { A } else { B }становится простоA;while (false) {}исчезает полностью. - Из квадратных скобок в точку —
obj['name']становитсяobj.name, еслиname— допустимый идентификатор.
Чего он не делает
Это статическое сопоставление шаблонов на уровне AST, а не универсальный деобфускатор. Он не выполняет никакого кода, поэтому не может распаковать загрузчик на основе eval, разрешить непрозрачный предикат, зависящий от значения во время выполнения, или отменить выравнивание потока управления сложнее тривиального литерального случая if/while/тернарного оператора выше. Имена переменных остаются без изменений — _0x1a2b так и останется _0x1a2b. Если файл не соответствует точно форме «массив строк + функция-геттер», этот этап просто сообщит о нуле подставленных вызовов, а не будет угадывать другой шаблон.
Как это работает
Код разбирается в AST с помощью acorn, обходится и переписывается вручную написанными преобразованиями, которые срабатывают только когда значение уже доказуемо является литералом, и заново генерируется с помощью astring. Ничего не отправляется на сервер: разбор и переписывание происходят полностью в вашем браузере.
Как пользоваться
Вставьте или введите JavaScript в редактор и запустите обработку. В сводке точно показано, сколько раз сработал каждый этап, — так видно, что изменилось, а что нет. Результат можно скопировать или скачать как файл .js.
Tiny Online Tools







