已知限制
无反篡改绕过
Grapefruit 不包含以下内置绕过:
- Frida 检测
- SSL/TLS 证书绑定
- 越狱或 Root 检测
RASP(运行时应用自保护)解决方案不断演进以检测动态插桩框架。维持有效的绕过需要持续跟进新的检测方法,会带来显著的维护负担和稳定性问题。这些绕过也与特定应用高度相关,使通用解决方案变得脆弱。
Grapefruit 专注于动态插桩和检查能力,这些能力能与专用绕过工具很好地配合,而不是发布脆弱的内置绕过。
推荐方法
- Frida Syscall 追踪器 — 使用
frida-strace(Frida 17.8.0+)追踪系统调用并在附加 Grapefruit 前识别检测特征。 - 多会话架构 — 先用 RASP 绕过脚本生成单独的 Frida 会话,然后启动 Grapefruit。它附加到现有进程而非重新生成,保持已生效的任何绕过的运行状态。
HTTP 监控基于 Hook
iOS 和 Android 上的 HTTP/NSURL 流量捕获通过 Hook 高级网络 API(NSURLSession、OkHttp 等)实现。这与 MITM 代理有本质区别:
- 覆盖不完整 — 来自自定义网络栈、原始套接字、C 级网络(libcurl、BoringSSL 直接调用)或非标准 HTTP 客户端的流量不会被捕获。
- 不能替代代理 — 如需全面的流量分析,请使用专用 MITM 代理配合 Grapefruit。
- gRPC 和 WebSocket — 这些协议通常会绕过被 Hook 的 HTTP 层,可能不会出现在流量日志中。
静态分析范围
- 无 DEX 解密 — 由打包器保护的应用会在磁盘上加密或隐藏真实的 DEX。Grapefruit 按原样分析磁盘文件,不会尝试运行时 DEX 转储或解密。对于打包应用,先使用专用解包工具,然后将解密的 DEX 手动导入。
- DEX 分析需要文件 — DEX 查看器将文件下载到服务器端用 radare2 分析。非常大的 DEX 文件(100k+ 方法的多 dex APK)进行初始
aa分析可能需要几秒钟。 - 无跨 DEX 引用 — 每个 DEX 文件独立分析。多 dex 应用中多个 DEX 文件之间的引用不会被解析。
- 混淆代码 — 类/方法浏览器显示二进制文件中的名称。混淆应用(ProGuard、R8、DexGuard)会显示缩短的名称如
La/b/c;。Grapefruit 不尝试反混淆。
反汇编与反编译
内置反汇编器和反编译器是用于快速分类的便捷功能,不能替代专用逆向工程工具。
要进行严肃的分析,使用文件浏览器或 APK 浏览器从设备上拉取二进制文件,然后用专用工具打开。应用内视图最适合快速查阅——Hook 之前查看函数功能,或从字符串 xref 导航到周围代码。
AI 反编译质量
- 依赖 LLM — 输出质量因模型差异显著。较大的模型通常效果更好。
- 未经验证 — 反编译代码是尽力重建,可能包含错误、遗漏边界情况,或生成原代码中不存在的逻辑。
- 大函数 — 超出模型上下文窗口的函数会被截断,导致输出不完整。
- Token 费用 — 每次反编译请求都会发送完整函数反汇编。具有许多基本块的大函数会消耗大量 token。
平台要求
- 需要 Frida — Grapefruit 需要在目标设备上运行 Frida。越狱 iOS 或 Root Android 提供最佳体验,但也支持 Frida Gadget 模式、iOS 模拟器和 Android 模拟器(见环境要求)。
- USB 连接 — 默认设置需要 USB 连接目标设备。支持远程 Frida 连接但需要手动配置。
- 一次只能连接一个设备 — 每个 Grapefruit 会话连接一台设备。如需同时使用多台设备,在不同端口上运行多个服务器实例。
进程模式
在进程模式下附加到系统进程时,需注意平台限制:
- 沙箱限制 — 系统服务在移动沙箱下以受限权限运行,部分服务可能完全拒绝附加,或在超出预期运行时上下文时被终止。
- 内存压力 — 低内存服务在插桩开销超出可用余量时可能被杀死。
- 功能受限 — 依赖目标应用的功能(如 Info.plist、Entitlements、WebViews 等)不可用,仅保留 checksec、文件浏览、handles、内存扫描等通用功能。
稳定性
Grapefruit 通过在运行时注入代码来检测目标进程。本质上具有侵入性,可能导致不稳定:
- Hook 可能导致目标应用崩溃 — 在运行时替换函数实现可能触发意外行为,尤其是当 Hook 以应用未预料的方式改变时序、线程安全或返回值时。
- 追踪高频函数 — Hook 频繁调用的函数会增加开销,可能降低性能或导致应用无响应。
- 多线程代码 — Frida Hook 在调用线程上同步执行。在多线程并发调用的函数上 Hook 可能引入原应用不存在的竞态条件。
- 进程附加 — 附加到正在初始化或具有反调试检查的进程可能导致立即终止。
这些是动态插桩固有的权衡,不是 Grapefruit 的缺陷。目标崩溃时,重启再试更有针对性的方法即可。
浏览器兼容性
- 建议使用 Chromium 内核浏览器 — UI 使用 Monaco Editor、dockview 和 xterm.js,在 Chrome、Edge 等 Chromium 内核浏览器中效果最佳。
- 移动浏览器 — 工作空间设计用于桌面使用。在移动端可以渲染,但可停靠面板布局在小屏幕上不实用。
内存与性能
- radare2 WASM 实例 — 每个分析会话(反汇编标签页、DEX 查看器)都在服务器上创建一个 radare2 WASM 实例。这些在 WebSocket 断开时清理,但并发会话会消耗与打开的分析视图数量成比例的内存。
- 大型二进制分析 — 在具有数万个函数的大型二进制上运行
aa(自动分析)可能需要相当长的时间和内存。