Поиск вредоносного ПО в памяти

Как защитник распознаёт следы скрытного вредоносного ПО в дампе памяти, даже когда на диске чисто.

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.malfindRWX-области и инъекции кода без файла на диске
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 — основной арсенал охотника за вредоносным ПО в памяти.
Проверьте себя
1. Почему область памяти с правами RWX, не связанная с файлом на диске, считается подозрительной?
ARWX означает зашифрованные данные
BЗдоровый код обычно исполняемый, но не записываемый и отображён из файла; RWX без файла указывает на внедрённый код
CТакие области всегда принадлежат ядру
DRWX замедляет работу процесса
2. Как защитник обнаруживает процесс, спрятанный из списка ядра?
AПерезагружает систему и смотрит снова
BСравнивает вывод pslist (список ядра) с psscan (поиск сигнатур в памяти)
CОтключает антивирус
DУдаляет pagefile