ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

我让 AI 学会了“拆“App——Antigravity 逆向分析能力搭建手记:从 MCP 到 TaoToken 的配置实录

我让 AI 学会了“拆“App——Antigravity 逆向分析能力搭建手记:从 MCP 到 TaoToken 的配置实录 1. 为什么我要让 AI 学会“拆”APK从手工逆向到 MCP 工具链先说清楚这篇在讲什么Antigravity 是 Google DeepMind 推出的 AI 编程助手能写代码、调 bug、读文档但它默认不会用 IDA Pro、Frida、ADB 这类逆向工具。MCPModel Context Protocol模型上下文协议就是给 AI 装“手”的标准接口——把本地逆向工具的能力包装成 MCP ServerAI 就能通过协议调用它们。适合谁手里有 APK 想快速摸清结构、又不想在五个软件窗口之间来回切的手工逆向开发者以及想把模型请求统一收敛到一条 API 通道的工程团队。我试过的场景是这样的拿到一个 Cocos2d-x 打包的游戏 APKJS 源码被加密成.jsc传统做法是开 IDA 找密钥、开 Frida Hook 验证、开 AndroidKiller 反编译 smali、再开 ADB 看日志光窗口切换就够烦。核心痛点不是“不会分析”而是“工具之间不互通数据靠人肉搬运”。MCP 解决的正是这个让 AI 拿着一个“万能遥控器”自己决定先调哪个工具、遇到瓶颈怎么换路线。整条链路分四层最底层是逆向工具IDA Pro / Frida / ADB / AndroidKiller中间是 MCP ServerPython 脚本把工具能力注册成 tool上层是 Antigravity 的 MCP 客户端配置最顶层是模型请求通道——这里统一改到 TaoToken 的 API避免每个工具各自配一套 Key。下面按“前置准备 → 配置片段 → 验证请求 → 排错 → 分流”的顺序拆开写每一步都给可复制的命令和配置。先明确一个边界本文只讨论对你自己拥有或已获授权的 APK 做分析MCP Server 不要直连生产数据库或线上服务工具调用限定在本地样本目录。这是底线不是建议。2. TaoToken 前置把模型请求统一到一条 API 通道2.1 为什么需要这一步Antigravity 本身要调模型MCP Server 里如果也嵌了模型调用比如让 AI 自动写 Frida 脚本就会变成两套 Key、两套计费、两套限流。统一到 TaoToken 的 API 通道后你只需要维护一个 Base URL 和一个 Key模型侧换模型只改 Model ID不用动 MCP 配置。TaoToken 在这里的角色是模型 API 聚合通道不是“中转”它提供标准的 OpenAI 兼容接口Antigravity 和 MCP Server 都按这个接口发请求。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址https://taotoken.net/api注意这个不加 UTM2.2 拿 Key 与确认模型 ID登录后进控制台在 API Keys 页面创建一个 Key复制出来形如sk-xxxxxxxx。然后在模型列表里确认你要用的 Model ID比如claude-sonnet-4-20250514这类。这里有个坑不同模型对 tool calling 的支持程度不一样逆向分析场景里 AI 要频繁调 MCP tool所以优先选 tool calling 稳定的模型。我实测下来带 tool use 能力的模型在 MCP 多轮调用里表现更稳不会中途“忘记”自己有哪些工具。2.3 环境变量写法不要把 Key 硬编码进 MCP Server 脚本。用环境变量export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows PowerShell$env:TAOTOKEN_API_KEYsk-你的key $env:TAOTOKEN_BASE_URLhttps://taotoken.net/api这样 MCP Server 和 Antigravity 都从同一组变量读换 Key 只改一处。如果你用 Coding Plan 做长期编码/Agent 任务Key 的额度策略在控制台里单独看别和临时测试 Key 混用。3. 可复制配置MCP Server 片段与 Antigravity 接入参数3.1 MCP Server 的 Python 骨架每个逆向工具写一个 MCP Server用FastMCP注册 tool。下面是 IDA Pro 的简化骨架重点是instructions参数名——MCP SDK 更新后从description改成了instructions写错会直接报参数错误from mcp.server.fastmcp import FastMCP import subprocess, os mcp FastMCP( ida-pro, instructions二进制静态分析工具提供反编译、函数列表、字符串提取能力 ) mcp.tool() async def decompile_function(binary_path: str, function_name: str) - str: 把编译后的函数反编译回可读伪代码 if not os.path.exists(binary_path): return f文件不存在: {binary_path} # 实际调用 IDA 的 idat/idalib这里用占位命令示意 result subprocess.run( [ida64, -A, f-S{function_name}, binary_path], capture_outputTrue, textTrue, timeout300 ) return result.stdout or result.stderr mcp.tool() async def list_functions(binary_path: str) - str: 列出二进制中所有函数名 result subprocess.run( [ida64, -A, -L, binary_path], capture_outputTrue, textTrue, timeout300 ) return result.stdout if __name__ __main__: mcp.run(transportstdio)Frida 的 Server 骨架重点是 Hook 脚本注入from mcp.server.fastmcp import FastMCP import frida, sys mcp FastMCP(frida-hook, instructions运行时 Hook 工具拦截函数调用) mcp.tool() async def hook_function(package_name: str, target: str) - str: Hook 指定函数打印参数和返回值 script_code f Java.perform(function() {{ var cls Java.use({target}); cls.overload().implementation function() {{ console.log([hook] {target} called); return this.overload().call(this); }}; }}); device frida.get_usb_device(timeout10) session device.attach(package_name) script session.create_script(script_code) script.on(message, lambda msg, data: print(msg)) script.load() return f已注入 Hook: {target} if __name__ __main__: mcp.run(transportstdio)3.2 Antigravity 侧接入参数Antigravity 的 MCP 配置通常是一个 JSON 文件路径在用户配置目录下不同版本略有差异以你本地实际为准。核心三件套是Base URL Key Model IDMCP Server 列表单独一段{ model: { baseUrl: https://taotoken.net/api, apiKey: ${TAOTOKEN_API_KEY}, modelId: claude-sonnet-4-20250514 }, mcpServers: { ida-pro: { command: python, args: [/path/to/mcp_ida.py], env: { TAOTOKEN_API_KEY: ${TAOTOKEN_API_KEY}, TAOTOKEN_BASE_URL: https://taotoken.net/api } }, frida-hook: { command: python, args: [/path/to/mcp_frida.py] }, adb-control: { command: python, args: [/path/to/mcp_adb.py] }, apk-killer: { command: python, args: [/path/to/mcp_apkkiller.py] } } }如果你用 Cline 或 CC Switch 管理 MCP配置结构类似把mcpServers段贴进去即可。Codex 用户如果走auth.json把base_url指向https://taotoken.net/apiapi_key填环境变量引用。三件套缺一不可Base URL 写错会 404Key 写错会 401Model ID 写错会报 model not found。3.3 路径与权限检查MCP Server 脚本路径不要带空格如果非带不可在args里用引号包住。IDA Pro 装在C:\Program Files\...时subprocess调用要显式加引号否则命令行解析会把空格当分隔符。这个坑我在第一次跑的时候踩了AI 自己发现报错后加了引号修复但你在配置阶段就写好能省一轮。4. 验证请求用示例 APK 跑通反编译与调用链4.1 准备样本与目录拿一个你自己打包的测试 APK或者用开源项目编译出来的样本。放到一个干净目录比如~/reversing/sample/。确认 ADB 能连上设备adb devices # 输出应包含你的设备序列号 device4.2 第一步验证 MCP Server 能独立启动先不接 Antigravity单独跑一个 Server 看它能不能起来python /path/to/mcp_ida.py # 正常情况会阻塞等待 stdio 输入不报错即通过如果报ModuleNotFoundError: No module named mcp先装依赖pip install mcp frida-tools4.3 第二步验证模型通道用 curl 直接打 TaoToken 的 API确认 Key 和 Base URL 对curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-20250514, messages: [{role: user, content: 回复 ok}], max_tokens: 10 }返回里能看到choices[0].message.content就说明通道通了。如果返回 401检查 Key 有没有多余空格返回 404检查 Base URL 是不是写成了带/v1的完整路径TaoToken 的 Base URL 是https://taotoken.net/api具体路径由客户端拼接。4.4 第三步在 Antigravity 里发起一次完整调用重启 Antigravity让它加载 MCP 配置。然后在对话里输入分析 ~/reversing/sample/app.apk先列出所有函数再提取字符串里的 URL预期行为AI 先调ida-pro的list_functions拿到函数列表再调字符串提取 tool如果发现.jsc加密文件它会尝试调frida-hook做运行时验证。整个过程你能在 Antigravity 的工具调用日志里看到每一次 MCP 请求和返回。4.5 成功结果的判断标准跑通的标志有三个一是 Antigravity 日志里出现tool_call: ida-pro.list_functions这类记录二是返回内容里有真实的函数名或字符串不是空数组三是模型在拿到工具结果后能继续推理比如根据函数名判断“这里用了 XXTEA 加密”。如果工具调用了但模型没继续多半是 tool result 格式不对检查 MCP Server 返回的是不是字符串。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth5.1 401 Unauthorized最常见。原因排序Key 没读到环境变量 Key 复制时带了换行 Key 被撤销。排查命令echo $TAOTOKEN_API_KEY | head -c 10 # 应输出 sk- 开头的前10位如果环境变量为空检查你是不是在另一个 shell 里 export 的。Antigravity 从系统环境读IDE 内终端 export 不一定生效建议写进系统环境变量或.env文件并在配置里引用。5.2 local proxy failed这个报错通常出现在 MCP Server 启动阶段意思是本地进程通信失败。原因command路径不对、Python 不在 PATH、脚本有语法错误。排查which python python -c import mcp; print(mcp.__version__)如果which python指向的是 Windows Store 的假 Python换成真实路径。脚本语法错误用python -m py_compile mcp_ida.py单独检查。5.3 reading choices 相关报错形如error reading choices field或cannot read property choices of undefined说明客户端拿到了非预期格式的响应。原因Base URL 写成了https://taotoken.net/api/v1导致路径重复或者模型返回了流式格式但客户端按非流式解析。解决Base URL 只写到https://taotoken.net/api流式开关和客户端保持一致。5.4 OAuth 相关报错如果 Antigravity 或某个 MCP Server 走了 OAuth 流程报OAuth token expired或invalid_grant说明它没走 API Key 通道。检查配置里是不是同时存在 OAuth 和 API Key 两套认证把 OAuth 段删掉强制走apiKey字段。TaoToken 的通道用 API Key 认证不需要 OAuth。5.5 工具调用了但结果为空不是报错但很常见。原因MCP Server 的 tool 返回了空字符串或者subprocess超时被吞了异常。在 Server 里加日志import logging logging.basicConfig(levellogging.DEBUG)然后看 stderr 输出。IDA 分析大文件可能超过 300 秒把timeout调大。6. 把能力边界往外推一步从 APK 到更多逆向场景工具的能力边界就是 AI 的能力边界。MCP 把本地逆向工具接进来之后AI 从“会写代码”变成“能拆程序”但这个思路不限于 APK。安全审计、固件分析、协议逆向、漏洞挖掘每个领域的专业工具都可以用同样的方式包装成 MCP Server注册成 tool让 AI 自己决定调用顺序。如果你只想先跑通模型通道去模型对话页面直接试https://taotoken.net/api-keys 拿 Key接入文档在 https://taotoken.net/doc 有完整的 Base URL 和参数说明。长期做编码和 Agent 任务的话Coding Plan 的额度策略更适合持续调用https://taotoken.net/coding-plan 。Claude Code 用户走 Anthropic 兼容通道的配置在 https://taotoken.net/claude-code-anthropic 。最后留一个实用技巧MCP Server 的 tool 描述写清楚“输入是什么、输出是什么、什么时候用”模型选工具的准确率会明显提升。我一开始把描述写得很泛AI 经常在 IDA 和 Frida 之间选错改成“静态分析用 ida-pro运行时验证用 frida-hook”之后选对率上来了。工具是死的描述是活的这一步值得多花十分钟。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进