JADX-AI-MCP:基于MCP协议为Android逆向工程注入AI智能
2026/5/6 16:22:42 网站建设 项目流程

1. 项目概述与核心价值

如果你和我一样,常年泡在移动安全分析和逆向工程里,那你肯定对JADX不陌生。这个开源工具几乎是每个Android安全研究员和逆向工程师的“瑞士军刀”,能把一个APK文件里的DEX字节码反编译成我们看得懂的Java代码。但说实话,面对一个动辄几十上百个类、代码逻辑错综复杂的应用,手动去梳理关键类、定位漏洞点、理解业务逻辑,依然是个耗时费力的体力活。你得在JADX的GUI里不停地点击、跳转、搜索,大脑还得在“代码阅读”和“安全分析”两个模式间高速切换。

JADX-AI-MCP这个项目,就是来解决这个痛点的。它不是一个独立的新工具,而是一个给JADX“装上大脑”的插件系统。它的核心思路非常巧妙:把JADX这个强大的静态分析引擎,通过Model Context Protocol(MCP)桥接到像Claude、GPT这样的现代大语言模型(LLM)上。简单来说,它让AI助手能“看见”你正在JADX里分析的代码上下文,并允许你通过自然语言直接指挥AI帮你干活。

想象一下这个场景:你在JADX里打开一个APK,浏览到一个疑似处理用户登录的LoginActivity。传统方式下,你需要自己一行行看代码,判断有没有硬编码密钥、逻辑漏洞或者不安全的网络请求。现在,你只需要在Claude的聊天框里输入:“分析当前选中的这个类,检查其中是否存在硬编码的敏感信息或潜在的安全漏洞。” 几秒钟后,AI就会基于它“看到”的完整类代码,给你一份结构化的分析报告,指出SharedPreferences存储了明文密码、某个HttpURLConnection没有使用TLS等问题。

这个项目的价值,远不止是“让AI读代码”。它通过一套精心设计的MCP工具集,把JADX内部的数据模型和能力——比如获取当前选中类、搜索方法、获取Smali代码、甚至重命名符号——都暴露给了AI。这意味着AI不仅能“看”,还能在一定程度上“操作”JADX。你可以让它帮你批量重命名一堆混淆后的类名和方法名,让它搜索所有调用了Cipher.getInstance的地方来检查加密实现,或者在你调试APK时,让它实时分析堆栈帧和变量状态,判断执行流是否异常。

从技术架构上看,它分为两部分:

  1. JADX-AI-MCP插件:一个Java开发的JADX GUI插件。它内嵌了一个轻量级的HTTP服务器(默认端口8650),负责接收来自MCP Server的指令,调用JADX丰富的API来执行具体的操作(如获取代码、搜索、重命名),并将结果返回。
  2. JADX-MCP-Server:一个用Python编写的独立MCP服务器。它使用FastMCP框架,实现了MCP协议,并作为AI客户端(如Claude Desktop)和JADX插件之间的“翻译官”和“调度中心”。它定义了AI可以调用的工具列表,并将AI的自然语言请求转换成对JADX插件的HTTP调用。

这套组合拳,把逆向工程从纯手动、经验驱动的模式,部分升级到了“人机协同”的智能辅助模式。对于安全审计(SAST/VAPT),它能显著提升漏洞挖掘的效率和覆盖面;对于逆向分析,它能加速对复杂代码逻辑的理解;对于代码审计,它则是一个不知疲倦的初级审计员,帮你完成第一轮的代码筛查。

2. 核心架构与工作原理深度解析

要真正用好JADX-AI-MCP,不能只停留在“安装即用”的层面。理解其内部如何运作,能帮助你在遇到连接问题、配置错误或者想扩展功能时,快速定位和解决。它的架构可以概括为“一个协议,两层服务,三方通信”。

2.1 Model Context Protocol (MCP):通信的基石

MCP是Anthropic公司提出的一套开放协议,旨在标准化LLM与外部工具、数据源之间的交互。你可以把它想象成LLM世界的“USB协议”或“驱动程序框架”。在JADX-AI-MCP的语境下,MCP定义了:

  • 工具(Tools):AI可以执行哪些操作。例如,get_class_source就是一个工具,AI调用它来获取指定类的源代码。
  • 资源(Resources):AI可以访问哪些静态数据(本项目目前主要使用工具)。
  • 提示词(Prompts):可复用的对话模板(本项目未使用)。

MCP服务器(即jadx-mcp-server)的角色,就是向AI客户端宣告:“我这里提供了这些工具(Tool),你(AI)可以通过调用它们来与JADX交互。” AI客户端(如Claude Desktop)在启动时会读取配置,连接到这个MCP服务器,获取工具列表。之后,当你在聊天框中输入相关指令时,AI会判断是否需要以及调用哪个工具来完成任务。

2.2 数据流与组件交互

整个系统的运行时数据流,远比简单的“AI问,JADX答”要精细。我们拆解一次完整的“获取当前类源码”请求:

  1. 用户发起请求:你在Claude Desktop中输入:“告诉我当前选中的类在做什么。”
  2. AI意图识别与工具调用:Claude的模型解析你的指令,识别出需要获取当前选中类的上下文。它发现已连接的MCP服务器提供了fetch_current_class()这个工具,于是构造一个符合MCP规范的JSON-RPC请求,通过Stdio或HTTP发送给jadx-mcp-server
  3. MCP服务器路由与转发jadx-mcp-server(Python进程)收到请求,解析出需要调用fetch_current_class。它内部并没有JADX的代码,也不知道当前打开了哪个APK。它的任务是作为代理,向真正的执行者——JADX-AI-MCP插件发起一个HTTP请求。请求的URL可能是http://127.0.0.1:8650/fetch_current_class
  4. JADX插件执行与响应:运行在JADX GUI进程内的JADX-AI-MCP插件,其内嵌的Javalin HTTP服务器监听到这个请求。插件通过JADX提供的Java API(如JadxGui.getCurrentProject()JadxGui.getCurrentTab()等),获取到当前GUI中激活的代码标签页,进而定位到被选中的类节点。然后,它从JADX的底层JadxDecompiler对象中提取出该类的反编译后的Java源码,封装成JSON格式,通过HTTP响应返回给MCP服务器。
  5. 结果返回与AI整合:MCP服务器收到JADX插件的响应后,将其重新包装成MCP协议规定的格式,通过Stdio/HTTP返回给Claude Desktop。Claude收到结构化的代码数据,结合其自身的代码理解能力,生成一段针对该类的自然语言分析,最终呈现给你。

这个过程的关键在于解耦:AI客户端只与标准的MCP服务器通信;MCP服务器只负责协议转换和请求转发;JADX插件则专注于利用JADX的API执行具体操作。这种设计使得支持新的AI客户端(只要支持MCP)或为JADX插件增加新功能,都相对独立。

2.3 核心MCP工具集详解

jadx-mcp-server目前提供了二十多个工具,我们可以将其分为几大类来理解其能力边界:

代码查看与导航类工具:

  • fetch_current_class(): 获取当前在JADX GUI中选中类的名称和完整源码。这是最常用、最核心的工具,为AI提供了即时上下文。
  • get_selected_text(): 获取当前在代码编辑器中选择的文本片段。用于更精细的代码片段分析。
  • get_all_classes(): 列出项目中所有类的名称。用于项目概览或批量操作的前置步骤。
  • get_class_source(class_name): 根据类名获取指定类的源码。当AI需要查看非当前选中的其他类时使用。
  • get_method_by_name(class_name, method_name): 获取某个类中特定方法的源码。
  • get_methods_of_class(class_name): 列出指定类的所有方法名。
  • get_fields_of_class(class_name): 列出指定类的所有字段名。

实操心得fetch_current_classget_selected_text是“交互式分析”的利器。你可以先自己在JADX里浏览,看到感兴趣的代码块就选中,然后让AI针对选中的部分进行深入分析,这样比让AI漫无目的地搜索整个项目要高效得多。

搜索与发现类工具:

  • search_method_by_name(method_name): 全局搜索方法名。对于寻找特定的API调用(如getDeviceId)非常有用。
  • search_classes_by_keyword(keyword): 在类的源码中搜索包含特定关键词的类。支持分页,适合在大型项目中定位功能模块(如所有包含“payment”、“encrypt”关键词的类)。
  • xrefs_to_class(class_name): 查找对某个类的所有引用(交叉引用)。这是逆向工程中理清类之间调用关系的关键。
  • xrefs_to_method(class_name, method_name): 查找对某个特定方法的所有引用,包括重写关系。
  • xrefs_to_field(class_name, field_name): 查找对某个字段的所有访问。

应用元数据与资源类工具:

  • get_android_manifest(): 获取AndroidManifest.xml的完整内容。这是了解应用权限、组件(Activity、Service等)、包名等信息的入口。
  • get_main_activity_class(): 直接从Manifest中解析并返回主Activity的类代码。分析应用往往从这里开始。
  • get_main_application_classes_code(): 获取主应用包名下所有类的代码。有助于快速聚焦于应用的核心业务逻辑,排除第三方库干扰。
  • get_strings(): 获取res/values/strings.xml的内容。硬编码的字符串、API端点、密钥有时会藏在这里。
  • get_all_resource_file_names()/get_resource_file(file_name): 浏览和读取任意资源文件。

代码重构与交互类工具:

  • rename_class(old_name, new_name): 重命名类。AI可以建议将混淆的类名(如a.a.a.c)改为有意义的名称(如com.example.network.HttpClient),JADX插件会通过API执行重命名,并更新GUI视图。这是将AI的“理解”转化为实际行动的体现。
  • rename_method,rename_field,rename_package,rename_variable: 类似地,重命名方法、字段、包和局部变量。

调试辅助类工具:

  • debug_get_stack_frames(),debug_get_threads(),debug_get_variables(): 当你在JADX中使用其内置调试器调试APK时,这些工具可以获取实时的堆栈帧、线程和变量信息。AI可以基于这些动态数据,分析程序执行流、判断变量值是否异常,实现动态分析与静态分析的结合。

这套工具集共同构建了一个强大的“远程控制”接口,让AI不仅能被动地读取代码,还能主动地探索、搜索、甚至修改JADX中的项目视图,极大地扩展了人机协作的深度。

3. 从零开始:完整安装与配置指南

理论讲完了,我们上手实操。我会带你走通最常用的Claude Desktop配置路径,并解释每个步骤背后的原因,确保你一次成功。

3.1 环境准备与组件下载

首先,确保你的基础环境符合要求:

  • Java 11+: JADX本身需要Java运行环境。去Oracle或AdoptOpenJDK官网下载安装即可。
  • Python 3.10+: 用于运行jadx-mcp-server。建议使用pyenvconda管理Python版本,避免系统Python冲突。
  • JADX GUI: 从 JADX GitHub Releases 下载最新版的jadx-gui-*.zip,解压即可运行。这是我们的主战场。

接下来,获取JADX-AI-MCP的两个核心组件。我强烈建议从GitHub Releases页面下载预编译的版本,这比从源码构建要简单可靠得多。

  1. 访问 JADX-AI-MCP Releases 。
  2. 下载两个文件:
    • jadx-ai-mcp-<version>.jar: 这是JADX GUI插件。
    • jadx-mcp-server-<version>.zip: 这是Python MCP服务器,解压后是一个包含jadx_mcp_server.pyrequirements.txt的目录。

注意事项:请务必下载版本号相同的两个文件。不同版本间的协议或API可能有细微差别,混用可能导致连接失败。

3.2 安装JADX-AI-MCP插件

安装插件有两种主流方法,GUI安装法更直观,命令行一劳永逸。

方法一:通过JADX GUI安装(推荐给新手)

  1. 启动JADX GUI (./jadx-guijadx-gui.bat)。
  2. 点击顶部菜单栏的Plugins->Plugin Manager
  3. 在打开的插件管理器窗口中,点击右下角的Install from disk...按钮。
  4. 在弹出的文件选择器中,找到你刚才下载的jadx-ai-mcp-<version>.jar文件,选中并打开。
  5. 插件管理器列表里应该会出现“JADX AI MCP”。确保其前面的复选框被勾选(表示已启用)。
  6. 关闭插件管理器。通常需要重启JADX GUI才能使插件完全生效

方法二:通过命令行安装(适合自动化或远程环境)如果你熟悉命令行,或者需要在无头环境中配置,可以使用JADX内置的命令行插件管理工具。假设你的jadx命令在系统PATH中,或者你位于JADX的解压目录下,执行:

jadx plugins --install "github:zinja-coder:jadx-ai-mcp"

这条命令会直接从GitHub仓库拉取并安装最新版本的插件,无需手动下载.jar文件。安装后,同样需要重启JADX GUI。

验证插件安装成功:重启JADX GUI后,查看顶部菜单栏,如果多出了一个AI MCP的菜单项,并且其下有SettingsRestart ServerServer Status等子项,就说明插件安装并加载成功了。点击Server Status,如果显示服务器正在运行(默认端口8650),则插件已就绪。

3.3 配置与启动JADX-MCP-Server

MCP服务器是独立于JADX的Python进程。我们使用uv这个更快的Python包管理器和运行器,它能更好地处理依赖和环境隔离。

  1. 解压并进入目录

    unzip jadx-mcp-server-<version>.zip cd jadx-mcp-server
  2. 安装uv(如果尚未安装)

    # Linux/macOS curl -LsSf https://astral.sh/uv/install.sh | sh # 安装后,重启你的终端或执行 source ~/.bashrc (或对应shell的配置文件) # Windows (Powershell) powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
  3. (可选但推荐)创建虚拟环境并安装依赖: 虽然uv run可以直接运行并管理依赖,但显式创建虚拟环境能让环境更干净。

    uv venv # 激活虚拟环境 # Linux/macOS: source .venv/bin/activate # Windows: .venv\Scripts\activate # 安装项目依赖 uv pip install -r requirements.txt

    requirements.txt里主要包含fastmcphttpx两个核心库。

  4. 以Stdio模式启动MCP服务器(用于Claude Desktop): 这是最常用的模式,MCP服务器通过标准输入输出与AI客户端通信。

    uv run jadx_mcp_server.py

    如果一切正常,你会在终端看到启动成功的日志,服务器会持续运行并等待连接。保持这个终端窗口打开

3.4 配置Claude Desktop连接MCP服务器

这是连接的最后一步,也是容易出错的一步。我们需要告诉Claude Desktop去哪里找我们刚启动的MCP服务器。

  1. 找到Claude Desktop的配置文件。它的位置因操作系统而异:

    • macOS:~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows:%APPDATA%\Claude\claude_desktop_config.json
    • Linux:~/.config/Claude/claude_desktop_config.json如果文件或目录不存在,手动创建即可。
  2. 编辑配置文件。你需要指定MCP服务器的启动命令。关键是commandargs字段,它们告诉Claude如何启动这个服务器进程。

    { "mcpServers": { "jadx-mcp-server": { "command": "/绝对/路径/.venv/bin/uv", "args": [ "--directory", "/绝对/路径/jadx-mcp-server/", "run", "jadx_mcp_server.py" ] } } }

    重要参数解释

    • command: 这里必须填写uv可执行文件的绝对路径。如果你使用了虚拟环境,就像上面例子一样,指向虚拟环境里的uv。如果你全局安装了uv,可以用which uv(Linux/macOS)或where uv(Windows)命令找到它的路径。
    • args:--directory参数指定了jadx_mcp_server.py脚本所在的工作目录,runuv的子命令,后面跟着要执行的脚本名。

    避坑技巧:Windows用户特别注意路径中的反斜杠\需要转义为\\,或者直接使用正斜杠/。例如:"C:\\Users\\YourName\\.venv\\Scripts\\uv.exe""C:/Users/YourName/.venv/Scripts/uv.exe"

  3. 保存配置文件并重启Claude Desktop。配置文件的更改在Claude Desktop重启后生效。

  4. 验证连接:重启Claude Desktop后,新建一个对话。如果你在输入框附近看到一个小锤子图标(🛠️),点击它,在弹出的面板中应该能看到名为“jadx-mcp-server”的服务器,并且其状态是已连接(通常显示工具数量)。这表明Claude已经成功发现了我们的MCP服务器并加载了其工具。

3.5 完整工作流验证

现在,让我们串联起所有组件,完成一次端到端的测试:

  1. 启动JADX GUI:打开JADX,加载一个你想要分析的APK文件(可以是任何你拥有合法分析权限的APK)。
  2. 确保插件运行:在JADX中,点击AI MCP->Server Status,确认HTTP服务器正在运行(默认127.0.0.1:8650)。
  3. 启动MCP服务器:在一个终端中,进入jadx-mcp-server目录,执行uv run jadx_mcp_server.py,保持运行。
  4. 启动并验证Claude Desktop:打开Claude Desktop,确认小锤子图标处已连接jadx-mcp-server
  5. 执行第一个AI指令:在JADX GUI的代码浏览面板中,点击选中任意一个类。然后切换到Claude Desktop,输入提示词:
    fetch_current_class
    或者更自然一点:
    请获取我当前在JADX中选中的类,并简要说明这个类的主要功能。
  6. 观察结果:Claude应该会调用fetch_current_class工具,从JADX插件获取到类的源码,并生成一段分析文字。你可能会第一次看到一个权限请求弹窗(Claude请求访问MCP工具),点击允许。

如果以上步骤都成功,恭喜你,JADX-AI-MCP已经成功部署!你已经建立了一个强大的AI辅助逆向分析环境。

4. 高级配置、网络模式与安全考量

基础配置能满足单机使用。但在一些复杂场景下,比如JADX运行在远程虚拟机、Docker容器,或者你想让团队其他成员也能连接你的分析环境,就需要了解更高级的网络配置。

4.1 HTTP模式 vs Stdio模式

之前我们用的是Stdio模式,这是MCP的默认传输方式,通过标准输入输出流在父进程(Claude)和子进程(MCP Server)间通信。它简单、无需网络,适合本地单机。

HTTP模式则让MCP服务器作为一个HTTP服务运行,AI客户端通过HTTP/SSE与之通信。这带来了两个关键优势:

  1. 跨进程/跨机器:MCP服务器可以独立运行,AI客户端(甚至是远程的)可以通过网络连接它。
  2. 客户端兼容性更广:一些不支持Stdio MCP的AI客户端或自定义脚本,可以通过HTTP协议轻松集成。

启动HTTP模式很简单,在启动命令后加上--http参数:

uv run jadx_mcp_server.py --http

默认情况下,服务器会监听127.0.0.1:8651。你可以通过--host--port参数修改绑定地址和端口。

4.2 理解双通道网络配置

这是配置中最容易混淆的部分。JADX-AI-MCP系统涉及两个独立的网络连接,分别由两组参数控制:

[AI Client (Claude)] <--(--host/--port)--> [MCP Server] <--(--jadx-host/--jadx-port)--> [JADX Plugin]
  • --host--port:定义MCP服务器在哪里监听AI客户端的连接。例如,--host 0.0.0.0 --port 9999意味着MCP服务器在本机的所有IP地址的9999端口上监听,允许网络中其他机器上的Claude连接过来。
  • --jadx-host--jadx-port:定义MCP服务器如何连接JADX插件。默认是127.0.0.1:8650,即连接本机JADX。如果你的JADX运行在另一台IP为192.168.1.100的机器上,且插件端口是默认的8650,你就需要设置--jadx-host 192.168.1.100

4.3 典型部署场景与配置示例

场景A:所有组件在同一台电脑(开发机)这是最简单的场景,使用默认配置或Stdio模式即可。

# Stdio模式 (Claude Desktop) uv run jadx_mcp_server.py # HTTP模式 (其他客户端) uv run jadx_mcp_server.py --http # MCP Server监听 127.0.0.1:8651,连接JADX插件于 127.0.0.1:8650

场景B:JADX在远程Linux服务器,Claude在本地Windows/Mac你在一台性能强大的Linux服务器上用JADX分析大型APK,但想在本地舒适的图形界面下用Claude操作。

  1. 在Linux服务器上
    • 运行JADX GUI并安装好插件。
    • 运行MCP服务器,并绑定到服务器的局域网IP,以便本地能访问。
    uv run jadx_mcp_server.py --http --host 192.168.1.100 --port 8651
    (假设服务器内网IP是192.168.1.100)
  2. 在本地电脑的Claude配置中
    { "mcpServers": { "jadx-remote-server": { "command": "curl", // 或者任何能发起HTTP请求的占位符,但Claude Desktop可能不支持直接HTTP配置。更常见的是用SSH隧道。 "args": [] // 实际配置可能更复杂 } } }
    更实用的方法是使用SSH隧道,将远程服务器的MCP端口映射到本地:
    # 在本地终端执行 ssh -L 8651:127.0.0.1:8651 user@192.168.1.100
    这条命令使得访问本地的8651端口相当于访问服务器上的8651端口。然后,在本地Claude配置中,MCP服务器地址配置为127.0.0.1:8651即可。这是最安全、最推荐的方式。

场景C:在Docker容器中运行MCP Server为了环境隔离和一致性,你可以将jadx-mcp-server打包进Docker。

# Dockerfile 示例 FROM python:3.11-slim RUN pip install uv WORKDIR /app COPY . . RUN uv venv && .venv/bin/pip install -r requirements.txt CMD ["/app/.venv/bin/uv", "run", "jadx_mcp_server.py", "--http", "--host", "0.0.0.0"]

构建并运行容器,并将容器端口映射到主机:

docker build -t jadx-mcp-server . docker run -p 8651:8651 jadx-mcp-server

此时,MCP服务器在容器内运行,监听所有接口。你需要确保容器内的MCP服务器能访问到宿主机上JADX插件的端口(--jadx-host需要设置为宿主机的IP,如host.docker.internal(Docker Desktop)或宿主机实际IP)。

4.4 安全警告与最佳实践

⚠️ 重要安全警告:当使用--host 0.0.0.0将MCP服务器暴露在网络上时,你必须意识到以下风险:

  • 无认证:任何能访问该IP和端口的人都可以调用所有MCP工具。
  • 无加密:HTTP模式下的通信是明文的,可能被窃听。
  • 高权限:攻击者可以通过工具读取你正在分析的所有代码,甚至重命名项目中的元素,造成破坏。

安全实践建议

  1. 最小化暴露:除非必要,永远不要使用--host 0.0.0.0。优先使用127.0.0.1
  2. 使用SSH隧道:这是连接远程服务最安全的方式,既提供了加密通道,又无需服务端暴露端口到公网。
  3. 防火墙规则:如果必须在局域网内暴露,使用主机防火墙(如ufwiptables、Windows防火墙)严格限制源IP地址,只允许可信的客户端IP连接。
  4. 使用VPN:在团队环境中,将分析机器和客户端置于同一个VPN网络内,再进行局域网访问。
  5. 定期更新:关注项目更新,及时修复可能的安全漏洞。

5. 实战技巧:高效利用AI进行逆向与安全分析

配置好了环境,我们来聊聊怎么真正用它来提升效率。下面是一些我实践中总结的高效工作流和提示词(Prompt)技巧。

5.1 逆向工程中的高效提示词模板

直接问“分析这个APK”太宽泛。好的提示词应该具体、有上下文、有明确指令。

1. 快速理解代码结构:

  • 模糊类名理解:“我选中了一个名为a.b.c.d的类。根据其字段和方法名,推断它可能是什么功能模块(例如:网络请求、数据存储、UI组件),并建议一个更合适的类名。”
  • 理清类关系:“获取当前类MainActivity的源码。然后,使用xrefs_to_class工具找出所有引用MainActivity的其他类,并简要说明它们之间的关系(例如,哪个是Fragment,哪个是Adapter)。”
  • 梳理包结构:“使用get_all_classes工具列出所有类,然后按包名进行分类。找出包名中最常见的顶级域名(如com.example),这很可能就是应用的主包。然后使用get_main_application_classes_code获取该包下所有类的代码,为我总结这个应用的核心功能模块。”

2. 漏洞挖掘与安全审计(SAST):

  • 硬编码凭证扫描:“分析当前类的源码,寻找任何可能硬编码的字符串,如passwordkeysecrettokenapi。特别关注看起来像Base64编码的字符串、MD5/SHA1哈希,或者类似AES/ECB/PKCS5Padding的加密算法标识符。将可疑的字符串和其所在行号列出来。”
  • 不安全API检查:“搜索当前项目中所有调用了HttpURLConnectionHttpClient(Android旧版)或WebView相关方法的类。对于每个找到的类,检查其是否使用了HTTPS(https://),以及是否忽略了证书验证(搜索TrustManagerHostnameVerifier相关代码)。”
  • 输入验证与注入:“检查当前类中所有从IntentBundleSharedPreferences或网络获取数据的地方。分析这些数据在使用前(比如拼接成SQL语句、传递给Runtime.exec()、加载到WebView)是否经过了适当的验证、过滤或编码。”
  • 权限滥用分析:“获取AndroidManifest.xml内容,列出所有声明的危险权限(android.permission.)。然后,针对READ_SMSACCESS_FINE_LOCATION等敏感权限,使用search_classes_by_keyword工具搜索使用了相关API(如SmsManagerLocationManager)的类,检查其使用是否合理,是否有过度收集的嫌疑。”

3. 辅助代码重构与反混淆:

  • 批量重命名:“这个类里有很多单字母的变量名(如a,b,c)和意义不明的方法名(如a())。请根据方法的代码逻辑和上下文,为这个类中的所有方法和字段建议一个更具描述性的名称。以表格形式输出,包含旧名称、建议的新名称和理由。”(注意:AI只能建议,实际重命名需要你手动操作或调用rename_*工具,但AI的建议可以极大节省你的脑力。)
  • 逻辑还原:“这个decrypt方法看起来是自定义的加密算法。请分析其字节操作(XOR, 移位等)流程,并用清晰的步骤描述这个解密算法是如何工作的。如果可能,将其重写为一个更易读的伪代码或Python函数。”

5.2 结合调试器的动态分析

静态分析看代码,动态分析看行为。JADX内置了调试器,而AI MCP插件能获取调试状态,实现动静态结合。

  1. 在JADX中配置好调试环境(设置断点,启动调试)。
  2. 当程序在断点处暂停时,在Claude中输入:
    使用debug_get_stack_frames、debug_get_threads和debug_get_variables工具,获取当前的调试状态。基于堆栈调用链和关键变量的值,分析程序执行到此处的原因,并判断是否有异常行为(如变量被篡改、执行流意外跳转)。
  3. AI可以告诉你当前在哪个类的哪个方法,局部变量和成员变量的值是什么,从而帮你快速理解复杂的运行时状态。

5.3 处理大型项目的策略

面对一个包含数千个类的大型APK,让AI一次性分析所有内容是不现实的。

  1. 分层聚焦:先用get_android_manifestget_main_application_classes_names找到入口点和核心包。优先分析这些核心类。
  2. 关键词引导搜索:使用search_classes_by_keywordsearch_method_by_name,针对你的目标(如“支付”、“登录”、“加密”)进行聚焦搜索,而不是漫无目的地浏览。
  3. 分块分析:让AI一次只分析一个类或一个方法。例如:“获取PaymentProcessor类的processPayment方法源码,分析其网络请求和数据处理逻辑,重点关注是否有逻辑漏洞或敏感信息泄露。”
  4. 利用交叉引用:当你找到一个关键方法(如savePassword)后,立即使用xrefs_to_method找出所有调用它的地方,快速评估漏洞的影响范围。

5.4 常见问题与排查实录

即使按照指南操作,你也可能会遇到一些问题。这里记录一些我踩过的坑和解决方法。

问题1:Claude Desktop中看不到小锤子图标/MCP服务器连接失败。

  • 检查配置文件路径和格式:确保claude_desktop_config.json文件在正确的位置,并且是合法的JSON格式(可以用在线JSON校验工具检查)。一个多余的逗号都可能导致整个配置被忽略。
  • 检查命令路径command中的uv路径必须是绝对路径,并且该路径下的uv可执行文件确实存在且有执行权限。
  • 查看Claude Desktop日志:Claude Desktop通常会在其应用数据目录下生成日志文件。查看日志中是否有关于加载MCP服务器的错误信息(如“无法启动子进程”、“命令未找到”)。
  • 手动测试MCP服务器:在终端中,直接运行你在配置文件中写的完整命令(如/path/to/uv --directory /path/to/jadx-mcp-server run jadx_mcp_server.py),看是否能正常启动,不报错。

问题2:AI调用工具后返回“连接JADX插件失败”或超时。

  • 确认JADX插件已启动:在JADX GUI中点击AI MCP->Server Status,确认HTTP服务器状态是“Running”。
  • 检查端口占用:默认端口8650可能被其他程序占用。你可以在JADX插件设置中修改端口,并同步修改MCP服务器启动命令中的--jadx-port参数。
  • 检查防火墙:如果MCP服务器和JADX不在同一台机器,确保两台机器间的相应端口(默认8650和8651)在防火墙中是开放的。
  • 验证网络连通性:在运行MCP服务器的机器上,用curltelnet命令测试是否能连接到JADX插件的主机和端口。例如:telnet 192.168.1.100 8650

问题3:AI返回的结果不准确或不符合预期。

  • 提供更精确的上下文:AI工具获取的是纯文本代码,缺乏项目级的语义信息(如整个调用链)。你的提示词需要更精确。例如,不要只说“分析漏洞”,而要说“分析这个LoginActivity类中的onCreate方法,检查从EditText获取密码到通过HTTP发送出去的过程中,是否存在明文存储或传输的风险”。
  • 分步引导:对于复杂任务,不要指望AI一步到位。先让它“获取当前类所有方法”,然后你选中一个可疑方法,再让它“获取这个方法的具体代码并分析”。
  • 理解AI的局限性:当前的AI是强大的模式匹配和代码理解工具,但并非真正的“黑客”。它可能遗漏某些深层次的逻辑漏洞,也可能产生“幻觉”(编造不存在的代码或问题)。它的分析结果应作为高级线索和辅助,最终的判断和验证仍需由你这位安全专家来完成。

问题4:重命名(rename)工具执行后,JADX GUI没有立即刷新。

  • 这是正常现象。JADX的UI刷新有时需要手动触发。尝试在代码面板点击一下,或者按F5刷新当前标签页。重命名操作是直接修改JADX内部的项目模型,保存项目时会生效。

将JADX-AI-MCP集成到你的工作流中,初期可能需要一点适应成本,但一旦熟悉了这种“对话式”分析,你会发现它就像多了一个不知疲倦、知识渊博的助手。它不能替代你的专业知识和经验,但能极大地放大你的效率,帮你从繁琐的代码浏览和初步筛选中解放出来,更专注于那些真正需要人类智慧和创造力的深度分析环节。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询