PowerShell-скрипт для статического анализа бинарных файлов без использования внешних модулей и инструментов.
Анализатор автоматически определяет тип файла, собирает базовую информацию, вычисляет хэши, анализирует байтовую структуру, ищет сигнатуры, строки, признаки упаковки/шифрования и другие характеристики бинарника.
Важно: скрипт выполняет статический анализ файла и не запускает исследуемый бинарник.
Скрипт выполняет несколько групп проверок:
- базовая информация о файле;
- размер и временные метки;
- расширение файла;
- MD5;
- SHA-1;
- SHA-256;
- CRC32;
- HEX-preview начала и конца файла;
- ASCII-preview;
- поиск magic/signature;
- анализ PE-файлов;
- определение архитектуры PE;
- анализ секций PE;
- entropy секций;
- определение PE characteristics;
- определение DLL characteristics;
- анализ Data Directories;
- поиск Rich Header;
- обнаружение PE overlay;
- поиск ASCII-строк;
- поиск Unicode-строк;
- определение ELF;
- определение Mach-O;
- статистический анализ данных;
- оценка энтропии;
- arithmetic mean;
- chi-square;
- serial correlation;
- Monte Carlo estimation of Pi;
- поиск известных криптографических констант;
- эвристический анализ повторяющегося XOR;
- попытка определения размера XOR-ключа;
- CRC32-анализ.
Некоторые результаты являются эвристическими и сами по себе не доказывают наличие шифрования, упаковщика, обфускации или вредоносной активности.
- Windows PowerShell 5.1 или совместимый PowerShell;
- дополнительные модули не требуются;
- дополнительные утилиты не требуются;
- права администратора обычно не нужны.
Скрипт рассчитан на работу с произвольными бинарными файлами, а не только с .exe или .dll.
Перейдите в каталог со скриптом:
cd C:\Path\To\AnalyzerРазрешите выполнение скрипта только для текущего PowerShell-сеанса:
Set-ExecutionPolicy -Scope Process Bypass -ForceЗапустите анализ:
.\analyze.ps1 .\file.nameНапример:
.\analyze.ps1 .\sample.exeили:
.\analyze.ps1 .\library.dllМожно передать абсолютный путь:
.\analyze.ps1 "C:\Samples\sample.exe"Путь с пробелами необходимо заключать в кавычки.
Скрипт принимает один основной аргумент:
.\analyze.ps1 <Path>
Path — путь к анализируемому файлу.
Если аргумент не указан, используется значение по умолчанию:
.\real.dll
То есть:
.\analyze.ps1эквивалентно попытке проанализировать:
.\real.dll
Set-ExecutionPolicy -Scope Process Bypass -Force
.\analyze.ps1 .\sample.exeПосле запуска результаты выводятся непосредственно в консоль.
Программа отображает анализ отдельными этапами:
[1] BASIC FILE INFO
------------------------------------------------------------
[2] HASHES
------------------------------------------------------------
[3] HEX / ASCII PREVIEW
------------------------------------------------------------
Нумерация последующих этапов зависит от версии скрипта и количества выполняемых анализов.
Выводится:
- полный путь;
- размер в байтах;
- размер в MiB;
- время создания в UTC;
- время изменения в UTC;
- расширение файла.
Рассчитываются:
MD5
SHA1
SHA256
CRC32
Пример:
MD5 : ...
SHA1 : ...
SHA256 : ...
CRC32 : ...
Хэши удобно использовать для идентификации файла и последующего сравнения с другими образцами.
Показываются первые 64 байта в HEX и первые 128 байт в ASCII.
Также отображаются последние 64 байта файла.
Это позволяет быстро заметить:
- известную сигнатуру файла;
- текстовые заголовки;
- мусор/обфускацию;
- данные в конце файла;
- возможный overlay.
Проверяются сигнатуры различных форматов.
В частности, поддерживается обнаружение таких форматов, как:
- PE/DOS (
MZ); - ELF;
- Mach-O;
- Java Class;
- WebAssembly;
- ZIP;
- GZIP;
- BZIP2;
- 7-Zip;
- RAR;
- XZ;
- ZSTD;
- LZ4;
- CAB;
- OLE/Compound File;
- PDF;
- SQLite;
- PNG;
- JPEG;
- GIF;
- BMP;
- ICO;
- RIFF;
- MP3;
- FLAC;
- OGG;
- MP4/MOV;
- TTF;
- OTF;
- и другие.
Наличие magic bytes не гарантирует, что файл является корректным экземпляром соответствующего формата.
Для Windows PE-файлов анализатор извлекает информацию из PE-заголовков.
Определяются:
- PE offset;
- архитектура;
- количество секций;
- timestamp;
- PE32 / PE32+;
- Entry Point;
- Image Base;
- Subsystem;
- DLL Characteristics;
- PE Characteristics;
- размер образа;
- размер заголовков;
- checksum;
- Data Directories;
- таблица секций;
- entropy каждой секции.
Поддерживаются основные архитектуры PE, включая:
x86
x64 / AMD64
ARM
ARM64
ARMNT
IA64
MIPS
SH3
SH4
M68K
и другие
Для каждой секции собираются данные:
Name
VirtualSize
VirtualAddress
SizeOfRawData
PointerToRawData
Characteristics
Entropy
Entropy особенно полезна при первичном анализе упаковки и высокоэнтропийных областей.
Однако:
высокая entropy не означает автоматически наличие шифрования или упаковщика.
Сжатые данные, изображения, архивы и другие обычные бинарные данные также могут обладать высокой entropy.
Скрипт содержит список известных имен секций, связанных с различными упаковщиками и протекторами.
Например:
UPX0
UPX1
UPX2
.aspack
.adata
.vmp0
.vmp1
.vmp2
.themida
MPRESS1
MPRESS2
.enigma1
.enigma2
.obsidium
.petite
Совпадение имени секции следует рассматривать как индикатор, а не как доказательство использования конкретного packer/protector.
Для PE-файлов выполняется поиск Rich header.
Это может быть полезно при исследовании происхождения PE-файла и инструментов, использовавшихся при его сборке.
Анализатор также проверяет наличие данных после логической структуры PE-файла.
Overlay может встречаться в легитимных программах, установщиках, самораспаковывающихся файлах и других форматах, поэтому сам факт его наличия не является признаком вредоносности.
Ищутся последовательности печатных ASCII-символов.
Минимальная длина строки по умолчанию:
5 символов
Для найденных строк отображаются:
Offset
Length
String
Также выполняется поиск UTF-16LE-подобных строк.
Это особенно полезно для Windows-бинарников, где текстовые строки часто представлены в Unicode.
Для ELF-файлов анализируются основные поля заголовка:
ELF32 / ELF64
Little-endian / Big-endian
OS ABI
File Type
Machine
Поддерживается определение распространённых архитектур:
x86
x86-64
ARM
AArch64
MIPS
PowerPC
PowerPC64
RISC-V
Для Mach-O определяется:
- 32/64-bit;
- порядок байтов;
- CPU architecture;
- тип файла;
- количество load commands.
Поддерживаются распространённые варианты:
x86
x86-64
ARM
ARM64
Анализатор вычисляет ряд статистических характеристик байтового потока.
Шенноновская entropy:
H = -Σ p(x) log2(p(x))
Высокое значение может встречаться у:
- сжатых данных;
- зашифрованных данных;
- упакованных файлов;
- случайноподобных данных.
Вычисляется среднее значение байтов.
Вычисляется χ²-статистика распределения байтов.
Оценивается корреляция между соседними байтами.
Выполняется Monte Carlo-оценка числа π на основе байтового потока.
Эти статистические показатели являются вспомогательными и предназначены для первичного анализа структуры данных.
Скрипт содержит статический поиск известных констант и таблиц, связанных с криптографическими алгоритмами.
В частности проверяются сигнатуры, связанные с:
AES
MD5
SHA-1
SHA-256
SHA-512
CRC32
Blowfish
TEA / XTEA
ChaCha20
Salsa20
Base64
RC4-like lookup tables
Важно учитывать, что наличие конкретной константы в бинарнике не доказывает, что алгоритм действительно используется в рабочем коде.
Например, таблица AES может находиться:
- в библиотеке;
- в мёртвом коде;
- в другом компоненте программы;
- как часть тестов;
- в данных, которые не имеют отношения к криптографии.
Для данных выполняется эвристический анализ повторяющегося XOR.
Сначала скрипт пытается определить вероятные размеры ключа, после чего может подобрать байты ключа по доле печатных символов.
Проверяемый диапазон размера ключа:
2–40 байт
Для анализа используются первые данные файла с ограничением размера выборки.
Результат является эвристикой и не гарантирует, что найденный ключ является реальным XOR-ключом.
Анализатор предназначен прежде всего для первичного статического исследования.
Он не является полноценной заменой:
- IDA;
- Ghidra;
- Binary Ninja;
- x64dbg;
- WinDbg;
- специализированным PE/ELF/Mach-O анализаторам;
- sandbox/динамическому анализу.
Скрипт не выполняет полноценную:
- дизассемблизацию;
- декомпиляцию;
- эмуляцию;
- трассировку выполнения;
- динамический анализ API;
- поведенческий анализ процесса.
Полученные результаты необходимо интерпретировать в контексте конкретного файла.
Анализируемый файл не запускается самим скриптом — он открывается как набор байтов для чтения и анализа.
Тем не менее рекомендуется соблюдать стандартные меры предосторожности при работе с неизвестными файлами:
- не запускать исследуемый файл;
- использовать отдельную VM при анализе потенциально вредоносных образцов;
- не открывать подозрительные документы обычными приложениями;
- не подключать ненужные сетевые ресурсы к среде анализа.
Само изменение:
Set-ExecutionPolicy -Scope Process Bypass -Forceдействует только для текущего PowerShell-процесса и не изменяет постоянную политику выполнения PowerShell в системе.
Минимальный вариант:
Set-ExecutionPolicy -Scope Process Bypass -Force
.\analyze.ps1 .\file.nameДля .exe:
Set-ExecutionPolicy -Scope Process Bypass -Force
.\analyze.ps1 .\sample.exeДля .dll:
Set-ExecutionPolicy -Scope Process Bypass -Force
.\analyze.ps1 .\sample.dllДля файла по абсолютному пути:
Set-ExecutionPolicy -Scope Process Bypass -Force
.\analyze.ps1 "C:\Samples\unknown.bin"analyzer/
├── analyze.ps1
└── README.md
Запуск из каталога проекта:
Set-ExecutionPolicy -Scope Process Bypass -Force
.\analyze.ps1 .\file.nameЕсли для проекта ещё не выбрана лицензия, этот раздел можно заменить на нужную лицензию, например MIT.