Статья Анализ вредоносного ПО: пошаговый разбор семпла от статики до динамики

Матричный принтер на чёрном антистатическом коврике печатает текст с техническими индикаторами вредоносного кода. Янтарный свет выхватывает зелёные строки на бумаге, остальное тонет в темноте.


IBM X-Force Threat Intelligence Index 2025 фиксирует: infostealers вышли на первое место - 32% всех обнаруженных вредоносных программ в 2024 году, обогнав ransomware. На недавнем IR-кейсе мне достался свежий стилер: запакованный PE, XOR-шифрованные строки, process hollowing для инжекции в легитимный процесс, HTTP-канал на C2. Набор знакомый, но автоматический sandbox не вытащил конфигурацию - пришлось препарировать руками. Этот материал - та самая последовательность шагов, которую я прохожу на каждом семпле: от первого хеша до готовых IOC и YARA-правила. Не перечисление инструментов, а decision tree: что смотрим, почему, и когда переключаемся между методами.

Требования к окружению​

Прежде чем открыть первый файл - о железе и изоляции. Ошибка на этом этапе стоит компрометации рабочей станции.

Аппаратные требования:

ПараметрМинимумРекомендуется
RAM8 ГБ (одна VM)16-32 ГБ (параллельная работа: статика + динамика)
CPU4 ядра, VT-x/AMD-V8+ ядер
Диск100 ГБ SSD256+ ГБ NVMe (снэпшоты VM занимают десятки ГБ)
СетьИзолированный сегментОтдельный VLAN без маршрута в прод

Программный стек - две VM:
  • Windows (FlareVM, проект Mandiant, активно поддерживается на GitHub): IDA Pro или Ghidra, x64dbg, Detect It Easy (DIE), PEStudio, Process Monitor, Process Hacker, Wireshark, FakeNet-NG, Regshot, HxD, Scylla (плагин x64dbg для дампа и восстановления IAT).
  • Linux (REMnux): radare2 (текущая версия 6.1.5, активная разработка), YARA, oletools, утилита strings, FLOSS.
Сетевая изоляция: виртуальная сеть host-only. Для имитации интернета - FakeNet-NG на Windows или INetSim на REMnux. Семпл получает ответы на DNS- и HTTP-запросы, а трафик не покидает хост. Снэпшот чистой системы создаётся до первого контакта с семплом - без него нет воспроизводимости и чистого отката.

Статический анализ вредоносного ПО: от хеша до структуры​

Статический анализ - исследование файла без запуска. Безопасен, даёт первичную картину за 15-30 минут. Решения здесь определяют дальнейшую стратегию: нужна ли распаковка, какие гипотезы проверять в динамике, на каких функциях сосредоточить реверс.

Хеширование и разведка по открытым базам​

Первый шаг - вычислить хеши. В PowerShell: Get-FileHash -Algorithm SHA256 .\sample.exe. SHA256 - основной идентификатор для всех баз и отчётов. MD5 и SHA1 используются для совместимости со старыми базами, но оба подвержены коллизиям - для верификации не годятся.

SHA256 отправляем в VirusTotal. Если семпл известен - изучаем вкладки Detection, Behavior, Relations. Количество детектов мало о чём говорит: 3/72 не означает «чистый файл», а 60/72 не гарантирует, что анализ уже не нужен. Полезнее имена детектов - в них часто закодировано семейство: Trojan.GenericKD, Stealer.MSIL, Packed.Win32. Это отправная точка для атрибуции.

Если VirusTotal возвращает 0/72 - семпл либо свежий, либо модифицированный. Для аналитика это сигнал к полному ручному разбору.

Decision point: семпл подробно описан в отчётах → сопоставляем IOC, подтверждаем наличие в инфраструктуре. Семпл неизвестен или свежий → переходим к полному анализу.

Анализ PE-заголовков и индикаторы упаковки​

Загружаем семпл в Detect It Easy (DIE). На что смотреть:

TimeDateStamp - дата компиляции. Значение 1970-01-01 или дата из будущего - timestamp намеренно обнулён или подделан, типичный приём для затруднения атрибуции.

Энтропия секций. Нормальная секция .text имеет энтропию 5.5-6.5. Значение выше 7.0 - маркер сжатия или шифрования. Секция UPX1 или нестандартная секция с энтропией 7.8+ - семпл почти наверняка упакован. Это Software Packing (T1027.002, Defense Evasion по MITRE ATT&CK): авторы малвари пакуют код, чтобы обойти сигнатурные детекторы.

Расхождение размеров. Если VirtualSize секции значительно больше SizeOfRawData - упакованный код распаковывается в память, занимая больше пространства, чем на диске. Красноречивый признак.

Импорты. Таблица импортов из 5-10 функций (LoadLibraryA, GetProcAddress, VirtualAlloc) - перед нами пакер, который разрешает реальные импорты в рантайме. Развитая таблица с CreateRemoteThread, VirtualAllocEx, WriteProcessMemory, NtUnmapViewOfSection - прямое указание на инжекцию кода, вероятно Process Hollowing (T1055.012, Defense Evasion / Privilege Escalation). Комбинация InternetOpenA, InternetConnectA, HttpSendRequestA - сетевая активность, потенциально C2 через Web Protocols (T1071.001, Command and Control).

Строки, FLOSS и первые индикаторы компрометации​

Утилита strings извлекает ASCII- и Unicode-строки из бинарника. На неупакованном PE результат бывает богатым: URL-адреса C2, пути для persistence, имена мьютексов, User-Agent строки. На упакованном - мусор.

Для обфусцированных строк берём FLOSS (FireEye Labs Obfuscated String Solver): floss sample.exe. FLOSS автоматически пытается деобфусцировать XOR-, stack- и Base64-строки. Результат часто содержит IOC, которые strings просто не видит.

Что искать в выводе:
  • IP-адреса и домены - кандидаты на C2-серверы
  • Пути вида %APPDATA%\Microsoft\ - типичное расположение для persistence
  • Строки Mozilla/5.0 - кастомный User-Agent для HTTP-коммуникаций
  • Registry paths с CurrentVersion\Run - автозагрузка
  • Имена мьютексов - уникальный идентификатор для предотвращения двойного запуска
Ограничение: статический анализ не видит строки, которые формируются в рантайме. Если семпл расшифровывает конфигурацию C2 только после запуска - этот IOC останется скрытым до динамического этапа. И тут ничего не поделаешь - придётся запускать.

Распаковка и деобфускация: снимаем защитные слои​

Если DIE показал упаковщик - анализ импортов и строк бесполезен до распаковки. В русскоязычных руководствах обычно упоминают распаковку одной строкой. На практике это отдельный этап, занимающий от 5 минут до нескольких часов.

UPX - тривиальный случай. DIE определил UPX → upx -d sample.exe - и готово. Результат: чистый PE с восстановленной IAT. После распаковки повторяем полный цикл статического анализа вредоносного ПО - импорты, строки, энтропия секций.

Кастомный пакер - ручная распаковка в x64dbg. Большинство реальных семплов используют нестандартные упаковщики. Алгоритм:
  1. Загружаем семпл в x64dbg. Breakpoint на VirtualAlloc или VirtualProtect - точки, где пакер выделяет память под распакованный код.
  2. Запуск (F9). При срабатывании проверяем аргументы: если выделяется блок с правами PAGE_EXECUTE_READWRITE (0x40) - это целевой регион.
  3. Hardware breakpoint на запись в выделенный регион. Когда пакер закончит распаковку, breakpoint сработает в последний раз.
  4. Ищем переход на Original Entry Point (OEP): обычно jmp или push/ret на адрес вне секции пакера.
  5. На OEP дампим процесс через Scylla: Fix Dump → IAT Autosearch → Get Imports → Fix Dump.
Восстановление Import Address Table через Scylla - ключевой момент. Без корректной IAT дампнутый PE не загрузится в IDA Pro с правильными именами функций. Иногда импорты остаются неразрешёнными: пакер использовал GetProcAddress с хешами имён вместо строк - тогда приходится править руками, и это отдельное удовольствие.

Всё это - реализация техники Deobfuscate/Decode Files or Information (T1140, Defense Evasion): семпл расшифровывает собственный код в рантайме для обхода сигнатурных детекторов.

Когда ручная распаковка не работает: многослойная упаковка или виртуализирующие обфускаторы (Themida, VMProtect) превращают код в байткод кастомной VM. Тут эффективнее перейти к динамическому анализу и тупо снять дамп распакованного кода из памяти работающего процесса через Process Hacker или Volatility.

Динамический анализ малвари в изолированной среде

Статика дала структуру и гипотезы. Динамический анализ проверяет их запуском семпла и наблюдением за реальным поведением. Самый информативный этап - и самый зависимый от качества подготовки sandbox.

Конфигурация sandbox и обнаружение антианализа

Перед запуском: откат к чистому снэпшоту, запуск мониторинговых инструментов, старт FakeNet-NG.

Современная малварь проверяет, находится ли она в VM или под отладчиком. Техника System Checks (T1497.001, Defense Evasion / Discovery) реализуется через:
  • Registry: ключи HKLM\SOFTWARE\VMware, Inc.\VMware Tools, HKLM\SOFTWARE\Oracle\VirtualBox Guest Additions
  • CPUID: leaf 0x40000000 - гипервизор возвращает строку-идентификатор
  • MAC-адрес: первые три октета 00:0C:29 (VMware), 08:00:27 (VirtualBox)
  • Ресурсы системы: одно ядро и 2 ГБ RAM - признак песочницы
  • Запущенные процессы: wireshark.exe, procmon.exe, x64dbg.exe
  • API-проверки: IsDebuggerPresent(), флаг BeingDebugged в PEB, NtQueryInformationProcess
Как с этим бороться:

Плагин ScyllaHide в x64dbg скрывает отладчик от большинства стандартных проверок (PEB flags, timing checks). MAC-адрес меняется в настройках VM - избегайте OUI вендоров виртуализации. VMware Tools и VirtualBox Guest Additions удаляются перед анализом. Поставьте реалистичное количество ядер (4+), RAM (4+ ГБ) и «бытовой» софт: Chrome, Office, несколько документов на рабочем столе. Пустая система без единого файла - очевидная песочница, малварь это видит.

Ограничение: некоторые семплы проверяют не наличие VM, а отсутствие пользовательской активности - не запускаются, пока не обнаружат движение мыши или нажатие клавиш в течение определённого времени. Для таких случаев помогает скрипт AutoIt, имитирующий пользовательское поведение.

Поведенческий анализ вредоносного ПО: процессы, файлы, реестр​

Process Monitor запускаем с фильтром по имени процесса семпла. Process Hacker - для дерева процессов в реальном времени. Regshot - снимок реестра до и после.

Файловая активность. Стилер копирует себя в %APPDATA% или %TEMP%, создаёт конфигурационный файл, собирает данные из профилей браузеров (файлы Login Data, Cookies, Web Data в директориях Chrome и Firefox). В Process Monitor фильтруем: Operation = CreateFile, Path contains AppData.

Реестр. Автозагрузка через HKCU\Software\Microsoft\Windows\CurrentVersion\Run - простейший persistence. Regshot показывает разницу: новый ключ с путём к копии семпла.

Процессы - тут проявляется Process Hollowing (T1055.012). Семпл запускает легитимный процесс (svchost.exe, explorer.exe или notepad.exe) в suspended-состоянии через CreateProcess с флагом CREATE_SUSPENDED, затем подменяет его образ в памяти через последовательность Native API (T1106, Execution) вызовов: NtUnmapViewOfSectionVirtualAllocExWriteProcessMemorySetThreadContextResumeThread. В Process Hacker это выглядит как notepad.exe, который внезапно отправляет HTTP-запросы и читает файлы профиля браузера. Блокнот, который лезет в интернет - согласитесь, подозрительно.

Обнаружение hollowing: в Process Hacker открываем свойства подозрительного процесса → вкладка Memory → ищем регион с правами RWX. Легитимный notepad.exe не имеет RWX-регионов. Дополнительно сверяем image path в памяти с путём на диске - при hollowing они не совпадают.

Сбор системной информации - техника System Information Discovery (T1082, Discovery). Семпл запрашивает имя компьютера (GetComputerNameA), имя пользователя (GetUserNameA), версию ОС (GetVersionExA), список установленного софта. Эти данные уходят на C2 как часть начальной регистрации бота.

Сетевой анализ и идентификация C2-каналов

FakeNet-NG перехватывает DNS-запросы и HTTP/HTTPS-трафик. Wireshark пишет pcap для детального разбора.

DNS-запросы - первый сетевой IOC. Семпл резолвит домен C2: часто DGA-сгенерированное имя (случайные символы + .xyz/.top/.club) или скомпрометированный легитимный домен. FakeNet-NG отвечает на запрос, семпл продолжает работу - и мы видим протокол C2.

HTTP-трафик. Стилеры отправляют собранные данные POST-запросом (T1071.001, Web Protocols). В теле - Base64- или XOR-закодированный блоб с украденными credentials. URI часто содержит идентификатор кампании: /gate.php, /panel/upload.php, /api/submit. Exfiltration Over C2 Channel (T1041, Exfiltration): украденные данные и командный трафик идут по одному каналу - для защитников это упрощает детекцию.

Домены, IP-адреса, URI-паттерны, User-Agent - всё это сетевые IOC для firewall- и proxy-правил.

Реверс-инжиниринг малвари: от дизассемблера до понимания логики​

Динамика подтвердила поведение. Задача глубокого реверса - понять алгоритм шифрования, протокол C2, условия активации. Загружаем распакованный PE в IDA Pro или Ghidra (бесплатен, декомпилирует в псевдокод - для многих задач хватает за глаза). Для быстрого анализа из командной строки подходит radare2 (версия 6.1.5, активно развивается): r2 -A sample_unpacked.exe, затем afl для списка функций и pdf @ main для дизассемблирования.
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме


Ограничения глубокого реверса: на полный разбор сложного семпла уходит 8-40 часов. Виртуализирующие обфускаторы (Themida, VMProtect) требуют отдельной специализации - это кроличья нора, в которую можно провалиться надолго. В большинстве IR-сценариев достаточно поведенческого анализа и частичного реверса ключевых функций. Полный реверс оправдан при атрибуции, написании декриптора для ransomware или исследовании 0-day эксплоитов.

Формирование IOC и маппинг на MITRE ATT&CK​

Анализ вредоносного ПО - не самоцель. Его выход - actionable-данные для SOC, IR-команды и threat hunting.

Сводка техник MITRE ATT&CK:

ТехникаIDТактикаОбнаруженный артефакт
Software PackingT1027.002Defense EvasionКастомный пакер, энтропия секции >7.0
Deobfuscate/DecodeT1140Defense EvasionXOR-расшифровка строк и конфига в рантайме
System ChecksT1497.001Defense Evasion / DiscoveryПроверка CPUID, registry VMware/VBox, MAC
Process HollowingT1055.012Def. Evasion / Priv. Esc.Инжекция в svchost.exe через NtUnmapViewOfSection
Native APIT1106ExecutionПрямые вызовы ntdll вместо WinAPI
System Info DiscoveryT1082DiscoveryGetComputerNameA, GetVersionExA
Web ProtocolsT1071.001Command and ControlHTTP POST на /gate.php
Exfiltration Over C2T1041ExfiltrationДанные отправляются через C2-канал

YARA-правило на основе уникальных артефактов:
Код:
rule Infostealer_Sample {
    meta:
        description = "Based on manual analysis artifacts"
        author = "analyst"
    strings:
        $mutex = "Global\\AppMutex_7F3A" ascii
        $uri = "/gate.php" ascii
        $xor_loop = { 30 ?? 46 3B ?? 72 F8 }
        $hollowing = { 68 04 00 00 00 FF 15 }
    condition:
        uint16(0) == 0x5A4D and 2 of them
}
Правило комбинирует строковые IOC (мьютекс, URI) и байтовые паттерны (XOR-цикл, CreateProcess с флагом SUSPENDED). Порог - 2 из 4 - снижает false positives при детекции модифицированных вариантов семпла.

Доставка результатов: SHA256-хеш, сетевые IOC (домены, IP, URI), файловые IOC (пути, мьютексы), YARA-правило, ATT&CK-маппинг. Пакет уходит в SIEM (корреляция), на firewall/proxy (блокировка), в TIP (обогащение алертов).

Место в kill chain: анализ вредоносного ПО - сквозная активность. В incident response запускается после обнаружения артефакта (алерт EDR, подозрительный файл на хосте) и идёт параллельно с containment. В threat hunting - IOC из одного семпла расширяют scope поиска по всей инфраструктуре. Медианное время нахождения злоумышленника в сети - 11 дней (Mandiant M-Trends 2025). Каждый час качественного анализа сокращает это окно: IOC одного разобранного стилера позволяют обнаружить десятки связанных компрометаций до того, как атакующий достигнет конечной цели.

Я наблюдаю устойчивый тренд: IR-команды всё чаще полагаются на автоматизированные sandbox (ANY.RUN, Joe Sandbox, CrowdStrike Falcon Sandbox) и всё реже делают ручной реверс-инжиниринг малвари. Для 80% инцидентов автоматика справляется - sandbox выдаёт поведенческий отчёт с IOC за минуты. Но оставшиеся 20% - таргетированные атаки с кастомными протоколами C2, многослойным шифрованием, логическими бомбами - ломают любой автоматический конвейер. Именно здесь ручной разбор семпла от PE-заголовков до восстановления конфигурации становится единственным путём к пониманию. Проблема не в инструментах - проблема в навыке, который атрофируется без практики. Аналитик, который два года не открывал дизассемблер и не распаковывал семпл руками, не справится с APT-инструментом под давлением - а давление будет в 3 часа ночи, когда счёт идёт на часы. Автоматические отчёты sandbox - отправная точка, не финиш. Если в команде никто не может объяснить, зачем семпл вызывает NtUnmapViewOfSection перед WriteProcessMemory, - автоматизация ваш потолок, и однажды этого не хватит. Если хочешь повторить подобные шаги в контролируемой инфре - категория reverse на HackerLab.pro заточена под распаковку и анализ PE на задачах с нарастающей сложностью.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab