Перейти к содержанию
Избранное

Декодирование JavaScript eval

Обновлено:

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

Инструмент декодирования eval в JavaScript

Поля ввода
Если включено, результат будет автоматически обновляться при изменении любого значения.

Формула декодирования JavaScript eval

Формула
\[ D = B_4\!\left(L\!\left(E\!\left(S_{4:}\right)\right)\right) \]

Где:

  • \(S\) — текст, введённый в поле «Обфусцированный код JavaScript».
  • \(S_{4:}\) — тот же текст без первых четырёх символов; как правило, это удаляет eval.
  • \(E\) — вычисление оставшегося выражения средствами JavaScript.
  • \(L\) — удаление начальных пробелов из возвращённой строки.
  • \(B_4\) — форматирование с отступом 4; \(D\) — отображаемый результат.

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

Декодирование JavaScript eval — пример вычисления

Пример: введите eval(function(p){return p.replace("0", "42");}("const answer = 0;")) в поле «Обфусцированный код JavaScript». После удаления eval остаётся вызов функции, который возвращает строку.

\[ \operatorname{replace}(\text{"const answer = 0;"},\text{"0"},\text{"42"})=\text{"const answer = 42;"} \]

Результат: в поле «Декодированный код JavaScript» отображается const answer = 42;. Этот пример демонстрирует этапы обработки; в запакованных скриптах обычно используется более сложная функция замены.

Как пользоваться калькулятором

  1. Вставьте полное выражение в поле «Обфусцированный код JavaScript». Предполагаемый ввод начинается с eval(function(...)); сохраните вызов функции и её аргументы без изменений.
  2. Запустите калькулятор и прочитайте результат в поле «Декодированный код JavaScript». Инструмент удаляет первые четыре символа, вычисляет оставшееся выражение, убирает начальные пробелы из возвращённой строки и форматирует её.
  3. При необходимости просмотреть текст в редакторе воспользуйтесь функцией копирования результата. Прежде чем запускать код где-либо ещё, проверьте, что он делает.

Значения по умолчанию для отправки отсутствуют. Пустое поле приводит к сообщению «Введите код». Если ввод некорректен или не возвращает строку, вычисление может завершиться неудачей и декодированный результат не будет получен.

Что означает декодирование JavaScript eval

Некоторые упаковщики JavaScript создают внешнее выражение вида eval(function(...){...}(...)). Внутренняя функция собирает строку исходного кода, заменяя короткие токены более длинными идентификаторами или другим текстом. В исходном выражении внешний eval затем запускал бы этот сгенерированный код. Данный калькулятор удаляет буквальный префикс eval, чтобы вместо этого показать строку, возвращаемую внутренним выражением.

Это различие важно при чтении результата. Отображаемый текст — это сгенерированный исходный код, а не обязательно запись всего, что происходило во время декодирования. Внутреннее выражение всё равно вычисляется для его получения, и внутренняя функция может выполнять действия до того, как вернёт строку. Форматирование облегчает просмотр результата, но не объясняет поведение кода и не гарантирует его безопасность.

Используйте результат, чтобы внимательнее проверить переменные, вызовы функций, URL-адреса и логику построения строк. Если исходный код просто минифицирован, а не обёрнут в совместимое eval-выражение, результат инструмента «Сжатие JavaScript» иллюстрирует другой тип преобразования: сокращение кода само по себе не подразумевает этапа декодирования на основе eval. Чтобы сравнить, как создаётся обёртка такого типа, см. «Обфускатор JavaScript (eval)».

Допущения, ограничения и безопасность

Не считайте этот инструмент безопасной песочницей для вредоносного кода. Инструмент вызывает JavaScript eval для ввода после удаления первых четырёх символов. Хотя это может избежать выполнения сгенерированного исходного кода, как это сделал бы исходный внешний eval, оставшееся выражение само может выполнять JavaScript. Недоверенный ввод может иметь побочные эффекты в вашем браузере. Исследуйте подозрительные скрипты в подходящей изолированной среде, а не вставляйте их в страницу, которой вы доверяете.

Инструмент удаляет ровно четыре символа; он не разбирает JavaScript, чтобы найти внешний eval. Комментарий в начале, пробелы перед eval или другая обёртка могут изменить то, что будет вычислено. Также предполагается, что вычисляемое выражение возвращает строку: число, объект или значение undefined не могут быть обработаны последующей строковой операцией. Предусмотренная логика выполняет одно вычисление и один проход форматирования; она не распаковывает многократно вложенные слои и не выполняет подсветку синтаксиса.

Форматирование может добавлять переносы строк и отступы, поэтому отображаемый результат не следует считать побайтово идентичным возвращённой строке. Если при анализе обнаружится отдельно закодированное значение в Base64, для его изучения может помочь декодер Base64; он не является частью процесса декодирования этого калькулятора.

Часто задаваемые вопросы

Как распаковать скрипт, запакованный через eval, не запуская его?

Простой скрипт можно распаковать вручную, отследив подстановки строк. Определите закодированный текст, список токенов и цикл, заменяющий токены, а затем примените эти замены к копии текста. Для более сложных скриптов используйте инструмент статического анализа или изолированную среду. Не предполагайте, что удаление внешнего eval делает оставшееся выражение безопасным для запуска.

Почему декодер показывает ошибку или бесполезный результат?

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

Может ли этот инструмент декодировать несколько слоёв обфускации?

Нет, он отображает строку, созданную одной совместимой обёрткой. Если эта строка содержит другое запакованное выражение, оно остаётся отдельным слоем, требующим анализа. Не отправляйте каждый слой обратно в калькулятор автоматически: каждое вычисление может запустить код, включая код, изменяющий данные страницы или выполняющий сетевые запросы. Для недоверенных скриптов используйте изолированную среду анализа.

Совпадает ли декодированный JavaScript с кодом, который выполнялся на исходной странице?

Не обязательно. Отображаемая строка — это исходный текст, сгенерированный обёрткой; исходный внешний eval затем попытался бы выполнить этот текст. Сама обёртка также могла выполнять действия при построении строки. Чтобы понять поведение исходной страницы, изучите и обёртку, и сгенерированный код, а также другие скрипты и API браузера, от которых они зависят.

Почему после декодирования я всё ещё вижу нечитаемые строки?

Запаковка через eval может быть лишь одним слоем обфускации. Сгенерированный код по-прежнему может содержать шестнадцатеричные escape-последовательности, преобразования кодов символов, закодированные данные, сокращённые имена или строки, собираемые во время выполнения. Форматирование может выявить структуру, но не способно превратить каждое закодированное значение в понятный текст. Проверяйте, как каждая строка строится и используется, прежде чем считать видимый URL-адрес или идентификатор полной картиной.

Меняет ли форматирование работу декодированного JavaScript?

Форматирование предназначено для облегчения чтения исходного кода, а не для проверки его поведения. Обычно добавленные отступы и переносы строк сохраняют синтаксис JavaScript, однако изменения раскладки могут иметь значение в крайних случаях, таких как автоматическая вставка точек с запятой, строки и комментарии. Сохраните исходный результат для сравнения и не считайте отформатированную копию безопасной или функционально идентичной без проверки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *