
Статический движок триажа вредоносного ПО на Go: вычисляет хеши файлов, извлекает строки и IOC, разбирает PE/ELF/Mach-O/APK, оценивает возможности и формирует отчёты в форматах JSON, YARA, Sigma, STIX и PDF.
Движок статического анализа вредоносного ПО — без внешних зависимостей, без cgo, статическая компоновка
Репозиторий: https://github.com/Masriyan/FlatScan
FlatScan — это готовый к промышленной эксплуатации движок статического анализа и отчётности по вредоносному ПО, написанный на чистом Go. Он предназначен для аналитиков, которым нужны быстрая сортировка, извлечение IOC, обнаружение подозрительных возможностей, отчётность для руководства и передача правил охоты — и всё это без запуска образца.
FlatScan читает файл, вычисляет его хеш, определяет формат, извлекает строки, декодирует подозрительные закодированные данные, извлекает и сортирует IOC, анализирует метаданные исполняемых файлов и контейнеров, оценивает находки, обогащает их в профиль вредоносного ПО и формирует выводы в форматах text, JSON, PDF, HTML, IOC, YARA, Sigma, STIX 2.1, базы данных кейсов и пакетов отчётов.
У сортировки вредоносного ПО часто бывает две аудитории:
| Аудитория | Что нужно |
|---|---|
| Специалисты по безопасности | Технические доказательства: хеши, строки, импорты, IOC, энтропия, секции, декодированные данные, TTP, правила охоты |
| CISO / руководство | Контекст риска: что это вероятно такое, почему это важно, влияние на бизнес, рекомендуемые действия |
FlatScan обслуживает обе. Он выполняет статический анализ ради безопасности и скорости, а затем преобразует результат как в машиночитаемый вывод, так и в отчётность, готовую для руководства.
graph LR
A[Malware Sample] --> B[FlatScan Engine]
B --> C[Analyst Reports]
B --> D[Executive Reports]
B --> E[Machine-Readable]
B --> F[Hunting Rules]
C -->|HTML, Full Text| G[SOC Team]
D -->|PDF, Executive MD| H[CISO / Board]
E -->|JSON, STIX 2.1| I[SIEM / SOAR]
F -->|YARA, Sigma| J[EDR / Hunt Team]
FlatScan построен как многоэтапный конвейер анализа с параллельным выполнением, системой плагинов и без внешних зависимостей — go.mod ничего не требует, а чистый Go-движок дизассемблирования встроен в дерево исходников как internal/x86asm (немодифицированная копия golang.org/x/arch/x86/x86asm, BSD-3-Clause). Без cgo, без зависимостей времени выполнения или системных зависимостей, для сборки сеть не требуется.
graph TB
subgraph "Input Layer"
CLI[CLI Parser] --> CFG[Config]
INT[Interactive Mode] --> CFG
SHL[Shell Mode] --> CFG
WCH[Watch Mode] --> CFG
end
subgraph "I/O Layer"
CFG --> MMP{File > 100MB?}
MMP -->|Yes| MMAP[Memory-Mapped I/O]
MMP -->|No| BUF[Buffered Read]
MMAP --> DATA[Raw Bytes + Hashes]
BUF --> DATA
end
subgraph "Analysis Pipeline"
DATA --> DET[File Type Detection]
DET --> ENT[Entropy Analysis]
ENT --> STR[String Extraction]
STR --> IOC[IOC Extraction]
IOC --> DEC[Decoder Pass]
DEC --> CRP[Corpus Build]
CRP --> PAT[Pattern Matching]
PAT --> PG["Parallel Group"]
subgraph PG["⚡ Parallel Stages"]
FMT[Format Analysis]
CRV[Safe Carving]
CRY[Crypto/Config]
SIM[Similarity Hash]
end
PG --> SEQ[Sequential Stages]
SEQ --> PLG[Plugin Engine]
PLG --> SCR[Risk Scoring]
end
subgraph "Output Layer"
SCR --> TXT[Text Report]
SCR --> JSN[JSON]
SCR --> PDF[PDF Report]
SCR --> HTM[HTML Report]
SCR --> YAR[YARA Rule]
SCR --> SIG[Sigma Rule]
SCR --> STX[STIX 2.1]
SCR --> RPK[Report Pack]
end
style PG fill:#1a1a2e,stroke:#e94560,stroke-width:2px
style SCR fill:#0f3460,stroke:#e94560,stroke-width:2px
| Принцип | Реализация |
|---|---|
| Ноль внешних зависимостей | go.mod ничего не требует, и go.sum отсутствует. Стандартная библиотека Go плюс один вендоренный, неизменённый пакет — internal/x86asm, копия golang.org/x/arch/x86/x86asm (BSD-3-Clause, движок дизассемблирования), хранимая в дереве проекта, чтобы сборка не требовала загрузки и сети. Без cgo, без нативных библиотек, без зависимостей времени выполнения |
| Только статический анализ | Никогда не выполняет образец — читает байты и метаданные |
| Потокобезопасность | parallelRun() с находками, защищёнными мьютексом, проверено детектором гонок. Этапы анализа индивидуально перехватывают паники, поэтому один повреждённый образец не может прервать пакетную обработку |
| Кроссплатформенность | Сборка для Linux, macOS, Windows; mmap в Linux с прозрачным запасным вариантом |
| Расширяемость | Интерфейс плагинов + JSON-манифесты для пользовательских детекций без перекомпиляции |
| Проверка | Результат |
|---|---|
go build / go vet / gofmt -l | Чисто |
go test ./... | 189 тестов (344 случая, включая подтесты), все проходят |
go test -race ./... | Чисто |
go test -cover ./... | 50.6% операторов |
golangci-lint run | 0 проблем (errcheck, govet, staticcheck, gosec, errorlint, ineffassign, unused, bodyclose, nilerr, misspell, unconvert, wastedassign) |
govulncheck ./... | Уязвимостей не найдено |
Тестовая среда. Проверено на Fedora Linux 44 (x86_64, ядро 7.1.7) с Go 1.26.5. Минимальная
версия в go.mod — Go 1.25. CI дополнительно запускает тот же набор тестов на ubuntu-latest.
Linux — единственная платформа, на которой измерены эти результаты: macOS и Windows
являются поддерживаемыми целями, и код кросс-компилируется для них, но приведённые выше цифры
там независимо не воспроизводились, а mmap_linux.go по своей конструкции
только для Linux (на других платформах используется запасной вариант с буферизованным чтением).
Движок обрабатывает файлы через 18 этапов с параллельным выполнением независимых операций: