Первый в мире агентный реверс-инженер.
Оркестрация LLM для реверс-инжиниринга бинарных файлов
Большинство задач подчиняются линейной зависимости: чем сложнее задача, тем больше времени она обычно занимает. Реверс-инжиниринг (и бинарный анализ) — это задача, в которой фактическая сложность относительно тривиальна, но время выполнения может составлять часы (и даже дни!), даже для бинарного файла с парой сотен функций.
Kong автоматизирует механический слой, используя среду реверс-инжиниринга уровня АНБ. Kong может взять полностью обфусцированный, «раздетый» бинарный файл и выполнить полный конвейер анализа: триаж функций, построение контекста графа вызовов, восстановление типов и символов через управляемую LLM декомпиляцию и запись результатов обратно в базу программ Ghidra. Результатом является бинарный файл, где некий FUN_00401a30 теперь называется parse_http_header, с восстановленными структурами, именами параметров и соглашениями о вызовах.
Почему это существует
«Раздетые» бинарные файлы теряют весь контекст, который делает код читаемым: имена функций, информацию о типах, имена переменных, макеты структур. Восстановление этого контекста составляет основную часть работы в большинстве задач реверс-инжиниринга, и это во многом сопоставление с образцом: распознавание функций стандартных библиотек, вывод типов из использования, распространение имен по графам вызовов.
LLM отлично справляются именно с таким сопоставлением с образцом. Но нацеливание LLM на сырой вывод декомпилятора с вопросом «что это делает?» даёт посредственные результаты. Модели не хватает контекста вызовов, информации о перекрёстных ссылках и общей картины структуры бинарного файла. Кроме того, большинство обфусцированных бинарных файлов применяют экстремальные методы для предотвращения реверс-инжиниринга.
Kong решает эту проблему, создавая насыщенные контекстные окна на основе программного анализа Ghidra (графы вызовов, перекрёстные ссылки, ссылки на строки, поток данных) ещё до обращения к LLM, а затем организуя анализ в порядке зависимостей, чтобы каждая функция выигрывала от того, что её вызываемые уже именованы. Кроме того, Kong представляет собственный, первый в своём роде, агентный конвейер деобфускации.


Kong работает с большинством бинарных файлов, декомпилируемых Ghidra (на данный момент, в будущем их станет больше).
| C | C++ | Go | Rust | |
|---|---|---|---|---|
| x86 | Высокая | Высокая | Средняя | Средняя |
| x86-64 | Высокая | Высокая | Средняя | Средняя |
| ARM (32-bit) | Высокая | Высокая | Средняя | Низкая |
| AArch64 | Высокая | Высокая | Средняя | Низкая |
| MIPS | Средняя | Средняя | Низкая | Низкая |
| PowerPC | Средняя | Средняя | Низкая | Низкая |
Высокая: Kong надёжно декомпилирует, деобфусцирует и восстанавливает имена, типы и структуру.
Средняя: Декомпиляция пригодна к использованию, но более зашумлена. Ожидайте частичного восстановления и более низких оценок уверенности.
Низкая: Декомпиляция имеет значительные пробелы, и результаты останутся неполными, зашумлёнными или нечитаемыми.
Примечание: Размер бинарного файла положительно коррелирует с количеством функций, затратами на LLM и временем выполнения. Однако размер бинарного файла также отрицательно коррелирует с уверенностью, поэтому учитывайте это при анализе больших бинарных файлов.
Kong использует пятифазный конвейер, координируемый супервизором, который управляет триажем, параллельным анализом и постобработкой:
┌──────────────────────┐
│ Триаж │
│ перечислить, │
│ классифицировать, │
│ построить граф │
│ вызовов, │
│ сопоставить │
│ сигнатуры │
└──────────┬───────────┘
│
▼
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Анализ │ │ Анализ │ │ ... │
│ (листовые │ │ (следующий │ │ │
│ функции) │ │ уровень) │ │ │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────┬───────┴────────────────┘
│
▼
┌──────────────────────┐
│ Очистка │
│ нормализация, │
│ дедупликация │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Синтез │
│ унификация имён, │
│ сборка структур, │
│ деобфускация │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Экспорт │
│ analysis.json + │
│ обратная запись │
│ в Ghidra │
└──────────────────────┘
Триаж перечисляет все функции в бинарном файле, классифицирует их по размеру (тривиальные / маленькие / средние / большие), строит граф вызовов, определяет исходный язык и выполняет сопоставление сигнатур с известными функциями стандартных библиотек и криптографическими функциями. Функции, совпавшие по сигнатуре, помечаются как разрешённые и пропускают анализ LLM.
Анализ обрабатывает функции в порядке снизу вверх по графу вызовов, используя рабочую очередь. Для каждой функции Kong строит контекстное окно из базы программ Ghidra — декомпиляцию, перекрёстные ссылки, ссылки на строки и сигнатуры уже проанализированных вызываемых функций — нормализует вывод декомпилятора и отправляет его LLM для восстановления имён, типов и параметров. Если в декомпиляции функции обнаружена обфускация, Kong выполняет агентный проход деобфускации с доступом к символьным инструментам, прежде чем сформировать анализ. Результаты немедленно записываются обратно в Ghidra, чтобы нижестоящие вызывающие функции видели обновлённые имена.
Очистка унифицирует типы структур на основе предложений, накопленных во время анализа, и повторяет попытки применения тех сигнатур функций, которые не удалось применить во время аналитического прохода.
Синтез рассматривает глобальную картину всех проанализированных функций. Один вызов LLM проверяет наиболее связанные функции, унифицирует соглашения об именах, синтезирует определения структур из шаблонов доступа к полям и уточняет имена, которые выглядят непоследовательно в более широком контексте.
Экспорт записывает итоговый analysis.json и применяет все восстановленные имена, типы и сигнатуры обратно в базу программ Ghidra.
# 1. Установите Kong
uv pip install kong-re
# 2. Установите ваш(и) API-ключ(и)
export ANTHROPIC_API_KEY="sk-ant-..."
# и/или
export OPENAI_API_KEY="sk-..."
# 3. Запустите мастер настройки (только первый раз)
kong setup
# 4. Проанализируйте бинарный файл
kong analyze ./path/to/stripped_binary
Мастер настройки позволяет выбрать, какие LLM-провайдеры использовать, и устанавливает провайдера по умолчанию. Kong автоматически определяет установки Ghidra и JDK, загружает бинарный файл в экземпляр Ghidra внутри процесса и запускает полный конвейер.
git clone https://github.com/amruth-sn/kong.git
cd kong
uv sync
uv run kong setup
uv run kong analyze ./path/to/stripped_binary
| Переменная | Обязательная | Описание |
|---|---|---|
ANTHROPIC_API_KEY | Хотя бы одна | API-ключ Anthropic (Claude) |
OPENAI_API_KEY | Хотя бы одна | API-ключ OpenAI (GPT-4o) |
GHIDRA_INSTALL_DIR | Нет | Путь к установке Ghidra (автоопределяется, если не задан) |
JAVA_HOME | Нет | Путь к JDK (автоопределяется, если не задан) |
KONG_CONFIG_DIR | Нет | Переопределение каталога конфигурации (по умолчанию: ~/.config/kong) |
# Запустить мастер настройки
kong setup
# Проанализировать «раздетый» бинарный файл (использует настроенного провайдера по умолчанию)
kong analyze ./binary
# Анализ с конкретным провайдером
kong analyze ./binary --provider openai
# Переопределить модель
kong analyze ./binary --provider openai --model gpt-4o-mini
# Показать метаданные бинарного файла без анализа
kong info ./binary
# Оценить результаты анализа по эталонному исходному коду
kong eval ./analysis.json ./source.c
Результаты записываются в выходной каталог (по умолчанию: ./kong_output_{binary_name}/):
kong_output_{binary_name}/
├── analysis.json # Все восстановленные имена функций, типы, параметры
└── events.log # Трассировка выполнения конвейера
Kong автономно восстановил полную цепочку атаки XZ backdoor (CVE-2024-3094) из «раздетого» liblzma.so.5.4.1 — идентифицировав все пять ключевых функций импланта с уверенностью 90-95% за 15 минут при затратах $6.63.
См. BENCHMARKS.md для полного исследования и инструкций по воспроизведению.
kong/
├── __main__.py # Точка входа CLI (click)
├── config.py # KongConfig, LLMProvider, LLMConfig
├── db.py # Хранилище конфигурации SQLite (~/.config/kong/)
├── banner.py # ASCII баннер, помощники для API-ключей
├── agent/
│ ├── supervisor.py # Оркестратор конвейера
│ ├── triage.py # Перечисление функций + классификация
│ ├── analyzer.py # Анализ функций под управлением LLM
│ ├── queue.py # Рабочая очередь BFS на основе графа вызовов
│ ├── signatures.py # Сопоставление сигнатур известных функций
│ ├── prompts.py # Системный промпт + схема вывода
│ ├── events.py # Типы фаз/событий для трассировки конвейера
│ └── models.py # Dataclass FunctionResult
├── ghidra/
│ ├── client.py # GhidraClient внутри процесса (PyGhidra/JPype)
│ ├── types.py # FunctionInfo, BinaryInfo, XRef и т.д.
│ └── environment.py # Автоопределение Ghidra/JDK
├── llm/
│ ├── client.py # AnthropicClient
│ ├── openai_client.py # OpenAIClient
│ ├── usage.py # TokenUsage, отслеживание затрат, реестр цен
│ └── limits.py # Ограничения для конкретных моделей + ограничитель скорости
├── normalizer/
│ └── syntactic.py # Нормализация вывода декомпилятора
├── synthesis/
│ └── semantic.py # Глобальная унификация имён + синтез структур
├── evals/
│ ├── harness.py # Извлечение эталонных данных + оценка
│ └── metrics.py # symbol_accuracy, type_accuracy
├── export/
│ └── source.py # analysis.json + обратная запись в Ghidra
├── signatures/
│ ├── stdlib.json # Сигнатуры стандартной библиотеки C
│ └── crypto.json # Сигнатуры криптографических функций
└── tui/
└── app.py # Textual TUI
Kong лицензирован под Apache License 2.0. Kong — это бесплатный проект с открытым исходным кодом.
Эта лицензия совместима с лицензией Ghidra и допускает коммерческое использование.
Приветствуются сообщения об ошибках и запросы функций через GitHub Issues.
Особая благодарность проекту Shannon от KeygraphHQ, который послужил вдохновением для этого проекта. Мной двигало желание воспроизвести тот же конвейер, который Shannon использует для своего веб-инструмента пентеста, и адаптировать его для бинарного анализа и декомпиляции.
Бойся обезьяны.
Kong: Первый в мире AI реверс-инженер