JADX MCP 原理与使用部署

本文作者:杉木@涂鸦智能安全实验室

本文档汇总 JADX-AI-MCP 的架构原理、部署方式及在 Cursor/Claude 中的使用要点,便于后续复现与扩展。


一、JADX-AI-MCP 是什么

JADX-AI-MCPzinja-coder/jadx-ai-mcp)由两部分组成:

  1. JADX-AI-MCP 插件(Java):安装在 JADX-GUI 内,在 GUI 进程里启动 HTTP 服务,暴露当前工程的类、方法、资源、Manifest 等接口。
  2. JADX MCP Server(Python):独立进程,通过 FastMCP 暴露一组 MCP 工具,内部通过 HTTP 请求与 JADX 插件通信;供支持 MCP 的 LLM 客户端(如 Cursor、Claude Desktop)调用。

核心价值:

  • 在 IDE/对话中直接"问"当前在 JADX 里打开的 APK:获取当前选中类、搜索类/方法、读 AndroidManifest、做 SAST、查引用(xrefs)等。
  • 可结合 AI 做漏洞分析、加固识别、代码解读与重命名建议。

二、架构与原理

2.1 整体架构

复制代码
┌─────────────────────────────────────────────────────────────────┐
│  MCP 客户端(Cursor / Claude Desktop / LM Studio 等)            │
│  - 通过 stdio 与 MCP Server 通信                                  │
│  - 展示"工具"列表并调用(如 get_android_manifest, get_all_classes)│
└────────────────────────────┬────────────────────────────────────┘
                              │ MCP 协议 (stdio)
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  JADX MCP Server(jadx_mcp_server.py,Python)                    │
│  - 使用 FastMCP 暴露工具(class/search/resource/refactor/debug...) │
│  - 每个工具内部通过 HTTP 请求转发到 JADX 插件                     │
└────────────────────────────┬────────────────────────────────────┘
                              │ HTTP (默认 http://127.0.0.1:8650/)
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  JADX-AI-MCP 插件(Java,运行在 JADX-GUI 进程内)                 │
│  - 在 JADX-GUI 内启动 HTTP 服务(默认 8650)                      │
│  - 提供 REST 接口:/current-class, /class-source, /manifest...      │
│  - 直接调用 JADX API 获取当前工程、选中内容、反编译结果等         │
└────────────────────────────┬────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  JADX-GUI 当前打开的项目(APK/AAR 等)                             │
│  - 反编译后的类、方法、资源、AndroidManifest 等                   │
└─────────────────────────────────────────────────────────────────┘

要点:

  • JADX 端:只负责"当前在 GUI 里打开的项目";插件不实现反编译逻辑,只把 JADX 已有能力通过 HTTP 暴露出去。
  • 桥接端:Python MCP Server 不做逆向逻辑,只做"协议转换":MCP 工具调用 → HTTP 请求 → JADX 插件 → JADX API。
  • 客户端:用户或 AI 在 Cursor 等环境中调用 MCP 工具,等价于对当前打开的 JADX 工程执行对应操作。

2.2 协议与传输

  • MCP:Model Context Protocol,定义"工具"的命名、参数与返回格式;客户端通过 JSON-RPC 调用这些工具。
  • JADX 插件 ↔ MCP Server :HTTP,默认 http://127.0.0.1:8650,端口可在 JADX 插件设置中修改,MCP Server 通过 -jadx-port 与之对齐。
  • MCP Server 启动方式 :通常由 Cursor 等客户端通过配置的 command + args 以 stdio 方式启动(如 uv run jadx_mcp_server.py),与客户端通过标准输入/输出交换 MCP 消息。

2.3 数据流简述

  1. 用户或 AI 在 Cursor 中发起请求(如"分析当前工程的加固")。
  2. Cursor 将请求转为对 MCP 工具的调用(如 get_android_manifestget_main_application_classes_names)。
  3. JADX MCP Server 收到调用后,向本机 JADX 插件的 HTTP 端口发起请求。
  4. 插件在 JADX 进程内查询当前工程并返回数据。
  5. MCP Server 将结果通过 MCP 协议返回给 Cursor,由 AI 或用户继续分析。

前提:JADX-GUI 已启动并打开了目标 APK/AAR,插件才会在 GUI 内启动 HTTP 服务;否则 MCP 工具会报连接失败或超时。


三、项目结构(本机部署参考)

以 JADX 安装根目录为例(如 jadx-1.5.3/),与 MCP 相关的结构如下:

复制代码
jadx-1.5.3/
├── bin/
│   ├── jadx              # 命令行反编译
│   └── jadx-gui          # GUI(加载插件后可被 MCP 使用)
├── lib/
│   └── jadx-*-all.jar    # JADX 主程序
├── jadx-ai-mcp-6.2.0.jar # 插件 JAR(需通过 jadx plugins 安装)
├── jadx-mcp-server/      # Python MCP 服务端
│   ├── jadx_mcp_server.py
│   ├── requirements.txt
│   └── src/
│       ├── banner.py
│       ├── PaginationUtils.py
│       └── server/
│           ├── config.py           # JADX 端口、健康检查
│           └── tools/
│               ├── class_tools.py  # 类/方法/字段、当前选中、smali
│               ├── search_tools.py # 按名称/关键字搜索
│               ├── resource_tools.py # Manifest、strings、资源
│               ├── refactor_tools.py # 重命名类/方法/字段/包/变量
│               ├── debug_tools.py  # 调试栈帧、线程、变量
│               └── xrefs_tools.py  # 类/方法/字段引用
├── .mcp.json             # 供 Cursor 等引用的 MCP 配置示例
└── JADX_MCP_配置说明.md  # 简要配置说明
  • 插件 :需用 jadx plugins --install-jar jadx-ai-mcp-*.jar 安装到当前 JADX,或通过 GUI 插件管理安装。
  • MCP Server :独立于 JADX,仅需 Python 3.10+ 与 uv(或 pip)安装依赖;通过 uv run jadx_mcp_server.py 启动。

四、部署方式

4.1 前置依赖

  • JADX :1.5.x 或兼容版本,需支持 jadx plugins 命令。
  • Java:11+(JADX 要求)。
  • Python:3.10+(MCP Server)。
  • uv :推荐用于运行 MCP Server(pip 也可,需自行安装 requirements.txt)。

4.2 安装 JADX 插件

Releases 下载:

  • jadx-ai-mcp-<version>.jar
  • jadx-mcp-server-<version>.zip(解压得到 jadx-mcp-server/

在 JADX 安装目录下执行(或将路径改为实际 jar 路径):

bash 复制代码
./bin/jadx plugins --install-jar /path/to/jadx-ai-mcp-6.2.0.jar

成功后会提示类似:Plugin installed: jadx-ai-mcp:null。也可通过 JADX-GUI 的插件管理界面安装该 jar。

4.3 部署 MCP Server

  1. 解压 jadx-mcp-server-*.zip 到任意目录(如 JADX 同级的 jadx-mcp-server/)。

  2. 进入目录,使用 uv 运行(推荐):首次运行会自动拉取依赖(fastmcp、httpx 等)。若用 pip:pip install -r requirements.txt 后执行 python jadx_mcp_server.py

    bash 复制代码
    cd jadx-mcp-server
    uv run jadx_mcp_server.py
  3. 若 JADX 插件改用非默认端口,需加参数:

    bash 复制代码
    uv run jadx_mcp_server.py --jadx-port 8652

4.4 配置 Cursor(或其它 MCP 客户端)

在 Cursor 中添加 MCP Server:

  • 方式一:Settings → MCP → Add new MCP server,按界面填写。
  • 方式二 :直接编辑 ~/.cursor/mcp.json(或项目级配置),增加一个 server 条目。

推荐配置(按实际路径修改):

json 复制代码
{
  "mcpServers": {
    "jadx-mcp-server": {
      "command": "/path/to/uv",
      "args": [
        "--directory",
        "/path/to/jadx-mcp-server",
        "run",
        "jadx_mcp_server.py"
      ]
    }
  }
}
  • command:本机 uv 可执行文件路径(如 /Users/xxx/.local/bin/uv)。
  • args 中的 -directory:必须是 jadx-mcp-server 所在目录的绝对路径。
  • 若插件端口非 8650,在 args 末尾追加:"--jadx-port", "8652"

保存后重启 Cursor 或重新加载 MCP,使配置生效。

4.5 可选:HTTP 模式

若需通过 HTTP 暴露 MCP(例如给非 stdio 客户端用):

bash 复制代码
uv run jadx_mcp_server.py --http
# 或指定端口
uv run jadx_mcp_server.py --http --port 9999

此时与 Cursor 的 stdio 配置不同,需按客户端文档配置连接方式。


五、使用方式与注意事项

5.1 使用顺序

  1. 先启动 JADX-GUI 并打开工程 运行 jadx-gui,打开目标 APK/AAR。插件会在 GUI 内启动 HTTP 服务(默认 8650),可在插件设置中查看或修改端口。
  2. 再在 Cursor 中使用在对话中请求"用 JADX MCP 获取 Manifest""列出所有类""分析加固"等;若 Cursor 已正确加载 jadx-mcp-server,AI 会调用相应 MCP 工具并基于返回结果分析。

5.2 MCP 工具是否对当前对话可用

  • 配置:在 Cursor 里配置了 jadx-mcp-server,只表示 Cursor 会启动该 Server 并尝试注入其工具。
  • 可见性:某次对话中 AI 是否"能看到"并调用 JADX 的 MCP 工具,由 Cursor 的 MCP 注入逻辑决定;若当前对话未注入,AI 无法主动"连接"或调用这些工具。
  • 建议:若一次对话中无法使用 JADX 工具,可尝试新开对话或检查 Cursor MCP 状态;亦可采用"从 JADX 导出工程到磁盘",由 AI 基于导出目录做静态分析"作为补充方案。

5.3 常用 MCP 工具示例(v6.x)

类别 工具示例
类/代码 fetch_current_class, get_class_source, get_all_classes, get_methods_of_class, get_smali_of_class
搜索 search_method_by_name, search_classes_by_keyword, get_method_by_name
资源 get_android_manifest, get_strings, get_all_resource_file_names, get_resource_file
主应用 get_main_activity_class, get_main_application_classes_names, get_main_application_classes_code
重命名 rename_class, rename_method, rename_field, rename_package, rename_variable
引用 xrefs_to_class, xrefs_to_method, xrefs_to_field
调试 debug_get_stack_frames, debug_get_threads, debug_get_variables

更多工具与参数见 官方 README


六、小结

  • 原理:JADX 插件在 GUI 内提供 HTTP API,Python MCP Server 用 FastMCP 暴露为 MCP 工具并转发请求到插件,从而让 Cursor 等客户端能对"当前在 JADX 中打开的项目"做查询与分析。
  • 部署:安装插件到 JADX → 解压并配置 jadx-mcp-server(uv run)→ 在 Cursor 的 MCP 配置中填写 command/args(及可选 jadx-port)。
  • 使用:先打开 JADX-GUI 并加载 APK,再在 Cursor 中通过自然语言或显式工具调用进行分析;若当前对话未注入 MCP 工具,可换新对话或改用导出工程目录做分析。

参考


与GhidraMCP同样的情况,cursor甚至无法连上jadx的mcp服务,cladue可以直接连上进行分析;

后续使用更新,不知道是不是插件的问题,服务重启后,就很难连上jadx的mcp服务,建议还是通过jadx把项目导出来,然后导入到cursor或者其他代码编辑器,然后再通过调用插件的方式来分析,这样简单点。

漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。

相关推荐
冬奇Lab2 小时前
Android 15音频子系统(五):AudioPolicyService策略管理深度解析
android·音视频开发·源码阅读
亚历克斯神3 小时前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
dalancon4 小时前
SurfaceControl 的事务提交给 SurfaceFlinger,以及 SurfaceFlinger 如何将这些数据设置到对应 Layer 的完整流程
android
dalancon4 小时前
SurfaceFlinger Layer 到 HWC 通信流程详解
android
cccccc语言我来了4 小时前
Linux(9)操作系统
android·java·linux
yige455 小时前
【MySQL】MySQL内置函数--日期函数字符串函数数学函数其他相关函数
android·mysql·adb
洞见前行5 小时前
AI 当逆向工程师:Claude Code 自主分析 APK 和 so 文件,解决 Unity 插件化启动崩溃
android·人工智能
努力进修6 小时前
旧安卓手机别扔!用KSWEB搭个人博客,搭配外网访问超香
android·智能手机·cpolar
范特西林6 小时前
一文看懂Android SELinux 策略,从“拒绝”到“允许”的距离
android