plugins/my-agents/skills/apk-api-extractor/SKILL.md
当用户要求 "提取API", "逆向APK", "分析APP接口", "提取业务端点", "React Native逆向", "Flutter逆向" 或需要从移动应用提取后端API信息时使用此技能. 覆盖APK解包/JS bundle分析/kernel_blob.bin分析/H5页面参数发现/Spring Boot API验证全流程. 支持React Native和Flutter两种框架.
npx skillsauth add phpmac/skills apk-api-extractorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
# 解包APK
apktool d app.apk -o /tmp/apk-assets
# 关键文件优先检查
assets/app.config # Expo应用配置 (金矿!)
assets/index.android.bundle # React Native JS bundle (可能9MB+)
AndroidManifest.xml # 权限和组件
res/values/strings.xml # 硬编码字符串
Expo应用的 app.config / app.json 通常包含:
# 格式化查看
python3 -m json.tool /tmp/apk-assets/assets/app.config
注意: 正则提取会产生路径污染!
minified JS中路径会与相邻代码粘连, 例如:
"/gateway/trade/create"===t?"/gateway/trade/confirm"
正则匹配会抓到含引号/等号/变量名的垃圾路径.
正确做法:
# 1. 提取所有带引号包围的路径 (减少粘连)
grep -oP '"/gateway/[\w/-]+"' /tmp/apk-assets/assets/index.android.bundle | sort -u
# 2. 人工过滤明显粘连的路径
# 3. curl逐一验证 (空body POST), 根据响应判断:
# - 返回JSON错误 -> 端点存在
# - 返回404/Handler not found -> 路径被污染, 忽略
APP通常有对应的H5注册/登录页面 (如 join.xxx.com), 这些页面的JS代码未混淆, 直接暴露:
发现H5页面:
# 从JS bundle中搜索子域
grep -oP 'https?://[\w.-]+\.[\w]+' /tmp/apk-assets/assets/index.android.bundle | sort -u
# 对每个发现的子域, 检查是否有H5页面
curl -sL https://join.<domain>.com/ | head -200
curl -sL https://<domain>.com/join.html | head -200
H5页面JS分析方法:
$.ajax / fetch / axios / XMLHttpRequest 调用对提取到的端点用curl逐一验证:
# 无需认证的端点 -- 直接测试参数
curl -s -X POST https://api.example.com/gateway/session/send-sms \
-H "Content-Type: application/json" \
-d '{"countryCode":"86","mobile":"13800000000"}'
# 响应解读:
# {"code":"PARAMETER_ERROR","msg":"手机号不能为空"} -> 参数名是mobile
# {"code":"OK"} -> 成功 (注意安全风险!)
# {"code":"NOT_LOGIN"} -> 需要认证, 端点存在
# 404 -> 端点不存在或路径被污染
Spring Boot后端可通过错误消息反推参数:
{}### [端点名] - [安全问题]
- 端点: `POST https://api.xxx.com/gateway/xxx/yyy`
- 请求体: `{...}`
- 问题: 无验证码/无频率限制/无Token
- 影响: 短信炸弹/信息泄漏/未授权访问
- 验证: curl命令和响应
printf 或 echo 逐行追加, 不用heredoc (fish不兼容)解包后先判断是RN还是Flutter:
| 特征 | React Native | Flutter |
|------|-------------|---------|
| 主代码文件 | assets/index.android.bundle (文本) | assets/flutter_assets/kernel_blob.bin (二进制, 100MB+) |
| AOT编译产物 | 无 | lib/arm64-v8a/libapp.so (不一定存在) |
| 配置文件 | assets/app.config (JSON) | 无集中配置文件 |
| native SDK | 不明显 | lib/arm64-v8a/lib*.so 原生库列表直接暴露SDK |
# Flutter关键文件 (按优先级)
assets/flutter_assets/kernel_blob.bin # Dart kernel快照, 主代码 (必取)
assets/flutter_assets/AssetManifest.json # 资源清单, 暴露功能模块
lib/arm64-v8a/libapp.so # AOT编译快照 (可能不存在)
lib/arm64-v8a/lib*.so # 原生SDK库列表 -> 推断第三方服务
kernel_blob.bin 是二进制格式, 必须用 strings 提取可读内容:
# 提取API端点
strings kernel_blob.bin | grep -oP '"/api/[a-zA-Z0-9/_-]+"' | sort -u
# 提取域名
strings kernel_blob.bin | grep -iEo 'https?://[a-z0-9.-]+' | sort -u
# 提取 Firebase 配置
strings kernel_blob.bin | grep -E 'AIzaSy|DefaultFirebaseOptions|firebase' | sort -u
# 提取 SDK App ID
strings kernel_blob.bin | grep -iE 'sdkAppId|app_id.*[0-9]{5,}' | sort -u
kernel_blob.bin 含大量Flutter框架内置URL (dartlang.org/flutter.dev/api.jquery.com等), 必须先过滤再分析:
必过滤模式: dartlang\.org|flutter\.dev|w3\.org|whatwg\.org|jquery\.com|developer\.android\.com|apple\.com/documentation|learn\.microsoft\.com|pub\.dev|material\.io|dartbug\.com
Dart kernel快照 保留开发机文件路径, 这是RN没有的信息源:
strings kernel_blob.bin | grep -oP 'file:///Users/[^"]+' | sort -u
# 示例输出: file:///Users/zona/Desktop/item/adia/lib/main.dart
# 暴露: 开发者用户名/项目目录名/项目结构
通过 .so 文件列表直接推断第三方服务 (不需要读代码):
| .so 文件 | 对应服务 | 说明 | |----------|---------|------| | libImSDK.so | Tencent Cloud IM | 即时通讯 | | libliteavsdk.so | Tencent TRTC | 实时音视频 | | libtuikitengineroom.so | Tencent TUIKit | 会议室引擎 | | libtpcore-master.so | 腾讯TUIPlayer | 直播播放 | | libwechat*.so | 微信SDK | 微信登录/支付 | | libflutter.so | Flutter引擎 | 框架自身(忽略) |
方法: unzip -l app.apk | grep 'lib/arm64-v8a/' | grep -v 'libflutter\|libc++\|libapp' 列出业务相关原生库.
Flutter没有集中配置文件, 配置散落在编译后的Dart代码中, 需用关键词模式搜索:
| 搜索目标 | strings 关键词模式 |
|---------|-------------------|
| API Base URL | api\.|baseUrl|base_url|API_URL |
| Firebase | AIzaSy|firebase|DefaultFirebaseOptions|project- |
| 微信AppID | wx[0-9a-f]{16} |
| 腾讯IM SDKAppID | sdkAppId.*[0-9]{5,} |
| Google验证码 | google-site-verification |
| SMTP/MS服务 | protection\.outlook\.com|secureserver\.net|MS=ms |
strings 输出直接当作端点列表, kernel_blob.bin噪音极大, 必须先过滤后验证.so 库列表分析, 它是判断第三方服务的最快方式 (不需读代码)data-ai
当用户提到 Linux 提权/本地提权/local privilege escalation/获取root权限/内核漏洞利用/LPE/SUID/sudo滥用/容器逃逸/权限提升检测; 或要求在Linux系统上从普通用户提升到root权限; 或查询CVE提权漏洞(如Dirty Pipe/CopyFail/Dirty Frag/PwnKit/Looney Tunables); 或需要安全加固建议时应使用此技能
tools
当用户要求 "计算仓位", "仓位管理", "止损比例", "凯利公式", "盈亏比", "资金管理", "半凯利", "反马丁格尔", "固定风险", "position sizing", "策略评估", "策略体检", "SQN", "夏普比率", "卡玛比率", "期望值", "获利因子", "MAE", "MFE", "R乘数", "索提诺", "蒙特卡洛", "样本外测试", "策略回测" 或需要计算合约交易的最优仓位/止损/资金分配/策略质量评估时应使用此技能. 覆盖仓位管理/策略评估/交易解剖/压力测试的完整框架. 即使用户只是提到 "这笔交易该下多少", "策略好不好", "复盘怎么算" 等模糊描述也应触发.
research
当用户要求 "推荐VPS", "选服务器", "对比服务商", "建站VPS", "便宜VPS", "VPS推荐" 或需要研究/筛选/对比VPS服务商时应使用此技能. 从 hostloc/lowendtalk/lowendbox/测评站搜集真实评测数据, 交叉验证后给出可溯源排名.
data-ai
Unichain 生态项目浏览. 当用户需要查询 Unichain 生态项目/dApp/协议/按标签浏览/按状态筛选/搜索项目时使用.