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时,让它实时分析堆栈帧和变量状态,判断执行流是否异常。
从技术架构上看,它分为两部分:
- JADX-AI-MCP插件:一个Java开发的JADX GUI插件。它内嵌了一个轻量级的HTTP服务器(默认端口8650),负责接收来自MCP Server的指令,调用JADX丰富的API来执行具体的操作(如获取代码、搜索、重命名),并将结果返回。
- 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答”要精细。我们拆解一次完整的“获取当前类源码”请求:
- 用户发起请求:你在Claude Desktop中输入:“告诉我当前选中的类在做什么。”
- AI意图识别与工具调用:Claude的模型解析你的指令,识别出需要获取当前选中类的上下文。它发现已连接的MCP服务器提供了
fetch_current_class()这个工具,于是构造一个符合MCP规范的JSON-RPC请求,通过Stdio或HTTP发送给jadx-mcp-server。 - MCP服务器路由与转发:
jadx-mcp-server(Python进程)收到请求,解析出需要调用fetch_current_class。它内部并没有JADX的代码,也不知道当前打开了哪个APK。它的任务是作为代理,向真正的执行者——JADX-AI-MCP插件发起一个HTTP请求。请求的URL可能是http://127.0.0.1:8650/fetch_current_class。 - JADX插件执行与响应:运行在JADX GUI进程内的
JADX-AI-MCP插件,其内嵌的Javalin HTTP服务器监听到这个请求。插件通过JADX提供的Java API(如JadxGui.getCurrentProject(),JadxGui.getCurrentTab()等),获取到当前GUI中激活的代码标签页,进而定位到被选中的类节点。然后,它从JADX的底层JadxDecompiler对象中提取出该类的反编译后的Java源码,封装成JSON格式,通过HTTP响应返回给MCP服务器。 - 结果返回与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_class和get_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。建议使用pyenv或conda管理Python版本,避免系统Python冲突。 - JADX GUI: 从 JADX GitHub Releases 下载最新版的
jadx-gui-*.zip,解压即可运行。这是我们的主战场。
接下来,获取JADX-AI-MCP的两个核心组件。我强烈建议从GitHub Releases页面下载预编译的版本,这比从源码构建要简单可靠得多。
- 访问 JADX-AI-MCP Releases 。
- 下载两个文件:
jadx-ai-mcp-<version>.jar: 这是JADX GUI插件。jadx-mcp-server-<version>.zip: 这是Python MCP服务器,解压后是一个包含jadx_mcp_server.py和requirements.txt的目录。
注意事项:请务必下载版本号相同的两个文件。不同版本间的协议或API可能有细微差别,混用可能导致连接失败。
3.2 安装JADX-AI-MCP插件
安装插件有两种主流方法,GUI安装法更直观,命令行一劳永逸。
方法一:通过JADX GUI安装(推荐给新手)
- 启动JADX GUI (
./jadx-gui或jadx-gui.bat)。 - 点击顶部菜单栏的
Plugins->Plugin Manager。 - 在打开的插件管理器窗口中,点击右下角的
Install from disk...按钮。 - 在弹出的文件选择器中,找到你刚才下载的
jadx-ai-mcp-<version>.jar文件,选中并打开。 - 插件管理器列表里应该会出现“JADX AI MCP”。确保其前面的复选框被勾选(表示已启用)。
- 关闭插件管理器。通常需要重启JADX GUI才能使插件完全生效。
方法二:通过命令行安装(适合自动化或远程环境)如果你熟悉命令行,或者需要在无头环境中配置,可以使用JADX内置的命令行插件管理工具。假设你的jadx命令在系统PATH中,或者你位于JADX的解压目录下,执行:
jadx plugins --install "github:zinja-coder:jadx-ai-mcp"这条命令会直接从GitHub仓库拉取并安装最新版本的插件,无需手动下载.jar文件。安装后,同样需要重启JADX GUI。
验证插件安装成功:重启JADX GUI后,查看顶部菜单栏,如果多出了一个AI MCP的菜单项,并且其下有Settings、Restart Server、Server Status等子项,就说明插件安装并加载成功了。点击Server Status,如果显示服务器正在运行(默认端口8650),则插件已就绪。
3.3 配置与启动JADX-MCP-Server
MCP服务器是独立于JADX的Python进程。我们使用uv这个更快的Python包管理器和运行器,它能更好地处理依赖和环境隔离。
解压并进入目录:
unzip jadx-mcp-server-<version>.zip cd jadx-mcp-server安装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"(可选但推荐)创建虚拟环境并安装依赖: 虽然
uv run可以直接运行并管理依赖,但显式创建虚拟环境能让环境更干净。uv venv # 激活虚拟环境 # Linux/macOS: source .venv/bin/activate # Windows: .venv\Scripts\activate # 安装项目依赖 uv pip install -r requirements.txtrequirements.txt里主要包含fastmcp和httpx两个核心库。以Stdio模式启动MCP服务器(用于Claude Desktop): 这是最常用的模式,MCP服务器通过标准输入输出与AI客户端通信。
uv run jadx_mcp_server.py如果一切正常,你会在终端看到启动成功的日志,服务器会持续运行并等待连接。保持这个终端窗口打开。
3.4 配置Claude Desktop连接MCP服务器
这是连接的最后一步,也是容易出错的一步。我们需要告诉Claude Desktop去哪里找我们刚启动的MCP服务器。
找到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如果文件或目录不存在,手动创建即可。
- macOS:
编辑配置文件。你需要指定MCP服务器的启动命令。关键是
command和args字段,它们告诉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脚本所在的工作目录,run是uv的子命令,后面跟着要执行的脚本名。
避坑技巧:Windows用户特别注意路径中的反斜杠
\需要转义为\\,或者直接使用正斜杠/。例如:"C:\\Users\\YourName\\.venv\\Scripts\\uv.exe"或"C:/Users/YourName/.venv/Scripts/uv.exe"。保存配置文件并重启Claude Desktop。配置文件的更改在Claude Desktop重启后生效。
验证连接:重启Claude Desktop后,新建一个对话。如果你在输入框附近看到一个小锤子图标(🛠️),点击它,在弹出的面板中应该能看到名为“jadx-mcp-server”的服务器,并且其状态是已连接(通常显示工具数量)。这表明Claude已经成功发现了我们的MCP服务器并加载了其工具。
3.5 完整工作流验证
现在,让我们串联起所有组件,完成一次端到端的测试:
- 启动JADX GUI:打开JADX,加载一个你想要分析的APK文件(可以是任何你拥有合法分析权限的APK)。
- 确保插件运行:在JADX中,点击
AI MCP->Server Status,确认HTTP服务器正在运行(默认127.0.0.1:8650)。 - 启动MCP服务器:在一个终端中,进入
jadx-mcp-server目录,执行uv run jadx_mcp_server.py,保持运行。 - 启动并验证Claude Desktop:打开Claude Desktop,确认小锤子图标处已连接
jadx-mcp-server。 - 执行第一个AI指令:在JADX GUI的代码浏览面板中,点击选中任意一个类。然后切换到Claude Desktop,输入提示词:
或者更自然一点:fetch_current_class请获取我当前在JADX中选中的类,并简要说明这个类的主要功能。 - 观察结果: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与之通信。这带来了两个关键优势:
- 跨进程/跨机器:MCP服务器可以独立运行,AI客户端(甚至是远程的)可以通过网络连接它。
- 客户端兼容性更广:一些不支持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操作。
- 在Linux服务器上:
- 运行JADX GUI并安装好插件。
- 运行MCP服务器,并绑定到服务器的局域网IP,以便本地能访问。
(假设服务器内网IP是192.168.1.100)uv run jadx_mcp_server.py --http --host 192.168.1.100 --port 8651 - 在本地电脑的Claude配置中:
更实用的方法是使用SSH隧道,将远程服务器的MCP端口映射到本地:{ "mcpServers": { "jadx-remote-server": { "command": "curl", // 或者任何能发起HTTP请求的占位符,但Claude Desktop可能不支持直接HTTP配置。更常见的是用SSH隧道。 "args": [] // 实际配置可能更复杂 } } }
这条命令使得访问本地的# 在本地终端执行 ssh -L 8651:127.0.0.1:8651 user@192.168.1.1008651端口相当于访问服务器上的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模式下的通信是明文的,可能被窃听。
- 高权限:攻击者可以通过工具读取你正在分析的所有代码,甚至重命名项目中的元素,造成破坏。
安全实践建议:
- 最小化暴露:除非必要,永远不要使用
--host 0.0.0.0。优先使用127.0.0.1。 - 使用SSH隧道:这是连接远程服务最安全的方式,既提供了加密通道,又无需服务端暴露端口到公网。
- 防火墙规则:如果必须在局域网内暴露,使用主机防火墙(如
ufw、iptables、Windows防火墙)严格限制源IP地址,只允许可信的客户端IP连接。 - 使用VPN:在团队环境中,将分析机器和客户端置于同一个VPN网络内,再进行局域网访问。
- 定期更新:关注项目更新,及时修复可能的安全漏洞。
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):
- 硬编码凭证扫描:“分析当前类的源码,寻找任何可能硬编码的字符串,如
password、key、secret、token、api。特别关注看起来像Base64编码的字符串、MD5/SHA1哈希,或者类似AES/ECB/PKCS5Padding的加密算法标识符。将可疑的字符串和其所在行号列出来。” - 不安全API检查:“搜索当前项目中所有调用了
HttpURLConnection、HttpClient(Android旧版)或WebView相关方法的类。对于每个找到的类,检查其是否使用了HTTPS(https://),以及是否忽略了证书验证(搜索TrustManager、HostnameVerifier相关代码)。” - 输入验证与注入:“检查当前类中所有从
Intent、Bundle、SharedPreferences或网络获取数据的地方。分析这些数据在使用前(比如拼接成SQL语句、传递给Runtime.exec()、加载到WebView)是否经过了适当的验证、过滤或编码。” - 权限滥用分析:“获取
AndroidManifest.xml内容,列出所有声明的危险权限(android.permission.)。然后,针对READ_SMS、ACCESS_FINE_LOCATION等敏感权限,使用search_classes_by_keyword工具搜索使用了相关API(如SmsManager、LocationManager)的类,检查其使用是否合理,是否有过度收集的嫌疑。”
3. 辅助代码重构与反混淆:
- 批量重命名:“这个类里有很多单字母的变量名(如
a,b,c)和意义不明的方法名(如a())。请根据方法的代码逻辑和上下文,为这个类中的所有方法和字段建议一个更具描述性的名称。以表格形式输出,包含旧名称、建议的新名称和理由。”(注意:AI只能建议,实际重命名需要你手动操作或调用rename_*工具,但AI的建议可以极大节省你的脑力。) - 逻辑还原:“这个
decrypt方法看起来是自定义的加密算法。请分析其字节操作(XOR, 移位等)流程,并用清晰的步骤描述这个解密算法是如何工作的。如果可能,将其重写为一个更易读的伪代码或Python函数。”
5.2 结合调试器的动态分析
静态分析看代码,动态分析看行为。JADX内置了调试器,而AI MCP插件能获取调试状态,实现动静态结合。
- 在JADX中配置好调试环境(设置断点,启动调试)。
- 当程序在断点处暂停时,在Claude中输入:
使用debug_get_stack_frames、debug_get_threads和debug_get_variables工具,获取当前的调试状态。基于堆栈调用链和关键变量的值,分析程序执行到此处的原因,并判断是否有异常行为(如变量被篡改、执行流意外跳转)。 - AI可以告诉你当前在哪个类的哪个方法,局部变量和成员变量的值是什么,从而帮你快速理解复杂的运行时状态。
5.3 处理大型项目的策略
面对一个包含数千个类的大型APK,让AI一次性分析所有内容是不现实的。
- 分层聚焦:先用
get_android_manifest和get_main_application_classes_names找到入口点和核心包。优先分析这些核心类。 - 关键词引导搜索:使用
search_classes_by_keyword和search_method_by_name,针对你的目标(如“支付”、“登录”、“加密”)进行聚焦搜索,而不是漫无目的地浏览。 - 分块分析:让AI一次只分析一个类或一个方法。例如:“获取
PaymentProcessor类的processPayment方法源码,分析其网络请求和数据处理逻辑,重点关注是否有逻辑漏洞或敏感信息泄露。” - 利用交叉引用:当你找到一个关键方法(如
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服务器的机器上,用
curl或telnet命令测试是否能连接到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集成到你的工作流中,初期可能需要一点适应成本,但一旦熟悉了这种“对话式”分析,你会发现它就像多了一个不知疲倦、知识渊博的助手。它不能替代你的专业知识和经验,但能极大地放大你的效率,帮你从繁琐的代码浏览和初步筛选中解放出来,更专注于那些真正需要人类智慧和创造力的深度分析环节。