Деобфускатор PowerShell

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

Обфускация PowerShell прячет то, что делает скрипт, за слоями: -EncodedCommand в Base64, сжатие gzip, коды символов, конкатенация строк, оператор формата -f и экранирование обратными кавычками — каждый слой снимается по очереди, пока не останется читаемый текст или не будет достигнута точка, где статическое разворачивание останавливается. Этот инструмент снимает слои по одному и показывает каждый шаг, чтобы вы видели, что говорит скрипт, не запуская его. Если скрипт взят из журнала событий Windows, просмотрщик EVTX читает файл .evtx и помечает события 4104; для других текстовых журналов парсер журналов находит нужные строки. Сопутствующая статья как деобфусцировать скрипты PowerShell объясняет слои и безопасный рабочий процесс прозой.

Последнее обновление:

До 200 КБ (.txt или .ps1). Файл читается в вашем браузере и никогда не покидает ваше устройство. Ничего не выполняется.

🔒 Ваш скрипт разворачивается в вашем браузере и никогда не покидает ваше устройство. Без учётной записи, без загрузки, без обращения к серверу — и здесь ничего никогда не выполняется.

Что происходит со вставленным скриптом

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

Чего чистый результат НЕ доказывает

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

Индикатор — не доказательство злого умысла. Колыбели загрузки, IEX и закодированные команды имеют легитимное применение в администрировании и развёртывании; каждое совпадение — это признак для проверки в контексте, а не приговор.

Никогда не запускайте неизвестный скрипт, чтобы узнать, что он делает. Декодируйте его инертно, передайте результат вашему EDR или в песочницу и относитесь к декодированному тексту с тем же подозрением, что и к закодированной форме, — это улика, а не справка о здоровье.

Как работает разворачивание

Инструмент пробует восемь слоёв по порядку, по одному за шаг, и повторяет, пока не перестанет применяться ни один слой или не будет снято десять слоёв: извлечение -EncodedCommand (Base64 в UTF-16LE, при неудаче — в UTF-8); голый blob Base64; распаковка gzip или deflate (вход может быть сначала обёрнут в Base64); последовательности кодов [char] и [char[]]; конкатенация строк в смешанных кавычках и на нескольких строках; оператор формата -f; удаление экранирования обратными кавычками; и список заполнителей ${...} и $переменная, которые никогда не разрешаются, потому что их значения существуют только во время выполнения. Каждый шаг показывает текст до и после, с числом символов.

Чего инструмент НЕ делает: он никогда ничего не выполняет — результат представляет собой инертный текст, и страница не может выполнить его даже случайно. Он не может развернуть динамически построенные строки, зашифрованные нагрузки или значения, существующие только во время выполнения, и не судит, безопасен ли скрипт: индикаторы — это совпадения шаблонов, а скрипт, обошедший все слои, сообщается как «не удалось развернуть дальше», а не как чистый.

Ведение журнала блоков скриптов (событие 4104) записывает текст скрипта, который PowerShell действительно выполнил, но длинные скрипты разбиваются на фрагменты примерно по 4 КБ, каждый с ScriptBlockId, MessageNumber и MessageTotal. Вкладка сборки группирует фрагменты по ScriptBlockId, упорядочивает их по MessageNumber, соединяет и помечает отсутствующие части — группа, где из 3 частей есть 2, а часть 2 отсутствует, неполна, и отсутствующий текст угадать нельзя. Собранный текст подаётся в тот же деобфускатор.

Частые вопросы

Почему результат показан как инертный текст, а не как исполняемый скрипт?

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

Инструмент остановился с сообщением «не удалось развернуть дальше». Что теперь?

Оставшийся текст использует слой, который этот инструмент не знает, строит свои строки во время выполнения или зашифрован — статическое разворачивание достигло предела. Не запускайте его, чтобы узнать: передайте закодированную форму и частичную расшифровку вашему EDR или в песочницу, а неизвестный слой считайте поводом для подозрения, а не чистым результатом.

Что делать с индикаторами?

Относитесь к каждому как к вопросу, а не как к ответу. Колыбель загрузки спрашивает, куда указывает URL и ожидается ли этот хост; шаблон обхода AMSI спрашивает, зачем скрипт пытается ослепить сканер; закодированная команда спрашивает, что скрывала кодировка. Проверяйте каждый в контексте — в вашем EDR, ваших журналах и на машине, с которой пришёл скрипт, — прежде чем что-либо решать.