Поиск вредоносного ПО в памяти
Как защитник распознаёт следы скрытного вредоносного ПО в дампе памяти, даже когда на диске чисто.
Fileless-вредонос — это код, который живёт только в оперативной памяти и не оставляет исполняемого файла на диске, что делает дамп RAM главным (а иногда единственным) местом его обнаружения.
Материал — для защиты: мы разбираем признаки заражения, чтобы их находить и закрывать, а не инструкцию по написанию вредоносного ПО. Создание и распространение вредоносных программ наказуемо (ст. 273 УК РФ). Анализ ведётся на собственных дампах или в учебной лаборатории.
Зачем это знать защитнику
Атакующие давно ушли от «положить вирус на диск». Современный приём — спрятать код внутри легитимного процесса: антивирус видит доверенный explorer.exe или svchost.exe, а внутри исполняется чужой код. Поймать такое можно только в памяти, сопоставив, что процесс заявляет о себе, с тем, что у него реально внутри. Знание этих техник на уровне принципа позволяет строить правила обнаружения.
Техники сокрытия — концептуально
Process Injection (внедрение кода)
Идея: записать свой код в адресное пространство чужого, уже доверенного процесса и заставить его выполнить. Снаружи работает обычный процесс, фактически — чужая логика. В памяти это выдаёт область, помеченная одновременно как записываемая и исполняемая (RWX) и не связанная ни с каким файлом на диске. Нормальный код исполняется из отображённого образа модуля, а не из анонимной RWX-страницы — поэтому такая страница и есть красный флаг.
Process Hollowing (выдалбливание)
Концепция: запустить легитимный процесс в приостановленном состоянии, «выдолбить» его оригинальный образ из памяти и подменить своим, затем возобновить. PID и имя в списке выглядят законно, но содержимое памяти не совпадает с файлом на диске. Признак для защитника — расхождение между образом процесса в памяти и его файлом-источником, а также аномальный родитель.
Маскировка под легитимное имя
Самый дешёвый приём — назвать вредоносный процесс как системный: svch0st.exe (ноль вместо «o»), scvhost.exe (переставленные буквы) или настоящий svchost.exe, но запущенный из неправильной папки. Защитник ловит это, проверяя три вещи: точный путь к исполняемому файлу, родительский процесс и цифровую подпись. Настоящий svchost.exe живёт только в системном каталоге и порождается services.exe — всё остальное подозрительно.
Скрытые процессы
Отдельный приём — спрятать процесс из штатного списка ядра (DKOM, прямое изменение структур). Тогда диспетчер задач и pslist его не покажут. Но psscan, ищущий сигнатуры во всей памяти, его найдёт. Именно поэтому защитник всегда сверяет два списка.
От находки к выводу: корреляция
Одного индикатора мало — серьёзный аналитик строит цепочку из нескольких независимых признаков, прежде чем объявить процесс вредоносным. Скажем, malfind нашёл RWX-область в svchost.exe; pstree показал, что родитель — не services.exe, а офисное приложение; netscan выявил исходящее соединение на незнакомый адрес; cmdline содержит закодированную строку. По отдельности каждый факт можно списать на ложное срабатывание, но вместе они складываются в убедительную картину компрометации. Этот переход от разрозненных артефактов к обоснованному выводу и отличает форензику от гадания.
Как обнаружить в дампе
Ключевые плагины Volatility для охоты на вредоносное ПО:
| Плагин | Что выявляет |
windows.malfind | RWX-области и инъекции кода без файла на диске |
windows.psscan vs pslist | скрытые процессы (расхождение списков) |
windows.ldrmodules | несоответствия в записях загруженных модулей (признак hollowing) |
windows.pstree | аномальный родитель (например, Word, запустивший PowerShell) |
$ python3 vol.py -f mem.lime windows.malfind
Process: svchost.exe PID: 1340
Protection: PAGE_EXECUTE_READWRITE
Disasm: 4d 5a 90 00 ... (сигнатура MZ в анонимной RWX-области)
Тут malfind подсветил RWX-область с признаком исполняемого файла (MZ) внутри svchost.exe — типичный индикатор внедрённого кода.
Как это работает под капотом
Операционная система помечает каждую страницу памяти правами: чтение (R), запись (W), исполнение (X). Здоровый код почти всегда исполняемый, но не записываемый (RX) и отображён из конкретного файла-модуля. Вредоносный внедрённый код вынужден сделать страницу одновременно записываемой (чтобы туда положить байты) и исполняемой (чтобы их запустить) — сочетание RWX. Поиск таких страниц без привязки к файлу — это и есть эвристика malfind.
Защитник часто сводит находки в матрицу прав, чтобы быстро вычислить аномалии. Простой разбор на стандартной библиотеке Python:
regions = [
{"proc": "explorer.exe", "prot": "RX", "backed": True},
{"proc": "svchost.exe", "prot": "RWX", "backed": False},
{"proc": "chrome.exe", "prot": "RW", "backed": True},
{"proc": "notepad.exe", "prot": "RWX", "backed": False},
]
suspicious = [r for r in regions if r["prot"] == "RWX" and not r["backed"]]
print("Подозрительных областей:", len(suspicious))
for r in suspicious:
print(f" {r['proc']}: {r['prot']} без файла на диске")
Вывод:
Подозрительных областей: 2 svchost.exe: RWX без файла на диске notepad.exe: RWX без файла на диске
Две RWX-области без файла на диске — кандидаты на инъекцию, которые аналитик дальше дампит и исследует отдельно.
Как защититься
- Включите Sysmon с правилами на CreateRemoteThread и доступ к памяти чужих процессов — инъекции станут видны в логах.
- Применяйте политику, запрещающую офисным приложениям порождать интерпретаторы (Word → PowerShell), и контролируйте такие цепочки.
- Регулярно снимайте и анализируйте память критичных хостов, а не только при явном инциденте.
- Стройте эталон «нормальных» процессов и их родителей, чтобы аномалия бросалась в глаза.
- Используйте EDR, который отслеживает RWX-аллокации и поведение в реальном времени.
Итоги
- Fileless-вредонос живёт в RAM и не виден на диске — память становится главной уликой.
- Injection и hollowing прячут чужой код внутри доверенных процессов.
- Признаки: RWX-страницы без файла, расхождение pslist/psscan, аномальный родитель.
- malfind, psscan, ldrmodules и pstree — основной арсенал охотника за вредоносным ПО в памяти.