Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
JNISleuth-MCP — Recuperación automatizada de RegisterNatives de JNI en Android, reconstrucción de tipos de archivos .so ARM64 sin símbolos, desofuscador de OLLVM BR X8 y puente universal LLM/MCP para Jadx, Ghidra e IDA Pro 9.0. | Kitploit
Herramientas/GitHubGitHub/nighthawkk/jnisleuth-mcp
Seguridad AndroidAnálisis EstáticoAnálisis Dinámico (Sandboxing)Ingeniería InversaAnálisis de MalwareSeguridad MóvilAnálisis de BinariosReversing Asistido por IA
GitHubnighthawkk/jnisleuth-mcp

JNISleuth-MCP

Recuperación automatizada de RegisterNatives de JNI en Android, reconstrucción de tipos de archivos .so ARM64 sin símbolos, desofuscador de OLLVM BR X8 y puente universal LLM/MCP para Jadx, Ghidra e IDA Pro 9.0.

238hace 2 díasAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver Repositorio

🕵️‍♂️ JNISleuth-MCP

Tender un puente sobre el abismo entre Java y código nativo en la ingeniería inversa de Android.
Recuperación automatizada de RegisterNatives, reconstrucción de tipos en .so ARM64 sin símbolos, y un servidor MCP unificado de Jadx + Ghidra o IDA para el análisis de malware asistido por IA.

Platform Ghidra MCP Native Engine License

Inicio rápido • Cómo funciona • Herramientas MCP • Agente Dobby sigiloso • Hoja de ruta


⚡ ¿Por qué JNISleuth-MCP?

El malware moderno de Android, los troyanos bancarios, el spyware y los empaquetadores comerciales ocultan su lógica central (cifrado de C2, derivación de claves, comprobaciones del entorno y rutinas de explotación) dentro de bibliotecas nativas C/C++ sin símbolos (lib*.so).

Al hacer ingeniería inversa a través del límite JNI, los analistas se topan con tres muros:

  1. Referencias cruzadas rotas: los métodos native declarados en classes.dex no utilizan los símbolos estándar Java_com_pkg_Class_method. En su lugar, se enlazan dinámicamente en tiempo de ejecución dentro de un JNI_OnLoad ofuscado mediante JNIEnv->RegisterNatives().
  2. Descompilación a ciegas: abrir un .so sin símbolos en Ghidra o IDA muestra miles de funciones sub_XXXX sin nombre, donde las llamadas a la vtable de JNIEnv* parecen aritmética de punteros en bruto ((**(code **)(*param_1 + 0x538))(param_1, param_2)).
  3. Contexto de IA desconectado: los servidores MCP de Ghidra y Jadx existentes viven en silos: un LLM no puede rastrear el flujo de datos desde un BroadcastReceiver de Android en Java directamente hasta una rutina de cifrado ARM64 en libnative-lib.so.

JNISleuth-MCP elimina el cambio de contexto. Recupera automáticamente los enlaces estáticos y dinámicos de RegisterNatives, vuelve a tipar las funciones ARM64 sin símbolos en Ghidra y expone un único servidor unificado de Model Context Protocol (MCP) que conecta el bytecode DEX con el ensamblador nativo.

CapacidadMCP estándar de Jadx / GhidraJNISleuth-MCP
Resolver exportaciones estándar Java_*✅✅
Recuperar estáticamente arrays de estructuras RegisterNatives sin símbolos (.rodata / .data.rel.ro + CFG de JNI_OnLoad)❌✅
Recolección sigilosa de RegisterNatives en el dispositivo mediante Dobby (evita las comprobaciones anti-Frida)❌✅
Aplicar automáticamente los tipos de la vtable de JNIEnv* y reconstruir Call*Method / GetStringUTFChars en Ghidra❌✅
Flujo de datos transfronterizo en una sola llamada (Java Caller ➔ JNI Bridge ➔ C++ ARM64 descompilado)❌✅

🏗️ Arquitectura y cómo funciona

flowchart LR
    subgraph Input["📦 Target APK / Malware"]
        DEX["classes*.dex"]
        ELF["Stripped lib/*.so (ARM64)"]
    end

    subgraph Harvester["🔍 Stage 1: JNI Bridge Harvester"]
        StaticScan["Static ELF & DEX Scanner\n(LIEF + Capstone + Heuristic Triplets)"]
        DobbyAgent["Stealth Native Agent\n(C++ / NDK / Dobby Inline Hook)"]
    end

    subgraph GhidraEngine["⚙️ Stage 2: Ghidra Headless Reconstructor"]
        Renamer["Function Renamer & Signature Applier"]
        VTable["JNIEnv* VTable & Struct Propagator"]
    end

    subgraph MCPServer["🤖 Stage 3: Unified FastMCP Server"]
        CrossGraph["Cross-Boundary Callgraph\n(Jadx Java + Ghidra C/ARM64)"]
        CallbackTrace["Upcall Tracer\n(Native -> Java Reflection)"]
    end

    DEX --> StaticScan
    ELF --> StaticScan
    ELF -. "Packed / OLLVM?" .-> DobbyAgent
    StaticScan --> Renamer
    DobbyAgent -- "register_natives.json" --> Renamer
    Renamer --> VTable
    VTable --> CrossGraph
    VTable --> CallbackTrace

🎬 Vívelo en Acción

1. Recuperación Estática + Dinámica de RegisterNatives por CLI

Ejecuta jnisleuth scan contra un APK con bibliotecas nativas eliminadas:

$ jnisleuth scan --apk samples/banker_dropper.apk --arch arm64-v8a

[*] Parsing 3 DEX files... Found 14 declared `native` methods across 4 classes.
[*] Inspecting lib/arm64-v8a/libcore-crypto.so (Stripped ELF, 0 exported Java_* symbols)
[*] Running static JNINativeMethod triplet scanner on .rodata / .data.rel.ro...
    [+] Resolved 11/14 methods via static struct table @ 0x0004d210
[!] 3 methods unresolved (constructed dynamically on stack in JNI_OnLoad).
[*] Launching headless Dobby collector on device (emulator-5554)...

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓
┃ Java Class & Method                      ┃ JNI Signature        ┃ .so Offset (ARM64)  ┃ Resolution Mode  ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━┩
│ com.dropper.Core#initEngine              │ (Landroid/content/.. │ libcore.so+0x001a40 │ Static (.rodata) │
│ com.dropper.Core#decryptPayload          │ ([BLjava/lang/Stri.. │ libcore.so+0x0023c8 │ Static (.rodata) │
│ com.dropper.Core#signC2Beacon            │ (Ljava/lang/String.. │ libcore.so+0x003f10 │ Dynamic (Dobby)  │
│ com.dropper.net.SocketBridge#connectRaw  │ (Ljava/lang/String.. │ libcore.so+0x004890 │ Dynamic (Dobby)  │
└──────────────────────────────────────────┴──────────────────────┴─────────────────────┴──────────────────┘
[+] Synced 14 function signatures and JNIEnv* types to Ghidra project: banker_dropper.gpr

2. Antes vs. Después en Ghidra

Antes de JNISleuth-MCP (FUN_000123c8):

long FUN_000123c8(long *param_1, undefined8 param_2, undefined8 param_3, undefined8 param_4) {
  char *pcVar1;
  long lVar2;
  pcVar1 = (char *)(**(code **)(*param_1 + 0x548))(param_1, param_4, 0);
  lVar2 = (**(code **)(*param_1 + 0x5c0))(param_1, param_3, 0);
  sub_00014a00(lVar2, pcVar1);
  (**(code **)(*param_1 + 0x550))(param_1, param_4, pcVar1);
  return param_3;
}

Después de JNISleuth-MCP (Java_com_dropper_Core_decryptPayload):

jbyteArray Java_com_dropper_Core_decryptPayload(
    JNIEnv *env, jobject thiz, jbyteArray encryptedData, jstring rc4KeyStr) 
{
  const char *key_utf = (*env)->GetStringUTFChars(env, rc4KeyStr, NULL);
  jbyte *payload_bytes = (*env)->GetByteArrayElements(env, encryptedData, NULL);
  rc4_crypt_buffer(payload_bytes, key_utf);
  (*env)->ReleaseStringUTFChars(env, rc4KeyStr, key_utf);
  return encryptedData;
}

🤖 Soporte universal para LLM y MCP (funciona con cualquier modelo)

JNISleuth-MCP es 100% agnóstico al modelo. Puedes conectarlo a cualquier LLM en la nube o local mediante el Model Context Protocol estándar (stdio JSON-RPC 2.0) o exportar esquemas nativos de function-calling de OpenAI / Gemini / Ollama:

  • LLM y agentes en la nube: Google Gemini CLI, OpenAI / ChatGPT Desktop / Codex CLI, Cursor, Windsurf, Cline, Roo Code, Claude Desktop / Claude Code
  • LLM locales / autoalojados: Ollama, vLLM, LM Studio, OpenWebUI, Continue.dev (DeepSeek-R1, Qwen-2.5-Coder, Llama-3.3)
  • SDK de agentes personalizados en Python: Exportación directa del esquema de herramientas (jnisleuth llm-tools --format openai|gemini|mcp) para LangChain, LlamaIndex, LiteLLM, OpenAI SDK o google-genai.
Descargar herramienta