script-or-script/FlutterTap
GitHub: script-or-script/FlutterTap
一个持久的 Zygisk 模块,将 Flutter 应用流量重定向到代理并绕过 BoringSSL TLS 证书校验,无需 Frida 会话或设备证书安装。
Stars: 0 | Forks: 0
English · Português (BR) · 中文
一个 **Zygisk** 模块,将所选 **Flutter** 应用的网络流量重定向到可配置的代理,并绕过 BoringSSL 的 TLS 证书验证——无需在设备上安装证书,无需重新打包应用,也无需通过 USB 连接 Frida 会话。 它附带一个 **manager app**(基于 Jetpack Compose),可直接在手机上选择目标应用并设置代理的 IP 和端口。
HTTPS traffic from a Flutter app arriving decrypted in Burp — with no CA certificate installed on the device.
## 为什么会有这个项目 Flutter 应用不使用 Android 的 TLS 协议栈。其引擎自带了 **BoringSSL** 并维护自己的信任链,这意味着在系统上安装 Burp 的 CA 证书**根本拦截不到任何内容**——应用会完全忽略 Android 的证书存储。而且,由于 Flutter 也不支持 Wi-Fi 代理,流量会直接离开设备,根本不会经过你的拦截器。 这种变通方法众所周知,但通常需要在每次会话时运行带有活动 `frida-server` 的 Frida 脚本并连接数据线。FlutterTap 将这种方法变成了一个持久化的模块:只需安装一次,选择你的应用,它就会在每次开机时自动运行。 ## 为什么使用模块,而不是 Frida 或 LSPosed **Frida** 在*探索*应用的工作原理方面是无与伦比的——你修改 JavaScript,几秒钟就能看到效果。这项技术就是这样诞生的。问题在于*操作*它:它依赖于 `frida-server` 和活跃的会话(关闭终端,hook 就会丢失),无法在重启后继续运行,需要使用 spawn (`-f`) 来捕获启动时的 hook,而且——在实际操作中最关键的——**会打开一个监听端口并留下众所周知的痕迹**(线程名称、内存字符串、`/proc` 条目)。检测 Frida 实际上是任何移动保护 SDK 所做的第一件事。 **LSPosed/Xposed** 不是便利性的问题,而是层级的问题:它 hook **Java/ART 方法**。在 Flutter 中,`verify_cert_chain` 和 `GetSockAddr` 是 `libflutter.so` 内部**未导出的原生函数**——根本没有 Java 方法可以拦截。LSPosed 模块必须完成与 FlutterTap 完全相同的原生工作,同时还白白拖入了整个 Xposed 运行时。 | | Frida | LSPosed | FlutterTap | |---|---|---|---| | 触及原生 BoringSSL | 是 | **不直接** | 是 | | 重启后依然有效 | 否 | 是 | 是 | | 无需数据线/外部工具 | 否 | 是 | 是 | | 监听端口 / 外部进程 | 是(可检测) | 否 | 否 | | 从应用启动的第一刻起捕获 | 仅通过手动 spawn | 是 | 是 | | 对未选中的应用零影响 | — | 取决于情况 | 是 (`DLCLOSE`) | | 开发迭代速度 | **极好** | 中等 | 慢 | 最后一行是客观存在的缺点:迭代原生模块比编辑 `.js` 慢得多。这正是为什么这种拆分是有意义的——**用 Frida 探索,用模块操作**。 ### 为什么开发它 其动机来自于实际的移动流量分析工作。在实际的操作过程中,应用必须**随着时间的推移表现自然**:被反复打开和关闭、接收通知、在后台同步,供从未听说过 Frida 的人使用。而且设置必须是**可复现的**——任何人都可以通过勾选复选框来重新配置,无需终端,也无需记住的命令。 FlutterTap 将一个手动且脆弱的过程变成了**基础设施**。针对特定应用的定位正是为此而存在的:它不是一个全局拦截器——它在你未选择的每个应用中保持休眠状态,并立即从内存中卸载自己,从而降低了副作用的风险和被检测的面。 ## 工作原理 所涉及的函数都没有被导出,因此必须在每个进程的运行时中定位它们: 1. 该模块通过 Zygisk 加载到每个应用进程中,并检查该包名是否在目标列表中——如果不是,它会立即卸载自己(对未选中的应用零影响)。 2. 在一个监控线程上,它等待 `libflutter.so` 加载并解析其 ELF 段。 3. 它扫描内存中的字符串 `"ssl_client"` 和 `"Socket_CreateConnect"`,并由此通过 **使用 Capstone 反汇编** 来解析 `verify_cert_chain` 和 `GetSockAddr` 的真实地址——这与 Frida 底层使用的库相同。 4. 它使用 Dobby 安装三个 hook:捕获目标 `sockaddr`,将 IP/端口重写为代理,并强制返回“证书有效”的结果。 实现细节,包括与原始方法分歧的位置和原因,都在 [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) 中。 ## 兼容性 | 项目 | 支持 | |---|---| | Android | 10 (API 29) 至 17 (API 37) | | 架构 | `arm64-v8a`, `x86_64` | | Root | Magisk, KernelSU, SukiSu Ultra, APatch | | Zygisk | Magisk 内置 Zygisk, Zygisk Next(**包括启用了 Zygisk Next Linker 的情况**)或 NeoZygisk | 已在两种刻意设置的不同环境下的硬件上进行了验证: - **OnePlus 5** — Android 10,Kitsune Magisk v27.2 + NeoZygisk 2.3 - **Pixel 8a** — Android 17,SukiSu Ultra + Zygisk Next 1.4.3,并启用了 **Zygisk Next Linker** ## 安装 从 [最新发布版本](../../releases/latest) 下载这两个文件。 1. **安装模块**:在你的 root 管理应用(Magisk / KernelSU / SukiSu Ultra / APatch)中刷入 `FlutterTap-
标签:Android, BoringSSL, DSL, Flutter, UML, Zygisk, 云资产清单, 后台面板检测, 安全测试, 攻击性安全, 流量劫持, 逆向工程