
Reversecore_MCP v3.0.3
Un servidor MCP con prioridad en seguridad que permite a los agentes de IA realizar ingeniería inversa automatizada, análisis de malware, forense, investigación de vulnerabilidades y SAST, impulsado por Radare2, YARA, LIEF, Capstone y más.
Reversecore MCP
Ingeniería inversa y análisis de seguridad potenciados por IA mediante el Protocolo de Contexto de Modelo
Un servidor MCP que permite a asistentes de IA como Claude y Cursor realizar ingeniería inversa, análisis de malware, investigación de vulnerabilidades, informática forense digital y auditoría de código fuente mediante lenguaje natural.
Tabla de Contenidos
- What is Reversecore MCP?
- Architecture
- Tool Catalog (120 Tools)
- Guided Analysis Prompts (22 Modes)
- MCP Resources (11 URIs)
- Quick Start
- Connect to Your AI Client
- Configuration
- Security Model
- Development
- CI/CD Pipeline
- Docker Build Architecture
- System Requirements
- Project Structure
- Error Handling
- Adding New Tools
- Contributing
- Documentation
- License
¿Qué es Reversecore MCP?
Reversecore MCP es un servidor del Model Context Protocol que envuelve 120 herramientas de análisis en una única interfaz que los asistentes de IA pueden invocar mediante lenguaje natural.
En lugar de aprender la sintaxis de línea de comandos de una docena de herramientas diferentes, describes lo que quieres:``` "Decompile the main function of this malware sample, extract all network IOCs, map the behavior to MITRE ATT&CK, and generate a triage report."
El asistente de IA divide esto en llamadas a herramientas:```
r2_decompile("sample.exe", "main")
→ extract_iocs("sample.exe")
→ add_mitre_technique(technique_id="T1071.001", ...)
→ create_analysis_report(template_type="quick_triage")
| Dominio | Qué puedes hacer |
|---|---|
| Análisis estático | Desensamblado, descompilación (r2ghidra), análisis binario (LIEF), detección de empaquetadores (DIE), detección de capacidades (CAPA), extracción de cadenas, escaneo de firmware (binwalk) |
| Dinámico y simbólico | Emulación ESIL, ejecución simbólica con angr, análisis de manchas, generación de harnesses de fuzzing |
| Análisis de malware | Extracción de IOC, escaneo YARA, detección de backdoors latentes, generación adaptativa de vacunas, búsqueda autónoma de vulnerabilidades |
| Investigación de vulnerabilidades | Detección de API peligrosas, descubrimiento de gadgets ROP, análisis de explotación de heap, triaje de crashes, generación de PoC |
| Informática forense digital | Forense de memoria (Volatility3), análisis de PCAP (Scapy), forense de discos (Sleuth Kit), correlación de artefactos |
| Auditoría de código fuente | Escaneo de AST de Python, escaneo de patrones regex C/C++ |
| Informes | Informes basados en sesiones con mapeo MITRE ATT&CK, generación de reglas SIGMA, informes VEX, envío por correo electrónico |
Arquitectura```
AI Client (Claude / Cursor / any MCP-compatible client) │ MCP Protocol (stdio or HTTP/SSE) ▼ ┌──────────────────────────────────────────────────────┐ │ FastMCP 3.4.4 Server │ │ 120 registered tools · Fully async │ │ Python 3.10–3.12 │ ├────────────────────┬─────────────────────────────────┤ │ Guided Prompts │ Dynamic Resources │ │ (22 analysis │ (11 URI-based: per-binary │ │ modes) │ strings, IOCs, ASM, CFG, …) │ ├────────────────────┴─────────────────────────────────┤ │ Core Infrastructure │ │ Config · Security · Validators · Exceptions (17) │ │ R2 Pool · Metrics · Memory (SQLite) · Task Queue │ │ MITRE Mapper · Evidence Engine · Resilience Layer │ │ Arch Registry (x86/ARM/MIPS/RISC-V/PPC) │ │ Result Cache (SHA256) · Analysis Cache (Redis+SQL) │ │ SAST (Python AST + C/C++ Regex) · Plugin System │ ├──────────────────────────────────────────────────────┤ │ Analysis Engines │ │ Radare2 6.0.4 │ YARA 4.3.1 · LIEF · Capstone │ │ r2ghidra │ CAPA · angr · Qiling │ │ Volatility3 · Scapy│ DIE · Binwalk · Sleuth Kit │ │ pwntools · ROPgadget│ Keystone (assembler) │ └──────────────────────────────────────────────────────┘
### Core Infrastructure (37 modules)
The `reversecore_mcp/core/` directory contains the shared infrastructure that all tools build on:
| Module | Purpose |
|---|---|
| `config.py` | Pydantic BaseSettings con 34+ variables de entorno |
| `security.py` | Saneamiento de entrada, validación de argumentos de comando |
| `validators.py` | Validación de rutas de archivos y binarios con mitigación TOCTOU, resolución de enlaces simbólicos |
| `r2_pool.py` | Pool de conexiones Radare2 seguro para subprocesos con tamaño configurable |
| `r2_helpers.py` | Análisis estructurado de salida de Radare2 |
| `metrics.py` | Tiempos de ejecución por herramienta, contadores de llamadas, tasas de error, estadísticas de caché |
| `memory.py` | Almacén de memoria de IA basado en SQLite asíncrono para persistir hallazgos de análisis entre sesiones |
| `mitre_mapper.py` | Motor de mapeo de IDs de técnicas MITRE ATT&CK |
| `evidence.py` | Sistema de clasificación de evidencia: `OBSERVED`, `INFERRED`, `POSSIBLE` |
| `resilience.py` | Patrones de decorador de reintento, circuit-breaker y timeout |
| `task_queue.py` | Cola de tareas en segundo plano mediante Redis + arq |
| `extension_registry.py` | Registro de plugins y gestión del ciclo de vida |
| `arch_registry.py` | Mapeo multiarquitectura (x86, x86_64, ARM32, ARM64, MIPS, RISC-V, PPC → r2 arch/bits/registers) |
| `result_cache.py` | Decorador de caché de resultados de herramientas basado en SHA256 (`@cache_tool_result`) |
| `analysis_cache.py` | Caché de descompilación multinivel (L1: Redis, L2: SQLite) |
| `result.py` | Modelos Pydantic `ToolSuccess` / `ToolError` |
| `exceptions.py` | 17 clases de excepción con códigos de error `RCMCP-E*` |
| `decorators.py` | `@log_execution`, `@track_metrics` |
| `error_handling.py` | Decorador `@handle_tool_errors` |
| `error_formatting.py` | Formato estructurado de respuestas de error |
| `execution.py` | Ejecución segura de subprocesos con timeout y límites de salida |
| `command_spec.py` | Especificación de comandos para llamadas a subprocesos |
| `loader.py` | Cargador dinámico de módulos de herramientas |
| `plugin.py` | Clase base de plugin |
| `extension.py` | Clase base de extensión |
| `container.py` | Soporte de ejecución en contenedor/sandbox |
| `audit.py` | Registro de auditoría |
| `binary_cache.py` | Caché de archivos binarios |
| `json_utils.py` | Serialización JSON mediante orjson (3-5x más rápido que el json de la stdlib) |
| `logging_config.py` | Registro estructurado basado en Loguru |
| `report_generator.py` | Motor de renderizado de informes (Markdown, PDF vía xhtml2pdf) |
| `resource_manager.py` | Gestión del ciclo de vida de recursos MCP |
| `sast/python_ast_scanner.py` | Escáner de vulnerabilidades basado en AST de Python |
| `sast/regex_scanner.py` | Escáner de vulnerabilidades basado en expresiones regulares para C/C++ |
| `sast/rule_manager.py` | Carga y gestión de reglas SAST |
---
## Tool Catalog (120 Tools)
Every tool returns a structured `ToolResult` — either a `ToolSuccess` with typed `data` or a `ToolError` with an `RCMCP-E*` error code. Tools are organized into 8 plugins.
---
### 🔍 Static Analysis Plugin (24 tools)
| # | Tool | Backend | Description |
|---|---|---|---|
| 1 | `run_strings` | `strings` CLI | Extracción de cadenas ASCII/Unicode con longitud mínima configurable |
| 2 | `run_binwalk` | Binwalk | Escaneo profundo de firmware para firmas y sistemas de archivos embebidos |
| 3 | `run_binwalk_extract` | Binwalk | Extraer archivos embebidos descubiertos por binwalk |
| 4 | `parse_binary_with_lief` | LIEF | Análisis completo de cabeceras PE/ELF/Mach-O, secciones, import/export y TLS |
| 5 | `detect_packer` | DIE | Detección rápida de empaquetadores/compiladores |
| 6 | `detect_packer_deep` | DIE (`diec`) | Análisis profundo de empaquetadores/protectores mediante Detect It Easy |
| 7 | `run_capa` | CAPA (Mandiant FLARE) | Detección de capacidades — "encrypts data", "creates persistence", etc. |
| 8 | `run_capa_quick` | CAPA | Escaneo rápido de capacidades con un subconjunto de reglas |
| 9 | `generate_signature` | Radare2 | Generar firmas binarias para identificación |
| 10 | `generate_yara_rule` | Radare2 + YARA | Generar reglas de detección YARA a partir de patrones binarios |
| 11 | `generate_advanced_yara_rule` | Radare2 + YARA | Reglas YARA avanzadas con indicadores de comportamiento |
| 12 | `scan_for_versions` | LIEF + strings | Escanear binarios en busca de cadenas de versión embebidas |
| 13 | `extract_rtti_info` | Radare2 | Extraer RTTI de C++ (Run-Time Type Information) |
| 14 | `diff_binaries` | Radare2 | Diff binario semántico entre dos versiones de archivos |
| 15 | `analyze_variant_changes` | Radare2 | Analizar cambios entre variantes de binarios |
| 16 | `match_libraries` | Radare2 | Identificar bibliotecas enlazadas estáticamente mediante huella de funciones |
| 17 | `patch_diff_1day` | Radare2 + heurísticas | Análisis automatizado de patch diff para investigación de vulnerabilidades 1-day |
| 18 | `analyze_patch_diff_auto` | Radare2 + inferencia | Inferencia automatizada de vulnerabilidades de parches |
| 19 | `emulate_binary` | Radare2 ESIL | Emulación de código con seguimiento de registros/memoria |
| 20 | `generate_fuzzing_harness` | Qiling + AFL++ | Generar un harness de fuzzing dirigido a una función específica |
| 21 | `run_fuzzing_campaign` | AFL++ | Ejecutar una campaña completa de fuzzing con recopilación de crashes |
| 22 | `triage_crash` | GDB | Análisis de crashes y evaluación de explotabilidad |
| 23 | `verify_path_and_get_args` | angr | Ejecución simbólica — demostrar alcanzabilidad de rutas y calcular entradas concretas |
| 24 | `taint_trace` | Radare2 + angr | Análisis de flujo de datos (taint) desde fuentes hasta sumideros |
---
### 🔐 Source Code Audit Plugin (1 tool)
| # | Tool | Backend | Description |
|---|---|---|---|
| 25 | `audit_source_code` | AST + Regex | Escaneo AST de Python + escaneo regex de C/C++ para patrones peligrosos |
---
### 🛠️ Common Utilities Plugin (20 tools)
**File Operations (5 tools)**
| # | Tool | Description |
|---|---|---|
| 26 | `run_file` | Identificación del tipo de archivo, arquitectura y compilador |
| 27 | `copy_to_workspace` | Copiar un archivo al espacio de trabajo de análisis |
| 28 | `create_directory` | Crear un directorio en el espacio de trabajo |
| 29 | `list_workspace` | Listar todos los archivos del espacio de trabajo |
| 30 | `scan_workspace` | Escaneo completo del espacio de trabajo con metadatos de archivos |
**Patch Explanation (1 tool)**
| # | Tool | Description |
|---|---|---|
| 31 | `explain_patch` | Explicar un parche binario en lenguaje natural |
**Assembler (1 tool)**
| # | Tool | Backend | Description |
|---|---|---|---|
| 32 | `assemble_instructions` | Keystone | Ensamblar instrucciones a código máquina (x86, ARM, MIPS, etc.) |
**AI Memory Management (11 tools)**
These tools let the AI persist and recall findings across analysis sessions using an async SQLite database:
| # | Tool | Description |
|---|---|---|
| 33 | `create_memory_session` | Iniciar una nueva sesión de memoria para un análisis |
| 34 | `store_analysis_finding` | Persistir un hallazgo de análisis con etiquetas |
| 35 | `query_analysis_memories` | Buscar hallazgos previos mediante consulta |
| 36 | `get_binary_analysis_context` | Recuperar todo el contexto de un binario específico |
| 37 | `tag_analysis_session` | Añadir etiquetas a una sesión para organización |
| 38 | `search_memories_by_tag` | Encontrar sesiones/hallazgos por etiqueta |
| 39 | `delete_analysis_session` | Eliminar una sesión y sus hallazgos |
| 40 | `cleanup_expired_sessions` | Eliminar sesiones más antiguas que un umbral |
| 41 | `list_analysis_sessions` | Listar todas las sesiones activas |
| 42 | `export_memory_store` | Exportar todas las memorias a un formato portátil |
| 43 | `import_memory_store` | Importar memorias desde un archivo de exportación |
**Server Monitoring (2 tools)**
| # | Tool | Description |
|---|---|---|
| 44 | `get_server_health` | Tiempo de actividad, uso de memoria, herramientas cargadas, versión de Python |
| 45 | `get_tool_metrics` | Contadores de llamadas por herramienta, tiempos medios de ejecución, tasas de error, aciertos/fallos de caché |
---
### ⚙️ Radare2 & r2ghidra Plugin (30 tools)
All Radare2 tools use a thread-safe connection pool (`r2_pool.py`) that automatically manages r2pipe sessions.
| # | Tool | Description |
|---|---|---|
| 46 | `Radare2_open_file` | Abrir un archivo binario en Radare2 |
| 47 | `Radare2_close_file` | Cerrar una sesión de Radare2 |
| 48 | `Radare2_list_open_files` | Listar archivos actualmente abiertos |
| 49 | `Radare2_analyze_binary` | Ejecutar análisis automático completo (`aaa`) |
| 50 | `Radare2_list_functions` | Listar todas las funciones detectadas |
| 51 | `Radare2_disassemble_function` | Desensamblar una función específica |
| 52 | `Radare2_disassemble_address` | Desensamblar en una dirección específica |
| 53 | `Radare2_decompile_function` | Descompilar mediante r2ghidra (motor Ghidra integrado en r2, sin necesidad de JVM) |
| 54 | `Radare2_list_exports` | Listar símbolos exportados |
| 55 | `Radare2_list_imports` | Listar funciones importadas |
| 56 | `Radare2_list_sections` | Listar secciones del binario con entropía |
| 57 | `Radare2_list_strings` | Listar cadenas encontradas en el binario |
| 58 | `Radare2_find_cross_references` | Rastrear llamadas a funciones y referencias a datos |
| 59 | `Radare2_search_bytes` | Buscar patrones de bytes en el binario |
| 60 | `Radare2_get_binary_info` | Obtener metadatos del binario (arquitectura, formato, endianness) |
| 61 | `Radare2_execute_command` | Ejecutar un comando Radare2 sin procesar |
| 62 | `Radare2_esil_emulate` | Emulación ESIL en una dirección específica |
| 63 | `Radare2_get_hexdump` | Volcado hexadecimal en una dirección virtual |
| 64 | `Radare2_get_cfg_data` | Extraer datos del grafo de flujo de control |
| 65 | `Radare2_generate_cfg_png` | Generar CFG como imagen PNG |
| 66 | `Radare2_generate_callgraph` | Generar grafo de llamadas de funciones |
| 67 | `Radare2_recover_structures` | Recuperar automáticamente structs de C y persistirlos en la base de datos de anotaciones |
| 68 | `Radare2_decompile_with_r2ghidra` | Descompilación C de alta calidad con caché |
| 69 | `Radare2_annotate_binary` | Añadir anotaciones al binario |
| 70 | `Radare2_get_annotations` | Recuperar anotaciones |
| 71 | `Radare2_export_annotations` | Exportar anotaciones a un archivo |
| 72 | `Radare2_import_annotations` | Importar anotaciones desde un archivo |
| 73 | `Radare2_detect_crypto_constants` | Detectar constantes criptográficas (AES S-box, etc.) |
| 74 | `Radare2_find_gadgets` | Encontrar gadgets ROP/JOP |
| 75 | `Radare2_calculate_entropy` | Calcular entropía por sección |
---
### 🦠 Malware Analysis Plugin (9 tools)
| # | Tool | Backend | Description |
|---|---|---|---|
| 76 | `dormant_detector` | Radare2 + heurísticas | Encontrar backdoors ocultos, funciones huérfanas, bombas de tiempo y bombas lógicas |
| 77 | `adaptive_vaccine` | YARA + Radare2 | Generar reglas YARA de detección + parches binarios para neutralizar amenazas |
| 78 | `vulnerability_hunter` | Radare2 + análisis | Detectar patrones de API peligrosos (strcpy, sprintf) y cadenas de gadgets ROP |
| 79 | `extract_iocs` | Regex + LIEF | Extraer IPs, URLs, dominios, hashes, claves de registro y direcciones de criptomonedas |
| 80 | `run_yara` | YARA | Escanear con archivos de reglas personalizados y conjuntos de reglas integrados |
| 81 | `generate_poc_exploit` | pwntools | Generar código de exploit de prueba de concepto |
| 82 | `build_rop_chain` | ROPgadget + pwntools | Construcción automatizada de cadenas ROP |
| 83 | `autonomous_vuln_hunt` | Radare2 + angr | Pipeline autónomo de búsqueda de vulnerabilidades |
| 84 | `analyze_heap_exploit` | Radare2 + heurísticas | Análisis de explotación de heap (UAF, double-free, overflow) |
---
### 🕵️ Digital Forensics Plugin (22 tools)
**Memory Forensics (6 tools)**
| # | Tool | Backend | Description |
|---|---|---|---|
| 85 | `memory_analyze` | Volatility3 | Análisis completo de volcados de memoria |
| 86 | `memory_list_processes` | Volatility3 | Listar procesos en ejecución desde el volcado de memoria |
| 87 | `memory_detect_injections` | Volatility3 | Detectar inyección de código en la memoria de procesos |
| 88 | `memory_extract_strings` | Volatility3 | Extraer cadenas de la memoria de procesos |
| 89 | `memory_dump_module` | Volatility3 | Volcar un módulo cargado desde la memoria |
| 90 | `memory_list_symbols` | Volatility3 | Listar símbolos desde la memoria |
**Disk Forensics (6 tools)**
| # | Tool | Backend | Description |
|---|---|---|---|
| 91 | `disk_list_partition` | Sleuth Kit | Listar particiones de disco |
| 92 | `disk_list_files` | Sleuth Kit | Listar archivos en una imagen de disco |
| 93 | `disk_recover_deleted` | Sleuth Kit | Recuperar archivos eliminados |
| 94 | `disk_analyze_mft` | Sleuth Kit | Analizar la Master File Table de NTFS |
| 95 | `disk_extract_file` | Sleuth Kit | Extraer un archivo de la imagen de disco |
| 96 | `disk_hash_verify` | Sleuth Kit | Verificar la integridad de archivos mediante hash |
**Network Forensics (5 tools)**
| # | Tool | Backend | Description |
|---|---|---|---|
| 97 | `pcap_analyze` | Scapy | Análisis de PCAP: desglose de protocolos, anomalías |
| 98 | `pcap_list_connections` | Scapy | Listar todas las conexiones de red |
| 99 | `pcap_extract_dns` | Scapy | Extraer consultas y respuestas DNS |
| 100 | `pcap_extract_c2` | Scapy | Identificar comunicación C2 potencial |
| 101 | `pcap_reconstruct_stream` | Scapy | Reconstruir flujos TCP |
**Artifact Analysis (5 tools)**
| # | Tool | Backend | Description |
|---|---|---|---|
| 102 | `artifact_collect` | Parsers personalizados | Recopilar historial del navegador, colmenas de registro, registros de eventos y prefetch |
| 103 | `artifact_correlate_ioc` | Parsers personalizados | Correlacionar artefactos con IOCs conocidos |
| 104 | `artifact_generate_yara` | YARA | Generar reglas YARA a partir de patrones de artefactos |
| 105 | `artifact_timeline` | Parsers personalizados | Construir línea de tiempo a partir de múltiples fuentes de artefactos |
| 106 | `artifact_report` | Parsers personalizados | Generar informe de análisis de artefactos |
---
### 📝 Report Generation Plugin (14 tools)
| # | Tool | Description |
|---|---|---|
| 107 | `get_system_time` | Obtener la marca de tiempo del servidor (evita que la IA alucine fechas) |
| 108 | `set_timezone` | Establecer la zona horaria para los informes |
| 109 | `get_timezone_info` | Obtener información de la zona horaria actual |
| 110 | `start_report_session` | Iniciar una sesión de análisis cronometrada con ID único |
| 111 | `end_report_session` | Finalizar la sesión: calcular duración, bloquear listas de IOC/ATT&CK |
| 112 | `get_report_session_status` | Comprobar el estado de la sesión |
| 113 | `list_report_sessions` | Listar todas las sesiones activas/completadas |
| 114 | `add_ioc` | Recopilar y etiquetar IOCs durante una sesión en vivo |
| 115 | `add_analysis_note` | Añadir notas categorizadas (hallazgo, advertencia, comportamiento) |
| 116 | `add_mitre_technique` | Documentar IDs de técnicas MITRE ATT&CK |
| 117 | `set_severity` | Establecer la severidad de la sesión (baja/media/alta/crítica) |
| 118 | `create_analysis_report` | Renderizar informe en 4 modos: `full_analysis`, `quick_triage`, `ioc_summary`, `executive_brief` |
| 119 | `generate_vex_report` | Generar un informe VEX (Vulnerability Exploitability eXchange) |
| 120 | `generate_sigma_rule` | Generar reglas de detección SIGMA |
---
## Guided Analysis Prompts (22 Modes)
Prompts are pre-built analysis workflows that prime the AI with a structured persona, step-by-step tool usage sequences, and evidence classification rules. You activate them by referencing the prompt name in your AI client.
### Malware Analysis (9 prompts)
| Prompt | Use Case |
|---|---|
| `full_analysis_mode` | Análisis integral en 6 fases: triage → desensamblado → comportamiento → red → persistencia → informe |
| `malware_analysis_mode` | Análisis de malware enfocado con clasificación de amenazas |
| `basic_analysis_mode` | Triage rápido para evaluación inicial y veredictos rápidos |
| `apt_hunting_mode` | Búsqueda específica de APT: movimiento lateral, persistencia, exfiltración de datos |
| `malware_defense_mode` | Orientado a la defensa: generar reglas de detección y mitigaciones |
| `unpacking_mode` | Analizar y evadir empaquetado/ofuscación (Themida, VMProtect, UPX) |
| `c2_extraction_mode` | Extraer y analizar infraestructura de comunicación C2 |
| `ransomware_triage_mode` | Triage específico de ransomware: análisis de cifrado, evaluación de recuperación de claves |
| `code_similarity_mode` | Comparar binarios para similitud de código y linaje compartido |
### Security Research (6 prompts)
| Prompt | Use Case |
|---|---|
| `vulnerability_research_mode` | Caza de bugs: desbordamientos de búfer, UAF, inyección de comandos |
| `crypto_analysis_mode` | Análisis de implementaciones criptográficas y detección de debilidades |
| `firmware_analysis_mode` | Firmware IoT/embebido: extracción con binwalk, cadenas UART, credenciales hardcodeadas |
| `patch_analysis_mode` | Análisis de parches de seguridad y pruebas de regresión |
| `source_code_audit_mode` | Auditoría de seguridad de código fuente (Python, C, C++) |
| `autonomous_vuln_hunt_mode` | Pipeline autónomo de búsqueda de vulnerabilidades |
### CVE Research & Exploit Development (5 prompts)
| Prompt | Use Case |
|---|---|
| `taint_analysis_mode` | Análisis de flujo de datos (taint): descubrimiento automatizado de rutas fuente→sumidero |
| `heap_exploit_mode` | Análisis de explotación de heap y generación de PoC |
| `fuzzing_mode` | Configuración de campañas de fuzzing y triage de crashes |
| `patch_diff_auto_mode` | Patch diff automatizado para investigación de vulnerabilidades 1-day |
| `cve_discovery_pipeline_mode` | Pipeline completo de descubrimiento de CVE: desde patch diff hasta exploit funcional |
### Other (2 prompts)
| Prompt | Use Case |
|---|---|
| `game_analysis_mode` | Análisis de clientes de juegos: detección de anti-cheat, RE de protocolos, inspección de memoria |
| `report_generation_mode` | Flujo de trabajo de sesión estructurado con mapeo de técnicas MITRE ATT&CK |
> **How prompts work:** Each prompt primes the AI with a structured analysis persona. It includes Chain-of-Thought reasoning checkpoints (where the AI must stop and evaluate before proceeding) and evidence classification rules that prevent the AI from stating speculation as fact. Every finding must be labeled as `OBSERVED` (directly verified), `INFERRED` (logically derived from static analysis), or `POSSIBLE` (requires further verification).
---
## MCP Resources (11 URIs)
Resources are read-only data endpoints that AI clients can access through URI templates. They complement tools by providing structured data without requiring explicit tool calls.
### Static Resources
| URI | Description |
|---|---|
| `reversecore://guide` | Guía de uso de herramientas con reglas de rutas de archivos y mejores prácticas |
| `reversecore://guide/structures` | Guía técnica de recuperación de estructuras y análisis de referencias cruzadas |
| `reversecore://tools` | Documentación completa de las 120 herramientas registradas |
| `reversecore://logs` | Registros de la aplicación (últimas 100 líneas) |
### Dynamic Resources (Per-Binary Virtual Filesystem)
These URIs resolve per-binary and invoke the corresponding analysis tools on demand:
| URI Template | Description |
|---|---|
| `reversecore://{filename}/strings` | Extraer todas las cadenas de un binario |
| `reversecore://{filename}/iocs` | Extraer IOCs (IPs, URLs, correos electrónicos, hashes) |
| `reversecore://{filename}/func/{address}/code` | Código pseudo-C descompilado para una función |
| `reversecore://{filename}/func/{address}/asm` | Desensamblado de una función |
| `reversecore://{filename}/func/{address}/cfg` | Grafo de flujo de control en formato Mermaid |
| `reversecore://{filename}/functions` | Lista de todas las funciones del binario |
| `reversecore://{filename}/dormant_detector` | Resultados del análisis de Dormant detector |
---
## Quick Start
### Option 1 — PyPI (Simplest)```bash
pip install reversecore-mcp
reversecore-mcp
Requisitos previos: Radare2 debe estar instalado en tu sistema (
r2 --version). YARA se instala automáticamente medianteyara-python.
Opción 2 — Docker (Recomendada para Funcionalidad Completa)
Todos los motores de análisis (Radare2, r2ghidra, YARA, Binwalk, Sleuth Kit, GDB, etc.) vienen preinstalados:```bash
docker run -i --rm
-v /path/to/your/samples:/app/workspace
-e REVERSECORE_WORKSPACE=/app/workspace
-e MCP_TRANSPORT=stdio
ghcr.io/sjkim1127/reversecore_mcp:latest
### Opción 3 — Compilar desde el código fuente (Docker Compose)```bash
git clone https://github.com/sjkim1127/Reversecore_MCP.git
cd Reversecore_MCP
./scripts/run-docker.sh # auto-detects Intel / Apple Silicon
O manualmente:```bash docker compose --profile x86 up -d # Intel/AMD docker compose --profile arm64 up -d # Apple Silicon (M1/M2/M3)
### Opción 4 — Python (Desarrollo Local)```bash
git clone https://github.com/sjkim1127/Reversecore_MCP.git
cd Reversecore_MCP
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python -m reversecore_mcp.server
Requisitos previos para el modo local: Radare2 debe estar instalado en tu sistema (
r2 --version). Los backends de herramientas individuales (YARA, LIEF, Capstone, etc.) se instalan mediante pip. Para soporte forense completo, también necesitarás Volatility3, Scapy y Sleuth Kit.
Conéctate a tu cliente de IA
Añade la configuración del servidor a los ajustes de tu cliente IDE (p. ej., ~/.cursor/mcp.json o claude_desktop_config.json).
⚡ Opción 1: Modo Docker Exec (Recomendado)
Si tienes el contenedor en ejecución mediante Docker Compose, este modo canaliza stdio directamente hacia el contenedor en ejecución. Cero latencia de arranque, memoria persistente y disponibilidad completa de herramientas.```json { "mcpServers": { "Reversecore_MCP": { "command": "docker", "args": [ "exec", "-i", "-e", "MCP_TRANSPORT=stdio", "reversecore-mcp-arm64", "python", "-m", "reversecore_mcp.server" ] } } }
> Reemplaza `reversecore-mcp-arm64` por `reversecore-mcp` si estás en Intel/AMD.
---
### 🌐 Opción 2: Modo HTTP SSE
Para transmisión por red (Server-Sent Events):```json
{
"mcpServers": {
"Reversecore_MCP": {
"url": "http://localhost:8000/mcp/sse"
}
}
}
📦 Opción 3: Modo Stdio (Docker bajo demanda)
Ejecuta un contenedor nuevo y aislado para cada sesión:
🍎 macOS
```json { "mcpServers": { "reversecore": { "command": "docker", "args": [ "run", "-i", "--rm", "-v", "/Users/YOUR_USERNAME/samples:/app/workspace", "-e", "REVERSECORE_WORKSPACE=/app/workspace", "-e", "MCP_TRANSPORT=stdio", "ghcr.io/sjkim1127/reversecore_mcp:latest" ] } } } ```🐧 Linux
```json { "mcpServers": { "reversecore": { "command": "docker", "args": [ "run", "-i", "--rm", "-v", "/home/YOUR_USERNAME/samples:/app/workspace", "-e", "REVERSECORE_WORKSPACE=/app/workspace", "-e", "MCP_TRANSPORT=stdio", "ghcr.io/sjkim1127/reversecore_mcp:latest" ] } } } ```🪟 Windows
```json { "mcpServers": { "reversecore": { "command": "docker", "args": [ "run", "-i", "--rm", "-v", "C:/samples:/app/workspace", "-e", "REVERSECORE_WORKSPACE=/app/workspace", "-e", "MCP_TRANSPORT=stdio", "ghcr.io/sjkim1127/reversecore_mcp:latest" ] } } } ```⚠️ Importante — Rutas de archivos dentro de Docker
Tu carpeta local está montada en
/app/workspacedentro del contenedor. Siempre haz referencia a los archivos solo por su nombre, no por tu ruta completa local.
❌ Incorrecto ✅ Correcto r2_decompile("/Users/john/samples/mal.exe")r2_decompile("mal.exe")
Configuración
Todos los ajustes se pueden proporcionar mediante variables de entorno o un archivo .env (consulta .env.example). Los ajustes se gestionan mediante Pydantic BaseSettings con el prefijo REVERSECORE_.
Ajustes principales
| Variable | Predeterminado | Descripción |
|---|---|---|
MCP_TRANSPORT | stdio | Modo de transporte: stdio o http |
REVERSECORE_WORKSPACE | ./ (cwd) | Directorio del espacio de trabajo de análisis |
REVERSECORE_READ_DIRS | "" | Lista separada por comas de directorios adicionales de solo lectura |
REVERSECORE_STRICT_PATHS | false | Generar errores para rutas faltantes en lugar de advertencias |
REVERSECORE_STRUCTURED_ERRORS | false | Habilitar respuestas de error estructuradas con códigos de error |
REVERSECORE_DEFAULT_TOOL_TIMEOUT | 120 | Tiempo de espera predeterminado de ejecución de herramientas en segundos |
REVERSECORE_MAX_OUTPUT_SIZE | 10000000 | Tamaño máximo de salida para herramientas (bytes) |
Ajustes del modo HTTP
| Variable | Predeterminado | Descripción |
|---|---|---|
MCP_HOST | 0.0.0.0 | Interfaz de host a la que vincularse (se ajusta automáticamente a 127.0.0.1 si no hay clave API) |
MCP_PORT | 8000 | Puerto para el servidor HTTP |
MCP_API_KEY | (sin definir) | Clave API para autenticación HTTP (X-API-Key o Authorization: Bearer) |
REVERSECORE_RATE_LIMIT | 60 | Máximo de solicitudes por minuto (solo modo HTTP, mediante slowapi) |
MAX_UPLOAD_SIZE | 100000000 | Tamaño máximo de subida (100 MB por defecto) |
FILE_RETENTION_MINUTES | 1440 | Período de retención de archivos subidos (24 h por defecto) |
Ajustes de Radare2
| Variable | Predeterminado | Descripción |
|---|---|---|
REVERSECORE_R2_POOL_SIZE | 3 | Número de conexiones Radare2 en el grupo |
REVERSECORE_R2_POOL_TIMEOUT | 30 | Tiempo de espera para adquirir una conexión del grupo |
REVERSECORE_R2_EXTENSIONS | "" | Lista separada por comas de clases de extensión r2 (module:ClassName) |
REVERSECORE_GHIDRA_MAX_PROJECTS | 3 | Máximo de proyectos en caché del descompilador r2ghidra |
REVERSECORE_GHIDRA_EXTENSIONS | "" | Lista separada por comas de clases de extensión Ghidra |
MAX_EMULATION_INSTRUCTIONS | 1000 | Máximo de instrucciones de emulación ESIL |
Ajustes de sandbox
| Variable | Predeterminado | Descripción |
|---|---|---|
REVERSECORE_SANDBOX_ENABLED | false | Habilitar ejecución en sandbox para herramientas de análisis dinámico |
REVERSECORE_SANDBOX_MODE | auto | Modo sandbox: auto, host, container, disabled |
REVERSECORE_SANDBOX_DOCKER_IMAGE | reversecore-sandbox:latest | Imagen Docker para ejecución en sandbox |
REVERSECORE_SANDBOX_CPU_LIMIT | 1.0 | Límite de núcleos de CPU para contenedores sandbox |
REVERSECORE_SANDBOX_MEMORY_LIMIT | 512m | Límite de memoria para contenedores sandbox |
REVERSECORE_SANDBOX_PIDS_LIMIT | 100 | Límite de PID para contenedores sandbox |
REVERSECORE_SANDBOX_USER | nobody | Usuario no root para ejecución en sandbox |
Almacenamiento y cola
| Variable | Predeterminado | Descripción |
|---|---|---|
REDIS_URL | redis://localhost:6379/0 | URL de Redis para la cola de tareas y el almacenamiento en caché de resultados |
MEMORY_DB_PATH | ~/.reversecore_mcp/memory.db | Ruta a la base de datos SQLite de memoria de IA |
REVERSECORE_LIEF_MAX_FILE_SIZE | 1000000000 | Tamaño máximo de archivo para el análisis LIEF (1 GB) |
Registro
| Variable | Predeterminado | Descripción |
|---|---|---|
LOG_LEVEL | INFO | Verbosidad del registro: DEBUG, INFO, WARNING, ERROR |
LOG_FILE | <tempdir>/reversecore/app.log | Ruta al archivo de registro |
LOG_FORMAT | human | Formato de registro: human (legible) o json (estructurado) |
Plugins y SAST
| Variable | Predeterminado | Descripción |
|---|---|---|
REVERSECORE_PLUGIN_DIRS | "" | Directorios separados por comas para buscar plugins de extensión |
REVERSECORE_SAST_RULES_PATH | "" | Ruta al archivo de reglas SAST YAML personalizado |
Modelo de seguridad
La seguridad se implementa como defensa en profundidad, con protecciones en múltiples capas:
Seguridad de entrada y rutas
| Control | Implementación |
|---|---|
| Sin inyección de shell | Todas las llamadas a subprocesos usan argumentos de lista, nunca cadenas de shell (execution.py) |
| Prevención de path traversal | validate_file_path() y validate_binary_path() resuelven enlaces simbólicos y confinan el acceso al espacio de trabajo (validators.py) |
| Mitigación TOCTOU | El indicador bypass_cache=True revalida las rutas para prevenir condiciones de carrera |
| Sanitización de entrada | Todos los parámetros se sanitizan antes de la ejecución (security.py) |
| Protección CSRF | Los formularios del panel requieren validación CSRF basada en tokens (dashboard/__init__.py) |
Red y autenticación
| Control | Implementación |
|---|---|
| Autenticación segura contra ataques de temporización | secrets.compare_digest() para comparación de claves API (web/auth.py) |
| Vectores de autenticación restringidos | Solo se aceptan las cabeceras X-API-Key y Authorization: Bearer; sin parámetros de consulta ni cookies |
| Respaldo limitado a loopback | Sin MCP_API_KEY, el acceso HTTP se restringe a 127.0.0.1 (web/middleware.py) |
| Limitación de velocidad | Límites configurables por minuto mediante slowapi |
| Cabeceras de seguridad | HSTS, X-Content-Type-Options, X-Frame-Options, CSP en todas las respuestas HTTP (web/middleware.py) |
/health minimizado | El endpoint público devuelve solo {"status": "alive"}; los detalles tras la autenticación (web/endpoints.py) |
Contenedor y runtime
| Control | Implementación |
|---|---|
| Ejecución no root | Se ejecuta como appuser (UID 1000) con capacidades mínimas |
| Límites de recursos | Docker Compose aplica límites de CPU (2.0) y memoria (4 GB) |
| Aislamiento sandbox | Sandboxing opcional basado en contenedores para herramientas de análisis dinámico |
Puertas de seguridad en CI/CD
| Control | Implementación |
|---|---|
| Escaneo de secretos | Gitleaks se ejecuta en cada commit (hook de pre-commit + CI) |
| SAST | Bandit escanea todo el código Python en cada commit |
| CodeQL | Análisis estático de GitHub CodeQL en cada push a main |
| Auditoría de dependencias | pip-audit en cada push — sin CVEs sin revisar |
| Escaneo de contenedores | Trivy escanea imágenes Docker en busca de vulnerabilidades (de LOW a CRITICAL) |
| Puerta de seguridad de exploits | Plantillas POC escaneadas con Bandit; fuzzing DAST con Hypothesis; aislamiento de contenedores verificado |
Manejo estructurado de errores
Las 17 clases de excepción llevan códigos de error RCMCP-E* para manejo programático. Consulta Manejo de errores para la jerarquía completa.
Desarrollo
Preparación```bash
git clone https://github.com/sjkim1127/Reversecore_MCP.git cd Reversecore_MCP python -m venv venv && source venv/bin/activate pip install -r requirements.txt pip install -r requirements-dev.txt pre-commit install # installs Ruff, Bandit, Gitleaks hooks
### Pruebas```bash
# Full test suite with coverage report
pytest tests/ -v
# Unit tests only (fast, no external dependencies)
pytest tests/unit/ -v
# Integration tests (requires Docker)
pytest tests/integration/ -v
# Run with coverage threshold enforcement
pytest tests/unit/ --cov=reversecore_mcp --cov-fail-under=80
# Run a specific test
pytest tests/unit/test_cli_tools.py::TestRunFile::test_success -v
# Security boundary tests
pytest tests/ -m security -v
# Benchmarks
pytest tests/ -m benchmark -v
Estado de las pruebas:
- ✅ 1,957 pruebas unitarias superadas en Python 3.10 / 3.11 / 3.12
- 📊 87% de cobertura de código (mínimo del 80% exigido en CI)
- 🔒 Cero hallazgos de Bandit
- ⚡ Suite de pruebas totalmente asíncrona mediante
pytest-asyncio
Marcadores de pruebas:
| Marcador | Propósito |
|---|---|
@pytest.mark.unit | Pruebas unitarias rápidas |
@pytest.mark.integration | Pruebas que requieren Docker o herramientas externas |
@pytest.mark.slow | Pruebas de larga duración |
@pytest.mark.benchmark | Benchmarks de rendimiento |
@pytest.mark.security | Pruebas de validación de límites de seguridad |
Calidad del código```bash
ruff check reversecore_mcp/ # Lint (E, W, F, I, B, C4, UP rules) ruff format reversecore_mcp/ # Format mypy reversecore_mcp/ # Type check (0 errors across 108 files) bandit -r reversecore_mcp/ # Security scan (all severities) pip-audit # Dependency CVE scan
### Hooks de pre-commit
Los siguientes hooks se ejecutan automáticamente en cada commit:
1. **Ruff** — lint con auto-corrección + comprobación de formato
2. **trailing-whitespace** — elimina los espacios en blanco al final
3. **end-of-file-fixer** — garantiza que los archivos terminen con una nueva línea
4. **check-yaml / check-json** — valida la sintaxis de YAML/JSON
5. **check-added-large-files** — bloquea archivos de más de 1 MB
6. **check-merge-conflict** — detecta marcadores de merge sin resolver
7. **detect-private-key** — evita commits accidentales de claves
8. **Bandit** — escaneo de seguridad de Python
---
## Pipeline de CI/CD
Cada push a `main` activa 11 trabajos del pipeline. Todos deben pasar antes del despliegue.```
Lint & Security Gate Unit Tests (Python Matrix)
├─ Gitleaks (secret scan) ├─ pytest 3.10 --cov-fail-under=80
├─ Hadolint (Dockerfile lint) ├─ pytest 3.11 --cov-fail-under=80
├─ Ruff check + format └─ pytest 3.12 --cov-fail-under=80
├─ Mypy type check (108 files)
├─ Bandit (all severities) Wheel Smoke Test
├─ pip-audit (no CVEs) └─ Build wheel → install in /tmp
└─ Security boundary tests → verify plugin discovery
→ assert __file__ under sys.prefix
CodeQL Analysis
└─ Python SAST Docker Verification
├─ Build reversecore-mcp:ci
Exploit Safety Gate ├─ Trivy container scan
├─ Bandit on POC templates ├─ Image size check (< 5 GB)
├─ Hypothesis DAST fuzzing ├─ CLI tool verification
├─ Performance benchmarks ├─ Integration tests in container
└─ Container isolation test └─ E2E tool invocation
In-Container Smoke Test Build Base Image (amd64 + arm64)
├─ Copy test ELF into container ├─ Compile YARA 4.3.1
└─ Run scripts/smoke_test.py ├─ Compile Radare2 6.0.4
├─ Compile r2ghidra
Deploy (amd64 + arm64) └─ Push to GHCR
├─ Build app image
├─ Push to GHCR Merge Manifests
└─ Trivy rescan on published └─ Multi-arch manifest → :latest
Política de cero evasiones: los fallos de CI/CD nunca se resuelven modificando la configuración del pipeline. Las causas raíz siempre se corrigen directamente en el código fuente o en las dependencias.
Arquitectura de compilación de Docker
La compilación de Docker utiliza un enfoque de dos capas para mantener los tiempos de compilación manejables:
Capa 1: Imagen base (Dockerfile.base)
Una compilación de múltiples etapas que compila desde el código fuente todas las dependencias lentas de compilar y que rara vez cambian:``` compiler-toolchain (python:3.12-slim-bookworm + build tools) ├── compiler-yara (YARA 4.3.1 from source) [parallel] ├── compiler-r2 (Radare2 6.0.4 from source) [parallel] │ └── compiler-r2ghidra (r2ghidra plugin) [sequential] └── compiler-pip (pip install into /opt/venv) [parallel]
base (final runtime: python:3.12-slim-bookworm) ├── Runtime packages: file, binutils, gdb, binwalk, graphviz, nasm, sleuthkit ├── /opt/yara (compiled YARA) ├── /opt/radare2 (compiled r2 + r2ghidra) ├── /opt/venv (Python packages) └── Non-root user: appuser (UID 1000)
Esta imagen se reconstruye solo cuando cambian las versiones de las herramientas. Tiempo de compilación: ~12 minutos.
### Capa 2: Imagen de aplicación (`Dockerfile`)
Hereda de la imagen base y copia el código de la aplicación:```
FROM base image
├── COPY reversecore_mcp/ (application code)
├── COPY scripts/ (smoke test, benchmarks)
├── pip install any new requirements
├── Security package upgrades
└── CMD ["python", "-m", "reversecore_mcp.server"]
Tiempo de compilación: ~60 segundos.
Docker Compose
Tres servicios con perfiles específicos por arquitectura:
| Servicio | Perfil | Descripción |
|---|---|---|
reversecore-mcp | default, x86 | Intel/AMD x86_64 |
reversecore-mcp-arm64 | arm64, macos | Apple Silicon ARM64 |
redis | todos los perfiles | Redis 7 Alpine para cola de tareas y almacenamiento en caché |
Límites de recursos: 2.0 núcleos de CPU, 4 GB de memoria por contenedor.
Requisitos del Sistema
| Componente | Mínimo | Recomendado |
|---|---|---|
| CPU | 4 núcleos | 8+ núcleos |
| RAM | 8 GB | 16 GB |
| Almacenamiento | 20 GB | 50 GB SSD |
| SO | Linux / macOS | Entorno Docker (cualquier SO) |
| Docker | 20.10+ | 24.0+ |
| Python (modo local) | 3.10 | 3.11 o 3.12 |
Estructura del Proyecto```
reversecore_mcp/ ├── core/ # Infrastructure layer (37 modules) │ ├── config.py # Pydantic BaseSettings (34+ env vars) │ ├── exceptions.py # Exception hierarchy (17 classes, RCMCP-E* codes) │ ├── security.py # Input sanitization & command arg validation │ ├── validators.py # Path validators (TOCTOU-hardened, symlink-safe) │ ├── r2_pool.py # Thread-safe Radare2 connection pool │ ├── r2_helpers.py # Structured Radare2 output parsing │ ├── metrics.py # Per-tool timing, counts, error rates, cache stats │ ├── decorators.py # @log_execution, @track_metrics │ ├── error_handling.py # @handle_tool_errors decorator │ ├── error_formatting.py # Structured error formatting │ ├── execution.py # Safe subprocess with timeout/output limits │ ├── command_spec.py # Command specifications │ ├── memory.py # Async SQLite AI memory store │ ├── mitre_mapper.py # MITRE ATT&CK mapping engine │ ├── evidence.py # Evidence classification (OBSERVED/INFERRED/POSSIBLE) │ ├── resilience.py # Retry, circuit-breaker, timeout patterns │ ├── task_queue.py # Background task queue (Redis + arq) │ ├── extension_registry.py # Plugin registration system │ ├── arch_registry.py # Multi-arch mapping (x86/ARM/MIPS/RISC-V/PPC) │ ├── result_cache.py # SHA256-based tool result caching │ ├── analysis_cache.py # Multi-level decompilation cache (Redis + SQLite) │ ├── result.py # ToolSuccess / ToolError Pydantic models │ ├── loader.py # Dynamic tool module loader │ ├── plugin.py # Plugin base class │ ├── extension.py # Extension base class │ ├── container.py # Container/sandbox execution │ ├── audit.py # Audit logging │ ├── binary_cache.py # Binary file caching │ ├── json_utils.py # orjson-backed JSON (3-5x faster) │ ├── logging_config.py # Loguru logging configuration │ ├── report_generator.py # Report rendering (Markdown, PDF) │ ├── resource_manager.py # MCP resource lifecycle │ └── sast/ # Source code scanners │ ├── python_ast_scanner.py # Python AST vulnerability scanner │ ├── regex_scanner.py # C/C++ regex vulnerability scanner │ ├── rule_manager.py # SAST rule loader │ └── default_rules.yaml # Default scanning rules │ ├── tools/ # MCP tool implementations (120 tools) │ ├── analysis/ # Static analysis (24 tools) │ │ ├── static_analysis.py # file, strings, binwalk │ │ ├── lief_tools.py # LIEF binary parser │ │ ├── capa_tools.py # CAPA capability detection │ │ ├── die_tools.py # Detect It Easy packer detection │ │ ├── diff_tools.py # Binary diffing │ │ ├── emulation_tools.py # ESIL emulation │ │ ├── fuzz_tools.py # Fuzzing harness generator │ │ ├── fuzzing_campaign.py # Full fuzzing campaign runner │ │ ├── symbolic_analysis.py # angr symbolic execution │ │ ├── signature_tools.py # Library signature matching │ │ ├── source_auditor.py # SAST (Python + C/C++) │ │ ├── crash_triage.py # GDB crash triage │ │ ├── taint_analysis.py # Source→sink taint tracing │ │ ├── advanced_yara.py # Advanced YARA generation │ │ ├── patch_vuln_inference.py # Patch vulnerability inference │ │ └── cache_tools.py # Analysis cache management │ │ │ ├── radare2/ # Disassembly & decompilation (30 tools) │ │ ├── radare2_mcp_tools.py # Core Radare2 tool set │ │ ├── r2ghidra_tools.py # r2ghidra decompiler (cached) │ │ ├── r2_analysis.py # Deep function analysis │ │ ├── r2_db.py # SQLite annotation + cache DB │ │ ├── r2_esil_simulator.py # Multi-arch ESIL simulator │ │ └── r2_session.py # Stateful analysis sessions │ │ │ ├── malware/ # Threat detection (9 tools) │ │ ├── dormant_detector.py # Backdoor/logic bomb detection │ │ ├── ioc_tools.py # IOC extraction │ │ ├── yara_tools.py # YARA scanning │ │ ├── adaptive_vaccine.py # YARA rule + patch generation │ │ ├── vulnerability_hunter.py # Dangerous API detection │ │ ├── autonomous_hunter.py # Autonomous vuln hunting pipeline │ │ ├── heap_exploit.py # Heap exploitation analysis │ │ ├── poc_generator.py # PoC exploit generation │ │ └── rop_builder.py # ROP chain construction │ │ │ ├── forensics/ # Digital forensics (22 tools) │ │ ├── memory.py # Volatility3 memory forensics │ │ ├── network.py # Scapy PCAP analysis │ │ ├── disk.py # Sleuth Kit disk forensics │ │ └── artifact.py # Browser/registry/event log analysis │ │ │ ├── report/ # Report generation (14 tools) │ │ ├── report_mcp_tools.py # MCP-registered report tools │ │ ├── report_tools.py # Report rendering logic │ │ ├── session.py # Session state management │ │ ├── converter.py # Format conversion (Markdown → PDF/HTML) │ │ ├── email.py # SMTP report delivery │ │ ├── sigma_generator.py # SIGMA rule generation │ │ └── vex_generator.py # VEX report generation │ │ │ └── common/ # Shared utilities (20 tools) │ ├── file_operations.py # File ops, workspace management │ ├── server_tools.py # Server health, tool metrics │ ├── memory_tools.py # AI memory management (11 tools) │ ├── patch_explainer.py # Binary patch explanation │ └── assembler.py # Keystone assembler │ ├── prompts/ # AI reasoning prompts (22 modes) │ ├── malware.py # 9 malware analysis prompts │ ├── security.py # 6 security research prompts │ ├── cve_research.py # 5 CVE/exploit research prompts │ ├── game.py # Game client analysis prompt │ ├── report.py # Report generation prompt │ ├── server_health.py # Server inspection prompts │ └── common.py # Shared constants (DOCKER_PATH_RULE, LANGUAGE_RULE) │ ├── dashboard/ # Web dashboard (FastAPI + HTMX) │ ├── templates/ # Jinja2 templates with HTMX fragments │ └── static/ # htmx.min.js (local, CSP-compliant) │ ├── web/ # HTTP transport layer │ ├── auth.py # API key authentication middleware │ ├── middleware.py # Security headers, loopback restriction │ └── endpoints.py # /health, file upload, dashboard routes │ ├── resources.py # 11 MCP resources (static + dynamic per-binary) └── server.py # FastMCP server entry point
**Otros directorios:**```
tests/
├── unit/ # 1,957 unit tests
├── integration/ # Docker-based integration tests
├── fixtures/ # Test binaries, YARA rules, sample data
└── conftest.py # Shared pytest fixtures
scripts/
├── smoke_test.py # Multi-layer in-container smoke test
├── check_release_metadata.py # Version consistency validation
├── fetch_test_binaries.py # Download test fixtures
├── run-docker.sh # Auto-detect architecture and start
└── ... # Benchmarks, analysis scripts
docs/
├── getting-started/ # Installation guide
├── development/ # Architecture, contributing, testing guides
├── api/ # Tool and module reference
└── user-guide/ # Analysis workflows
Manejo de errores
Todas las excepciones personalizadas heredan de ReversecoreError y llevan códigos de error estructurados:
| Excepción | Código | Tipo | Cuándo |
|---|---|---|---|
ReversecoreError | RCMCP-E000 | UNKNOWN_ERROR | Clase base para todos los errores |
ValidationError | RCMCP-E001 | VALIDATION_ERROR | Entrada no válida, parámetros incorrectos |
ExecutionTimeoutError | RCMCP-E002 | TIMEOUT_ERROR | La herramienta superó el tiempo de espera |
ToolNotFoundError | RCMCP-E003 | TOOL_ERROR | Herramienta CLI requerida no instalada |
OutputLimitExceededError | RCMCP-E004 | OUTPUT_ERROR | La salida superó el tamaño máximo |
ToolExecutionError | RCMCP-E005 | EXECUTION_ERROR | El subproceso devolvió un código distinto de cero |
BinaryAnalysisError | RCMCP-E100 | BINARY_ANALYSIS_ERROR | Fallo general de análisis binario |
DecompilationError | RCMCP-E101 | DECOMPILATION_ERROR | Falló la descompilación con r2ghidra |
DisassemblyError | RCMCP-E102 | DISASSEMBLY_ERROR | Falló el desensamblado con Radare2 |
StructureRecoveryError | RCMCP-E103 | STRUCTURE_RECOVERY_ERROR | Falló la recuperación de estructuras C |
SignatureGenerationError | RCMCP-E104 | SIGNATURE_GENERATION_ERROR | Falló la generación de YARA/firmas |
EmulationError | RCMCP-E105 | EMULATION_ERROR | Falló la emulación ESIL |
ToolTimeoutError | RCMCP-E200 | TOOL_TIMEOUT_ERROR | La herramienta externa agotó el tiempo de espera |
GhidraConnectionError | RCMCP-E201 | GHIDRA_CONNECTION_ERROR | Problema de conexión con r2ghidra |
Radare2Error | RCMCP-E202 | RADARE2_ERROR | Falló el comando de Radare2 |
WorkspaceError | RCMCP-E300 | WORKSPACE_ERROR | Error de acceso a archivos del espacio de trabajo |
SecurityViolationError | RCMCP-E301 | SECURITY_VIOLATION | Violación de la política de seguridad |
PathTraversalError | RCMCP-E302 | PATH_TRAVERSAL | Se detectó un intento de path traversal |
Los clientes de IA pueden usar el campo error_code para manejar los fallos programáticamente y decidir si reintentar, probar una herramienta alternativa o informar del error al usuario.
Añadir nuevas herramientas
Siga este patrón para añadir una nueva herramienta MCP:```python
reversecore_mcp/tools/analysis/my_tool.py
from reversecore_mcp.core.decorators import log_execution from reversecore_mcp.core.result import ToolResult, success, failure from reversecore_mcp.core.security import validate_file_path
@log_execution() async def my_analysis_tool( file_path: str, option: str | None = None, ) -> ToolResult: """Analyze a binary for X.
Args:
file_path: Path to the binary file (relative to workspace).
option: Optional analysis option.
Returns:
ToolResult with status='success' and structured content.
"""
try:
safe_path = validate_file_path(file_path)
result = await perform_analysis(safe_path)
return success({"result": result})
except Exception as e:
return failure(
error_code="RCMCP-E100",
message=str(e),
hint="Check that the file exists and is a valid binary.",
)
Luego regístralo en el `__init__.py` del plugin correspondiente y añade pruebas en `tests/unit/`.
---
## Contribuciones
1. Haz un fork del repositorio
2. Crea una rama de características: `git checkout -b feat/my-feature`
3. Escribe pruebas junto con tu código: la cobertura no debe bajar del 80%
4. Asegúrate de que todas las verificaciones pasen: `pytest`, `ruff check`, `mypy`, `bandit`
5. Abre un pull request con una descripción clara
Por favor, lee la [Guía de Contribución](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/development/contributing.md) para conocer los estándares de código, las convenciones de docstrings (estilo Google) y la lista de verificación para pull requests.
---
## Documentación
| Documento | Descripción |
|---|---|
| [Guía de Instalación](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/getting-started/installation.md) | Configuración detallada para todos los entornos |
| [Guía de Arquitectura](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/development/architecture.md) | Diseño del sistema y detalles de componentes |
| [Guía de Contribución](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/development/contributing.md) | Estándares de código, docstrings, flujo de trabajo de PR |
| [Guía de Pruebas](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/development/testing.md) | Patrones de prueba, fixtures y cobertura |
| [Referencia de la API](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/api/) | Referencia de herramientas y módulos |
| [Guía de Usuario](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/docs/user-guide/) | Flujos de trabajo de análisis |
---
## Ejemplos de Uso
### Ejemplo 1: Triaje básico de malware```
User: "Analyze this suspicious file sample.exe"
AI calls:
1. run_file("sample.exe") → PE32 executable, x86, MSVC
2. detect_packer("sample.exe") → Not packed
3. extract_iocs("sample.exe") → 3 IPs, 2 URLs, 1 mutex
4. run_capa("sample.exe") → "creates persistence", "encrypts data"
5. dormant_detector("sample.exe") → 2 orphan functions with network calls
6. generate_yara_rule("sample.exe") → Detection rule generated
AI response: "This PE32 binary shows ransomware-like behavior. CAPA detected
encryption and persistence capabilities. I found 2 hidden network functions
that may serve as a backup C2 channel. Here's a YARA rule for detection..."
Ejemplo 2: Investigación de vulnerabilidades mediante análisis de taint```
User: "Find exploitable bugs in this network daemon"
AI activates: taint_analysis_mode
AI calls:
-
taint_trace("daemon", verify_with_angr=True) → Found 3 source→sink paths: recv() → strcpy() [CWE-120, CONFIRMED by angr] read() → sprintf() [CWE-134, LIKELY] getenv() → system() [CWE-78, POSSIBLE]
-
vulnerability_hunter("daemon") → 12 dangerous API calls, 4 exploitable patterns
-
generate_poc_exploit(target="daemon", vuln_type="bof", offset=128) → Python exploit script generated
AI response: "I found a confirmed stack buffer overflow where recv() data flows directly into strcpy() at 0x40123C. angr proved the path is reachable. Here's a working PoC..."
### Ejemplo 3: Investigación Forense Digital```
User: "Analyze this memory dump from a compromised server"
AI calls:
1. memory_list_processes("memdump.raw")
→ 47 processes, 2 with suspicious names
2. memory_detect_injections("memdump.raw")
→ Code injection detected in PID 1842 (svchost.exe)
3. memory_extract_strings("memdump.raw", pid=1842)
→ C2 domain strings extracted
4. artifact_correlate_ioc(artifacts={"domains": ["evil-c2.com"]})
→ Matches known APT group IOCs
5. create_analysis_report(template_type="full_analysis")
→ PDF report with timeline and MITRE ATT&CK mapping
Ejemplo 4: Diffing de parches para investigación de 1 día```
User: "Compare the patched and unpatched versions to find what was fixed"
AI activates: patch_diff_auto_mode
AI calls:
-
diff_binaries("libfoo-1.0.so", "libfoo-1.1.so") → 3 functions changed, 1 new function
-
patch_diff_1day("libfoo-1.0.so", "libfoo-1.1.so") → Automated analysis: bounds check added at parse_header()
-
r2_decompile("libfoo-1.0.so", "parse_header") → Decompiled vulnerable version (no bounds check)
-
r2_decompile("libfoo-1.1.so", "parse_header") → Decompiled patched version (memcpy size limited)
AI response: "The patch adds a bounds check in parse_header() at 0x12340. The old version copies user-controlled length bytes via memcpy without validation, creating a heap buffer overflow (CWE-122)."
---
## Soporte Multi-Arquitectura
El módulo `arch_registry.py` asigna nombres de arquitectura a parámetros de configuración de Radare2, lo que permite que las herramientas funcionen en distintas arquitecturas de CPU sin configuración manual:
| Architecture | Key | r2 Arch | Bit Widths | PC Register | SP Register |
|---|---|---|---|---|---|
| Intel 32-bit | `x86` | `x86` | 32 | `eip` | `esp` |
| Intel/AMD 64-bit | `x86_64` | `x86` | 64 | `rip` | `rsp` |
| ARM 32-bit / Thumb | `arm32` | `arm` | 16, 32 | `r15` | `r13` |
| ARM 64-bit (AArch64) | `arm64` | `arm` | 64 | `pc` | `sp` |
| MIPS | `mips` | `mips` | 32, 64 | `pc` | `sp` |
| RISC-V | `riscv` | `riscv` | 32, 64 | `pc` | `sp` |
| PowerPC | `ppc` | `ppc` | 32, 64 | `pc` | `r1` |
**La resolución de alias** se maneja automáticamente:
- `amd64` → `x86_64`
- `aarch64` → `arm64`
- `arm` con `bits=64` → `arm64`
- `arm` con `bits=16` o `bits=32` → `arm32`
Herramientas como `Radare2_esil_emulate`, `assemble_instructions` y `r2_simulate_patch` usan este registro para configurar correctamente el entorno de análisis para cualquier binario objetivo.
---
## Sistema de caché de resultados
Dos capas de caché minimizan el cálculo redundante:
### Caché de resultados de herramientas (`result_cache.py`)
El decorador `@cache_tool_result` almacena en caché la salida de cualquier herramienta basándose en un hash SHA256 del archivo binario y los argumentos de palabra clave de la herramienta:```
Cache key = SHA256( "<tool_name>::{sorted_json_kwargs}" )
Backend de almacenamiento: base de datos SQLite a través de r2_db.py, accesible mediante las herramientas get_cached_result() y set_cached_result().
Métricas: los aciertos y fallos de caché se registran mediante metrics_collector.record_cache_hit() y record_cache_miss(), visibles a través de la herramienta get_tool_metrics.
Caché de análisis (analysis_cache.py)
Una caché multinivel específica para los resultados de descompilación (que son costosos de calcular):
| Nivel | Backend | Formato de clave | TTL | Propósito |
|---|---|---|---|---|
| L1 | Redis | ghidra:decompile:{file_hash}:{function_address}:{decompiler} | 1 hora (3600s) | Rápida, compartida entre sesiones |
| L2 | SQLite | Tabla decompilation_cache | Persistente | Sobrevive a reinicios de Redis |
Importar/Exportar: las herramientas export_analysis_cache e import_analysis_cache permiten guardar/restaurar el estado de la caché en/desde archivos rcpack para compartir entre entornos.
Sistema de Memoria de IA
El sistema de memoria de IA (memory_tools.py + core/memory.py) proporciona almacenamiento persistente y consultable para los hallazgos de análisis entre sesiones. Esto permite que la IA pueda:
- Recordar lo que encontró previamente sobre un binario
- Cruzar referencias de hallazgos entre diferentes muestras
- Etiquetar y buscar sesiones por tema, familia de malware o técnica
Cómo funciona```
create_memory_session("analysis of ransomware sample") │ ├── store_analysis_finding("Found AES-256 encryption at 0x401000", tags=["crypto", "ransomware"]) ├── store_analysis_finding("C2 beacon interval: 30 seconds", tags=["c2", "network"]) └── tag_analysis_session(tags=["ransomware", "financial-sector"])
Later, in a different session:
query_analysis_memories("ransomware encryption") → Returns previous findings about ransomware encryption patterns
get_binary_analysis_context("sample.exe") → Returns all findings ever recorded for this binary
**Almacenamiento:** Base de datos SQLite asíncrona en la ruta configurada por `MEMORY_DB_PATH` (por defecto: `~/.reversecore_mcp/memory.db`).
**Portabilidad:** Use `export_memory_store` e `import_memory_store` para transferir la base de datos de memoria completa entre entornos.
---
## Panel web
Cuando se ejecuta en modo HTTP (`MCP_TRANSPORT=http`), hay un panel web disponible en `http://localhost:8000/dashboard`. Proporciona:
- Subida de binarios con arrastrar y soltar
- Estado del análisis en tiempo real
- Lista de funciones interactiva y vista de desensamblado
- Resultados de extracción de IOC
- Monitorización del estado del servidor
**Stack tecnológico:** FastAPI + plantillas Jinja2 + HTMX (cargado localmente desde `dashboard/static/`, sin dependencia de CDN para cumplir con CSP).
**Características de seguridad:**
- Tokens CSRF en todos los formularios que cambian el estado
- Autoescapado de Jinja2 habilitado
- Toda la entrada del usuario se sanitiza mediante `html.escape()` antes de mostrarse
- Protección contra path traversal mediante `validate_file_path()`
---
## Despliegue
### Lista de comprobación para producción
Antes de desplegar en producción:
| Elemento | Cómo |
|---|---|
| Establecer clave de API | `MCP_API_KEY=<strong-random-key>` |
| Usar usuario no root | Integrado: el contenedor se ejecuta como `appuser` (UID 1000) |
| Establecer límites de recursos | Por defecto: 2 CPU / 4 GB de RAM en `docker-compose.yml` |
| Habilitar registro estructurado | `LOG_FORMAT=json` para agregación de registros |
| Configurar Redis | `REDIS_URL=redis://<host>:6379/0` para cola de tareas y caché |
| Establecer ruta del espacio de trabajo | `REVERSECORE_WORKSPACE=/path/to/isolated/directory` |
| Revisar límites de tasa | `REVERSECORE_RATE_LIMIT=60` (peticiones/min, ajuste según sea necesario) |
| Habilitar sandbox | `REVERSECORE_SANDBOX_ENABLED=true` para aislamiento del análisis dinámico |
### Comprobaciones de estado
El servidor proporciona endpoints HTTP de comprobación de estado para la orquestación:```bash
# Liveness (always 200 if process is running)
curl http://localhost:8000/health/live
# Readiness (checks tool availability)
curl http://localhost:8000/health/ready
# Full health (requires API key if configured)
curl -H "X-API-Key: <key>" http://localhost:8000/health
Estos endpoints están exentos de la autenticación mediante clave de API para que los balanceadores de carga y los orquestadores de contenedores puedan sondearlos.
Healthcheck del contenedor
La imagen de Docker incluye una instrucción HEALTHCHECK integrada que verifica la conectividad TCP al puerto 8000 cada 30 segundos. Docker y Kubernetes reiniciarán automáticamente los contenedores en mal estado.
Solución de problemas
Problemas comunes
La herramienta devuelve RCMCP-E003: Tool not found
La herramienta CLI requerida no está instalada en el entorno.
Solución: Si usas Docker, verifica que la herramienta esté en la imagen base:```bash docker exec reversecore-mcp-arm64 which r2 yara binwalk tsk_recover gdb
Si utiliza una instalación local de Python, instale la herramienta que falta:```bash
# macOS
brew install radare2 yara binwalk sleuthkit
# Ubuntu/Debian
apt install radare2 yara binwalk sleuthkit
Error de tiempo de espera (RCMCP-E002 / RCMCP-E200)
El análisis excedió el tiempo de espera configurado.
Solución: Aumente el tiempo de espera:```bash export REVERSECORE_DEFAULT_TOOL_TIMEOUT=300 # 5 minutes
Para binarios grandes (>100 MB), considera usar variantes de escaneo rápido:
- `run_capa_quick` en lugar de `run_capa`
- `detect_packer` en lugar de `detect_packer_deep`
</details>
<details>
<summary><b>Error de path traversal (RCMCP-E302)</b></summary>
Has hecho referencia a un archivo fuera del directorio del espacio de trabajo.
**Solución:** Copia el archivo al espacio de trabajo primero:```
copy_to_workspace("/path/to/file.exe")
O monta directorios adicionales como solo lectura:```bash export REVERSECORE_READ_DIRS=/opt/samples,/mnt/evidence
</details>
<details>
<summary><b>El contenedor Docker no se inicia en Apple Silicon</b></summary>
Asegúrate de que estás usando el perfil ARM64:```bash
docker compose --profile arm64 up -d
O usa el script de detección automática:```bash ./scripts/run-docker.sh
</details>
<details>
<summary><b>Redis conexión rechazada</b></summary>
La cola de tareas requiere una instancia de Redis en ejecución.
**Solución:** Inicie Redis junto con el servicio principal:```bash
docker compose --profile arm64 up -d # Starts both reversecore and redis
Or disable Redis-dependent features by not setting REDIS_URL.
r2ghidra decompilation produces empty output
This usually means the function wasn't analyzed first.
Solution: Run analysis before decompilation:``` Radare2_analyze_binary("sample.exe") Radare2_decompile_function("sample.exe", "main")
</details>
---
## FAQ
<details>
<summary><b>¿Reemplaza esto a Ghidra o IDA Pro?</b></summary>
No. Este proyecto es un complemento, no un reemplazo. Utiliza r2ghidra (el motor de descompilación de Ghidra integrado en Radare2) para la descompilación. No proporciona una GUI, ni tiene el flujo de trabajo de análisis interactivo de un desensamblador completo. Su propósito es permitir que los asistentes de IA realicen tareas de análisis de forma programática.
</details>
<details>
<summary><b>¿Se necesita una instalación separada de Ghidra o JDK?</b></summary>
No. El plugin r2ghidra integra el motor de descompilación de Ghidra directamente dentro de Radare2. Sin JDK, sin instalación de Ghidra, sin archivos de proyecto de Ghidra. Solo `r2` con el plugin `r2ghidra` compilado.
</details>
<details>
<summary><b>¿Qué clientes MCP son compatibles?</b></summary>
Cualquier cliente que implemente la especificación del [Model Context Protocol](https://modelcontextprotocol.io/). Probado con: Claude Desktop, Cursor, Windsurf y Google Antigravity. El servidor admite transportes stdio y HTTP/SSE.
</details>
<details>
<summary><b>¿Puedo analizar archivos PE de Windows en Linux/macOS?</b></summary>
Sí. El análisis estático (desensamblado, descompilación, extracción de cadenas, extracción de IOC, escaneo YARA) funciona con cualquier formato de archivo, independientemente del sistema operativo anfitrión. El análisis dinámico (emulación, fuzzing) puede tener limitaciones dependiendo de la arquitectura de destino.
</details>
<details>
<summary><b>¿Qué tan seguro es analizar malware con esta herramienta?</b></summary>
El contenedor Docker proporciona aislamiento: usuario no root, sin red por defecto en CI, límites de recursos. Para el análisis de malware en vivo, recomendamos ejecutarlo en una máquina virtual dedicada o usar la función de sandbox (`REVERSECORE_SANDBOX_ENABLED=true`). Las herramientas de análisis estático (r2, YARA, strings) nunca ejecutan el binario de destino.
</details>
<details>
<summary><b>¿Cuál es el tamaño máximo de archivo?</b></summary>
Límites por defecto:
- Subida: 100 MB (`MAX_UPLOAD_SIZE`)
- Parseo LIEF: 1 GB (`REVERSECORE_LIEF_MAX_FILE_SIZE`)
- Salida de herramientas: 10 MB (`REVERSECORE_MAX_OUTPUT_SIZE`)
Todos los límites son configurables mediante variables de entorno.
</details>
---
## Agradecimientos
Este proyecto se basa en el trabajo de muchos proyectos de código abierto:
| Proyecto | Rol en Reversecore MCP |
|---|---|
| [Radare2](https://radare.org/) | Desensamblado, emulación, análisis de binarios |
| [r2ghidra](https://github.com/radareorg/r2ghidra) | Motor de descompilación de Ghidra para Radare2 |
| [FastMCP](https://github.com/jlowin/fastmcp) | Framework del servidor MCP |
| [YARA](https://virustotal.github.io/yara/) | Coincidencia de patrones para detección de malware |
| [LIEF](https://lief-project.github.io/) | Parseo de formatos binarios (PE, ELF, Mach-O) |
| [CAPA](https://github.com/mandiant/capa) | Detección de capacidades FLARE de Mandiant |
| [angr](https://angr.io/) | Motor de ejecución simbólica |
| [Capstone](https://www.capstone-engine.org/) | Framework de desensamblado |
| [Keystone](https://www.keystone-engine.org/) | Framework de ensamblado |
| [pwntools](https://github.com/Gallopsled/pwntools) | Kit de herramientas para desarrollo de exploits |
| [ROPgadget](https://github.com/JonathanSalwan/ROPgadget) | Buscador de gadgets ROP |
| [Volatility3](https://github.com/volatilityfoundation/volatility3) | Framework de análisis forense de memoria |
| [Scapy](https://scapy.net/) | Análisis de paquetes de red |
| [Sleuth Kit](https://sleuthkit.org/) | Kit de herramientas de análisis forense de discos |
| [Binwalk](https://github.com/ReFirmLabs/binwalk) | Análisis de firmware |
| [Detect It Easy](https://github.com/horsicq/DIE-engine) | Detección de empaquetadores/compiladores |
---
## Licencia
MIT — consulte [LICENSE](https://github.com/sjkim1127/reversecore_mcp/blob/HEAD/LICENSE) para más detalles.
---
<div align="center">
**[GitHub](https://github.com/sjkim1127/Reversecore_MCP)** · **[PyPI](https://pypi.org/project/reversecore-mcp/)** · **[Documentación de FastMCP](https://github.com/jlowin/fastmcp)** · **[Especificación MCP](https://modelcontextprotocol.io/)** · **[Radare2](https://radare.org/)** · **[YARA](https://virustotal.github.io/yara/)**
</div>