
El primer agente de ingeniería inversa del mundo.
Orquestación de LLM para ingeniería inversa de binarios
La mayoría de las tareas siguen una relación lineal: cuanto más difícil es la tarea, más tiempo suele llevar. La ingeniería inversa (y el análisis de binarios) es una tarea en la que la dificultad real es algo trivial, pero el tiempo de ejecución puede ser del orden de horas (¡y días!), incluso para un binario con un par de cientos de funciones.
Kong automatiza la capa mecánica, utilizando un marco de ingeniería inversa de nivel NSA. Kong puede tomar un binario completamente ofuscado y sin símbolos y ejecutar un pipeline de análisis completo: clasificar funciones, construir contexto de grafo de llamadas, recuperar tipos y símbolos mediante descompilación guiada por LLM, y escribir los resultados de vuelta en la base de datos del programa de Ghidra. El resultado es un binario donde alguna FUN_00401a30 ahora es parse_http_header, con estructuras, nombres de parámetros y convenciones de llamada recuperados.
Por qué existe
Los binarios sin símbolos pierden todo el contexto que hace legible el código: nombres de funciones, información de tipos, nombres de variables, diseños de estructuras. Recuperar ese contexto es la mayor parte del trabajo en la mayoría de las tareas de RE, y es en gran medida coincidencia de patrones: reconocer funciones de la biblioteca estándar, inferir tipos a partir del uso, propagar nombres a través de los grafos de llamadas.
Los LLM son buenos exactamente en este tipo de coincidencia de patrones. Pero apuntar un LLM a la salida cruda del descompilador y preguntar "¿qué hace esto?" da resultados mediocres. Al modelo le falta contexto de llamadas, información de referencias cruzadas y la imagen más amplia de cómo está estructurado el binario. Además, la mayoría de los binarios ofuscados introducen técnicas extremas para prevenir la ingeniería inversa.
Kong resuelve esto creando ventanas de contexto enriquecidas a partir del análisis del programa de Ghidra (grafos de llamadas, referencias cruzadas, referencias a cadenas, flujo de datos) antes de tocar siquiera el LLM, luego orquesta el análisis en orden de dependencia para que cada función se beneficie de que sus llamadas ya estén nombradas. Adicionalmente, Kong introduce su propio pipeline de desofuscación autónomo, el primero de su tipo.
Kong funciona con la mayoría de los binarios descompilables por Ghidra (por ahora, más por venir).
Alta: Kong descompila, desofusca y recupera nombres, tipos y estructura de manera confiable.
Media: La descompilación es utilizable pero más ruidosa. Se espera recuperación parcial y puntuaciones de confianza más bajas.
Baja: La descompilación tiene lagunas significativas y los resultados permanecerán incompletos, ruidosos o ilegibles.
Nota: El tamaño del binario escala positivamente con el recuento de funciones, el costo de LLM y el tiempo de finalización. Sin embargo, el tamaño del binario también escala negativamente con la confianza, así que tenga esto en cuenta al analizar binarios más grandes.
Kong utiliza un pipeline de cinco fases orquestado por un supervisor que coordina la clasificación, el análisis paralelo y el postprocesamiento:
┌──────────────────────┐
│ Triage │
│ enumerate, classify,│
│ build call graph, │
│ match signatures │
└──────────┬───────────┘
│
▼
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Analyze │ │ Analyze │ │ ... │
│ (leaf fns) │ │ (next tier) │ │ │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────┬───────┴────────────────┘
│
▼
┌──────────────────────┐
│ Cleanup │
│ normalize, dedupe │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Synthesis │
│ unify names, build │
│ structs, deobfuscate│
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Export │
│ analysis.json + │
│ Ghidra writeback │
└──────────────────────┘
Triage enumera todas las funciones en el binario, las clasifica por tamaño (trivial / pequeña / mediana / grande), construye el grafo de llamadas, detecta el lenguaje fuente y ejecuta la coincidencia de firmas contra funciones conocidas de la biblioteca estándar y criptográficas. Las funciones que coinciden con la firma se marcan como resueltas y omiten el análisis de LLM por completo.
Analysis procesa las funciones en orden ascendente desde el grafo de llamadas utilizando una cola de trabajo. Para cada función, Kong construye una ventana de contexto a partir de la base de datos del programa de Ghidra — descompilación, referencias cruzadas, referencias a cadenas y las firmas de las funciones llamadas ya analizadas — normaliza la salida del descompilador y la envía al LLM para la recuperación de nombres, tipos y parámetros. Si se detecta ofuscación en la descompilación de una función, Kong ejecuta una pasada de desofuscación autónoma con acceso a herramientas simbólicas antes de producir el análisis. Los resultados se escriben de vuelta a Ghidra inmediatamente para que las funciones llamadoras posteriores vean los nombres actualizados.
Cleanup unifica los tipos de estructura a partir de las propuestas acumuladas durante el análisis y reintenta cualquier firma de función que no se haya podido aplicar durante la pasada de análisis.
Synthesis toma una visión global de todas las funciones analizadas. Una sola llamada de LLM revisa las funciones más conectadas, unifica las convenciones de nomenclatura, sintetiza definiciones de estructuras a partir de patrones de acceso a campos y refina los nombres que parecen inconsistentes en el contexto más amplio.
Export escribe el analysis.json final y aplica todos los nombres, tipos y firmas recuperados de vuelta a la base de datos del programa de Ghidra.
# 1. Instalar Kong
uv pip install kong-re
# 2. Establecer su(s) clave(s) API
export ANTHROPIC_API_KEY="sk-ant-..."
# y/o
export OPENAI_API_KEY="sk-..."
# 3. Ejecutar el asistente de configuración (solo la primera vez)
kong setup
# 4. Analizar un binario
kong analyze ./ruta/al/binario_sin_simbolos
El asistente de configuración le permite elegir qué proveedores de LLM usar y establece uno por defecto. Kong detecta automáticamente sus instalaciones de Ghidra y JDK, carga el binario en una instancia de Ghidra en proceso y ejecuta el pipeline completo.
git clone https://github.com/amruth-sn/kong.git
cd kong
uv sync
uv run kong setup
uv run kong analyze ./ruta/al/binario_sin_simbolos
# Ejecutar el asistente de configuración
kong setup
# Analizar un binario sin símbolos (usa el proveedor predeterminado configurado)
kong analyze ./binary
# Analizar con un proveedor específico
kong analyze ./binary --provider openai
# Sobrescribir el modelo
kong analyze ./binary --provider openai --model gpt-4o-mini
# Mostrar metadatos del binario sin ejecutar el análisis
kong info ./binary
# Evaluar la salida del análisis contra el código fuente de verdad fundamental
kong eval ./analysis.json ./source.c
Los resultados se escriben en el directorio de salida (por defecto: ./kong_output_{binary_name}/):
kong_output_{binary_name}/
├── analysis.json # Todos los nombres de funciones, tipos y parámetros recuperados
└── events.log # Traza de ejecución del pipeline
Kong reconstruyó autónomamente la cadena de eliminación completa del backdoor de XZ (CVE-2024-3094) a partir de un liblzma.so.5.4.1 sin símbolos — identificando las cinco funciones nucleares del implante con un 90-95% de confianza en 15 minutos por $6.63.
Consulte BENCHMARKS.md para el estudio de caso completo y las instrucciones de reproducción.
kong/
├── __main__.py # Punto de entrada de CLI (click)
├── config.py # KongConfig, LLMProvider, LLMConfig
├── db.py # Almacén de configuración SQLite (~/.config/kong/)
├── banner.py # Banner ASCII, ayudantes de clave API
├── agent/
│ ├── supervisor.py # Orquestador del pipeline
│ ├── triage.py # Enumeración + clasificación de funciones
│ ├── analyzer.py # Análisis de funciones guiado por LLM
│ ├── queue.py # Cola de trabajo BFS desde el grafo de llamadas
│ ├── signatures.py # Coincidencia de firmas de funciones conocidas
│ ├── prompts.py # Prompt del sistema + esquema de salida
│ ├── events.py # Tipos de fase/evento para el rastreo del pipeline
│ └── models.py # Dataclass FunctionResult
├── ghidra/
│ ├── client.py # GhidraClient en proceso (PyGhidra/JPype)
│ ├── types.py # FunctionInfo, BinaryInfo, XRef, etc.
│ └── environment.py # Detección automática de Ghidra/JDK
├── llm/
│ ├── client.py # AnthropicClient
│ ├── openai_client.py # OpenAIClient
│ ├── usage.py # TokenUsage, seguimiento de costos, registro de precios
│ └── limits.py # Límites específicos del modelo + limitador de tasa
├── normalizer/
│ └── syntactic.py # Normalización de salida del descompilador
├── synthesis/
│ └── semantic.py # Unificación global de nombres + síntesis de estructuras
├── evals/
│ ├── harness.py # Extracción + puntuación de verdad fundamental
│ └── metrics.py # symbol_accuracy, type_accuracy
├── export/
│ └── source.py # analysis.json + escritura en Ghidra
├── signatures/
│ ├── stdlib.json # Firmas de la biblioteca estándar de C
│ └── crypto.json # Firmas de funciones criptográficas
└── tui/
└── app.py # TUI Textual
Kong está licenciado bajo la Licencia Apache 2.0. Kong es un proyecto gratuito y de código abierto.
Esta licencia es compatible con la licencia de Ghidra y permite uso comercial.
Las incidencias y solicitudes de funciones son bienvenidas a través de GitHub Issues.
Además, no dude en contactarme en X o LinkedIn!
Un gran agradecimiento al proyecto Shannon de KeygraphHQ, que proporcionó la inspiración para este proyecto. Mi motivación fue replicar el mismo tipo de pipeline que Shannon utiliza para su herramienta de pruebas de penetración basada en web, y adaptarlo para el análisis de binarios y la descompilación.
Teme al mono.
Kong: El primer ingeniero inverso de IA del mundo
| C | C++ | Go | Rust |
|---|
| x86 | Alta | Alta | Media | Media |
| x86-64 | Alta | Alta | Media | Media |
| ARM (32-bit) | Alta | Alta | Media | Baja |
| AArch64 | Alta | Alta | Media | Baja |
| MIPS | Media | Media | Baja | Baja |
| PowerPC | Media | Media | Baja | Baja |
| Variable | Requerida | Descripción |
|---|
ANTHROPIC_API_KEY | Al menos una | Clave API de Anthropic (Claude) |
OPENAI_API_KEY | Al menos una | Clave API de OpenAI (GPT-4o) |
GHIDRA_INSTALL_DIR | No | Ruta a la instalación de Ghidra (detección automática si no se establece) |
JAVA_HOME | No | Ruta al JDK (detección automática si no se establece) |
KONG_CONFIG_DIR | No | Sobrescribe el directorio de configuración (por defecto: ~/.config/kong) |