1. 深度混淆的 Java 程序为什么让 JADX 也犯难
JADX 是逆向 Java 程序时最常用的反编译工具之一,它能把 dex、apk、jar 里的字节码还原成接近源码的 Java 代码。但当你面对一个经过深度加密混淆的样本时,JADX 给出的结果往往惨不忍睹:类名、方法名、变量名被批量替换成if、else、for、static、throw这类 Java 关键字,反编译出来的代码导入 IDEA 后满屏语法错误,既不能编译,也几乎没法阅读。
我最近在分析一个早期版本的 Burp Suite 时,就遇到了这种情况。它的发包模块实现非常稳定,某些特定请求只有它能构造出来,所以我很想搞清楚底层逻辑。但 JADX 打开后,包名、类名、变量名全被替换成关键字,控制流也被打散,人工逐个重命名基本是体力活。
这时候 AI 辅助逆向的价值就体现出来了。把 JADX 通过 MCP 协议桥接给 Claude,让模型直接读取反编译结果、理解代码语义、批量重命名并还原控制流,整个过程比手动快一个数量级。而要让这条链路稳定跑起来,关键前置是有一个统一的模型接入通道——我用的是 TaoToken,一个 Key 就能同时调 Claude 系列模型,省去多平台配置的麻烦。下面把完整链路拆开讲。
2. TaoToken 前置:统一 Key 接入 Claude 与 MCP 链路
TaoToken 在这里扮演的角色是模型接入层。JADX + MCP 负责把反编译结果结构化地喂给模型,Claude 负责代码理解与还原,而 TaoToken 负责让 Claude 的调用稳定、可配置、可切换。
它的官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。你需要在控制台创建一个 API Key,然后把它写进 MCP 服务或 Claude 客户端的配置里。
适合谁用:做 Java 逆向、代码审计、混淆还原的安全研究人员;需要把 Claude 接入本地工具链的开发者;以及希望用统一 Key 管理多个模型调用的团队。
能做什么:提供兼容 OpenAI 风格的 API 通道,支持 Claude 系列模型调用;配合 MCP 协议,可以让 Claude 直接操作 JADX 的重命名、反编译、搜索等能力;一个 Key 走通对话、编码、Agent 多种场景。
我试过把 JADX 的 MCP 服务和 Claude 客户端都指向同一个 TaoToken Key,配置一次就能复用,不用在每个工具里重复填不同平台的凭证。接下来进入可复制配置环节。
3. 可复制配置:config.toml 与 settings.json 骨架
这一节给出两个核心配置文件的骨架:一个是 MCP 服务侧的config.toml,一个是 Claude 客户端侧的settings.json。你可以直接复制后替换路径和 Key。
3.1 MCP 服务侧 config.toml
JADX 的 AI MCP 插件(jadx-ai-mcp)需要在 JADX GUI 里安装,然后启动一个本地 MCP Server。服务侧的配置主要声明模型通道和 JADX 插件通信地址。
# config.toml - MCP 服务侧配置骨架 [mcp] name = "jadx-mcp-server" version = "6.3.0" transport = "stdio" [model] provider = "taotoken" base_url = "https://taotoken.net/api" api_key = "sk-你的TaoTokenKey" model = "claude-sonnet-4-20250514" max_tokens = 8192 temperature = 0.2 [jadx] plugin_host = "127.0.0.1" plugin_port = 8080 auto_rename = true preserve_keywords = false [logging] level = "info" file = "./jadx_mcp.log"几个参数说明:base_url固定填 TaoToken 的 API 地址,不要带 UTM 参数;model填你要用的 Claude 模型标识;temperature建议压低到 0.2 左右,逆向场景需要稳定输出而不是发散;auto_rename打开后,模型可以调用 JADX 的重命名接口批量改类名。
3.2 Claude 客户端侧 settings.json
Claude 客户端(或支持 MCP 的编辑器插件)需要一份settings.json来声明 MCP Server 的启动方式。这里用 Python 启动 jadx-mcp-server。
{ "mcpServers": { "jadx-mcp-server": { "command": "python", "args": [ "D:\\jadx-mcp-server-6.3.0\\jadx_mcp_server.py" ], "env": { "TAOTOKEN_API_KEY": "sk-你的TaoTokenKey", "TAOTOKEN_BASE_URL": "https://taotoken.net/api", "TAOTOKEN_MODEL": "claude-sonnet-4-20250514" } } } }注意args里的路径要换成你本地解压后的实际路径,Windows 下反斜杠要转义。env里把 TaoToken 的 Key 和地址注入进去,MCP Server 启动时会读取。
3.3 安装 JADX 插件与依赖
在 JADX GUI 1.5 及以上版本中,点击菜单里的插件安装,载入jadx-ai-mcp-6.3.0.jar。然后下载 jadx-mcp-server 压缩包,解压后进入目录安装 Python 依赖:
cd jadx-mcp-server-6.3.0 pip install -r requirements.txt依赖装完后,先别急着连 Claude,下一步做连通性验证。
4. 验证请求:MCP 连通性与混淆样本还原效果检查
配置写完不代表链路通了,必须做两步验证:先验证 MCP 服务能正常启动并连上 TaoToken,再验证混淆样本的还原效果。
4.1 MCP 服务连通性验证
单独启动 MCP Server,观察日志输出:
python jadx_mcp_server.py --config ./config.toml正常启动后,日志里应该出现类似MCP server listening on stdio和model provider: taotoken的字样。如果卡在模型连接阶段,多半是 Key 或 base_url 写错了。
再用一个最小请求测试模型通道是否通:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复 OK"}], "max_tokens": 16 }'返回里带choices字段且内容为 OK,说明 TaoToken 通道正常。这一步过了,再回到 Claude 客户端里确认 MCP Server 已被识别。
4.2 混淆样本还原效果检查
用 JADX 打开目标样本,确认插件已加载。然后在 Claude 客户端里给出提示词,例如:
代码进行了加密混淆,类名都被替换成了关键字。 请调用 JADX 的重命名功能改善代码可读性,并继续对 RepeaterUI 这个类进行反混淆。模型会先调用 JADX 的重命名接口,把if、else、for这类关键字类名批量改成有意义的名称。接着针对RepeaterUI类做语义还原。
检查还原效果时,重点看三个指标:类名和方法名是否已脱离关键字;控制流是否恢复成正常的 if-else、循环结构;导入 IDEA 后语法错误数量是否大幅下降。我实测下来,一个深度混淆的样本经过这轮联动,可读性提升非常明显,原本满屏报错的代码已经能正常阅读。
如果 Burp Suite 这类样本的发包逻辑藏在底层 Socket 模块,可以继续追问模型定位发包模块位置,让它分析关键实现流程并反混淆相关代码。模型会结合 JADX 的搜索结果给出模块路径和还原后的代码片段。
5. 本篇常见错排查
链路跑不通时,问题通常集中在几个固定位置。下面按现象列排查路径。
5.1 MCP Server 启动即退出
现象:执行python jadx_mcp_server.py后进程立刻结束,没有监听日志。
排查:先确认requirements.txt里的依赖是否全部装完,尤其是 MCP 协议相关的包。再检查config.toml的路径是否正确,args里的脚本路径写错会导致 Python 直接报文件不存在。最后看api_key是否为空,部分版本在 Key 缺失时会直接退出。
5.2 Claude 客户端识别不到 MCP Server
现象:客户端里看不到 jadx-mcp-server 这个工具。
排查:settings.json的 JSON 格式必须严格合法,多一个逗号都会导致解析失败。Windows 路径里的反斜杠要写成双反斜杠。另外确认客户端版本支持 MCP,旧版本需要升级。改完配置后重启客户端,不要只刷新。
5.3 模型调用返回 401 或 403
现象:curl 测试或 MCP 日志里出现鉴权失败。
排查:检查 TaoToken Key 是否复制完整,有没有多余空格。base_url必须是https://taotoken.net/api,不要带任何查询参数。如果 Key 是在控制台刚创建的,确认它已启用且额度充足。
5.4 重命名后代码仍然报错
现象:类名改了,但导入 IDEA 还是大量语法错误。
排查:混淆样本里可能有关键字被用作方法名或字段名,JADX 的重命名只处理了类名。需要在提示词里明确要求模型同时处理方法名和变量名。另外部分样本的控制流被故意打散,需要模型做控制流还原,而不是只做重命名。可以在提示词里补充「请还原控制流结构」。
5.5 还原结果不稳定
现象:同一个样本多次请求,还原质量波动大。
排查:把temperature压到 0.1 到 0.2 之间。提示词里给出明确的类名和还原目标,不要用模糊描述。如果样本特别大,分模块提问,一次只让模型处理一个类或一个功能模块,避免上下文过长导致遗漏。
6. 语义一致 CTA:把这条链路固化成你的逆向工作流
JADX + MCP + Claude 的组合,本质是把反编译工具的结构化能力和大模型的语义理解能力接在一起。JADX 负责把字节码变成可读文本,MCP 负责把工具能力暴露给模型,Claude 负责理解混淆代码的意图并还原,而 TaoToken 负责让模型调用这一步稳定可控。
如果你主要在做接入和排障,建议先把 API Key 和接入文档过一遍,确认通道没问题再往下走:API Keys 管理在 https://taotoken.net/console/api-keys ,接入文档在 https://taotoken.net/doc 。
如果你想先验证模型对混淆代码的理解能力,可以直接在模型对话里贴一段 JADX 反编译结果,看它能不能给出合理的重命名建议:https://taotoken.net/models 。
如果你打算把这条链路长期用于编码和 Agent 场景,比如让 Claude 持续参与逆向分析、批量处理多个样本,可以看 Coding Plan:https://taotoken.net/coding-plan 。
配置文件和验证步骤都在上面了,剩下的就是拿一个你手头的混淆样本跑一遍。第一次跑通之后,把config.toml和settings.json存成模板,下次换个样本只需要改路径和提示词。