IBM X-Force Threat Intelligence Index 2025 фиксирует: infostealers вышли на первое место - 32% всех обнаруженных вредоносных программ в 2024 году, обогнав ransomware. На недавнем IR-кейсе мне достался свежий стилер: запакованный PE, XOR-шифрованные строки, process hollowing для инжекции в легитимный процесс, HTTP-канал на C2. Набор знакомый, но автоматический sandbox не вытащил конфигурацию - пришлось препарировать руками. Этот материал - та самая последовательность шагов, которую я прохожу на каждом семпле: от первого хеша до готовых IOC и YARA-правила. Не перечисление инструментов, а decision tree: что смотрим, почему, и когда переключаемся между методами.
Требования к окружению
Прежде чем открыть первый файл - о железе и изоляции. Ошибка на этом этапе стоит компрометации рабочей станции.Аппаратные требования:
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| RAM | 8 ГБ (одна VM) | 16-32 ГБ (параллельная работа: статика + динамика) |
| CPU | 4 ядра, VT-x/AMD-V | 8+ ядер |
| Диск | 100 ГБ SSD | 256+ ГБ 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.
Статический анализ вредоносного ПО: от хеша до структуры
Статический анализ - исследование файла без запуска. Безопасен, даёт первичную картину за 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- автозагрузка - Имена мьютексов - уникальный идентификатор для предотвращения двойного запуска
Распаковка и деобфускация: снимаем защитные слои
Если DIE показал упаковщик - анализ импортов и строк бесполезен до распаковки. В русскоязычных руководствах обычно упоминают распаковку одной строкой. На практике это отдельный этап, занимающий от 5 минут до нескольких часов.UPX - тривиальный случай. DIE определил UPX →
upx -d sample.exe - и готово. Результат: чистый PE с восстановленной IAT. После распаковки повторяем полный цикл статического анализа вредоносного ПО - импорты, строки, энтропия секций.Кастомный пакер - ручная распаковка в x64dbg. Большинство реальных семплов используют нестандартные упаковщики. Алгоритм:
- Загружаем семпл в x64dbg. Breakpoint на
VirtualAllocилиVirtualProtect- точки, где пакер выделяет память под распакованный код. - Запуск (F9). При срабатывании проверяем аргументы: если выделяется блок с правами
PAGE_EXECUTE_READWRITE(0x40) - это целевой регион. - Hardware breakpoint на запись в выделенный регион. Когда пакер закончит распаковку, breakpoint сработает в последний раз.
- Ищем переход на Original Entry Point (OEP): обычно
jmpилиpush/retна адрес вне секции пакера. - На OEP дампим процесс через Scylla: Fix Dump → IAT Autosearch → Get Imports → Fix Dump.
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) вызовов: NtUnmapViewOfSection → VirtualAllocEx → WriteProcessMemory → SetThreadContext → ResumeThread. В 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 Packing | T1027.002 | Defense Evasion | Кастомный пакер, энтропия секции >7.0 |
| Deobfuscate/Decode | T1140 | Defense Evasion | XOR-расшифровка строк и конфига в рантайме |
| System Checks | T1497.001 | Defense Evasion / Discovery | Проверка CPUID, registry VMware/VBox, MAC |
| Process Hollowing | T1055.012 | Def. Evasion / Priv. Esc. | Инжекция в svchost.exe через NtUnmapViewOfSection |
| Native API | T1106 | Execution | Прямые вызовы ntdll вместо WinAPI |
| System Info Discovery | T1082 | Discovery | GetComputerNameA, GetVersionExA |
| Web Protocols | T1071.001 | Command and Control | HTTP POST на /gate.php |
| Exfiltration Over C2 | T1041 | Exfiltration | Данные отправляются через 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
}
Доставка результатов: 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 на задачах с нарастающей сложностью.