KingJem/FlowTrans

GitHub: KingJem/FlowTrans

一款基于 mihomo 内核的 Android 流量转发工具,通过 VPN 将设备或指定应用的流量路由至 mitmproxy 以进行抓包调试。

Stars: 0 | Forks: 0

# FlowTrans 一款**类似 Postern / SocksDroid 的 Android 流量转发工具**,基于 [mihomo](https://github.com/MetaCubeX/mihomo) (Clash.Meta) 内核构建,专为 **结合 [mitmproxy](https://mitmproxy.org/) 进行抓包调试**而设计。 FlowTrans 通过 `VpnService` TUN 捕获设备流量,并将其**转发至上游代理**(你的 mitmproxy/mitmweb 实例),支持多个已保存的配置(HTTP / HTTPS / SOCKS5)、历史记录、全局或分应用路由,以及针对已 root 设备的一键系统 CA 辅助工具,用于解密 HTTPS。 | 主页 | 应用选择器 | |------|-----------| | ![主页](https://static.pigsec.cn/wp-content/uploads/repos/cas/a8/a85177e8010a837edb78a4ec4100c72a7dc265a92e811f7015e09c1e36e0eb5c.png) | ![应用选择器](https://static.pigsec.cn/wp-content/uploads/repos/cas/f1/f144258420fc968879957ffb8f6d2531294f6dcbfaf007045a39e0694ef42d81.png) | ## 功能 - **转发至 mitmproxy** —— 通过 VPN 将所有(或指定应用的)流量路由至上游 `http` / `https` / `socks5` 代理。保留真实主机名(SNI/Host),以便 mitmproxy 看到的是域名,而不是 IP。 - **配置与历史记录** —— 保存多个上游目标(名称、协议、主机、端口、认证、TLS/SNI/跳过证书验证);该列表同时兼作历史记录,按最后使用时间排序。由 Room 提供支持。 - **全局或分应用路由** —— 转发所有流量,或选择特定应用(支持搜索及系统/第三方标签页与图标)。分应用模式使用可靠的 `VpnService` 白名单。 - **DNS 模式** —— `redir-host`(对于获取真实主机名最安全)或 `fake-ip` + sniffer。 - **HTTPS 解密辅助工具** —— 在已 root 的设备上,将 mitmproxy 的 CA 证书信任至系统证书库,以便解密任何应用的 HTTPS 流量(见下文)。 - **预构建的 mihomo 内核** —— Go 内核以预构建的 `.so` 文件形式提供,因此只需标准的 Android 工具链即可构建本应用(无需 Go/NDK)。 ## 下载 从 [**Releases**](../../releases) 页面获取最新的 APK,或从 [Actions](../../actions) 标签页获取每次构建的 artifact。目标平台:**arm64-v8a, Android 8+ (min SDK 24)**。 ``` adb install -r FlowTrans-.apk ``` ## 使用说明 1. 在你的 PC 上运行 mitmproxy,例如 `mitmweb --listen-host 0.0.0.0 -p 8080`。 2. 在 FlowTrans 中,添加一个指向你 mitmproxy 的配置(`host:port`,协议选择 `HTTP`)。 3. 选择**全局**或**分应用**路由,然后点击**开始转发**(接受 VPN 连接请求弹窗)。 4. 在 mitmproxy 中查看抓取到的流量。 **无法通过 Wi-Fi 连接到你的 PC?** 企业网络通常会阻止入站连接或隔离客户端。请改用 adb 环回隧道 —— 将配置中的 host 设置为 `127.0.0.1`,并运行: ``` adb reverse tcp:8080 tcp:8080 ``` ### HTTPS 解密 从 Android 7 开始,应用不再信任用户添加的 CA 证书,而在 Android 14 中,系统证书库位于不可变的 Conscrypt APEX 中。因此,要解密**其他应用的** HTTPS 流量,需要获取 **root** 权限: - **已 root(推荐):** 通过应用内的** HTTPS 解密**界面导入 mitmproxy 的 CA 证书(`~/.mitmproxy/mitmproxy-ca-cert.cer`)。借助诸如 [MoveCertificate](https://github.com/ys1231/MoveCertificate) 的 Magisk/KernelSU 模块,该证书会被提升至系统证书库中(重启后生效),随后 mitmproxy 即可解密任何未设置证书绑定的应用流量。 - **未 root:** 只有在应用主动选择信任用户证书库的情况下,才能被解密。 ### 命令行控制 (adb) 比起点击操作更喜欢使用脚本?上述 GUI 步骤均可通过 `adb` 执行等效的无界面操作(写入首选项和启动 VPN 需要 **root** 权限)。以下命令将为单个包设置**分应用**抓包并直接开始转发 —— 全程无需点击: ``` # 1) 首先停止该 app —— 它的 SharedPreferences 会被内存缓存并在退出时重写, # 因此在运行时进行的修改会被覆盖。 adb shell am force-stop com.flowtrans # 2) 将路由配置文件写入 /sdcard(普通 shell 即可写入 sdcard;无需 root)。 # 为多个 package 添加更多 行。 adb shell "cat > /sdcard/_ft.xml <<'EOF' GVISOR REDIR_HOST com.example.app PER_APP EOF" # 3) 复制 prefs(root)。`cp` 会原地覆盖,保留文件的 inode / owner / # SELinux context —— 切勿直接 `cat >` app 目录(其 O_CREAT 会被 SELinux 拒绝, # 并且对 app_data_file 的 chown/chmod/restorecon 操作对于 su domain 会被拒绝且毫无必要)。 adb shell su -c "cp /sdcard/_ft.xml /data/data/com.flowtrans/shared_prefs/flowtrans_settings.xml; rm -f /sdcard/_ft.xml" # 4) Loopback tunnel(设备 127.0.0.1:8080 -> PC mitmproxy) adb reverse tcp:8080 tcp:8080 # 5) 开始转发 —— 以 root 身份运行 VpnService。普通 shell uid 会收到 # "Requires permission not exported";VPN 授权已授予,因此不会出现对话框。 adb shell su -c "am start-foreground-service -n com.flowtrans/.vpn.FlowVpnService -a com.flowtrans.action.START" ``` - **全局路由:** 删除整个 `` 块,并将 `routing_mode` 设置为 `GLOBAL`。 - **停止转发:** `adb shell am force-stop com.flowtrans`(会断开 `tun0`);可选操作:执行 `adb reverse --remove tcp:8080`。 - **验证:** `adb shell "ip addr show tun0"` —— 出现 `inet` 一行即表示转发已启动。 ### 自动化抓包 想要通过**一条命令实现端到端**的抓包链路,涵盖上述所有内容 —— 环境预检、分应用/全局定向、mitmweb(直连或通过海外代理作为出口)、以及针对证书绑定应用的 Frida SSL 绕过(SSL-unpinning)—— 请使用配套的 **[android-capture-skill](https://github.com/KingJem/android-capture-skill)** (一个 Claude Code skill)。它会完全通过上述展示的 `adb` 命令来驱动 FlowTrans: ``` python scripts/capture.py preflight # check PC + phone env python scripts/capture.py flowtrans --pkg com.example.app --mitmweb # target + reverse + mitmweb + VPN ``` ## 从源码构建 需要 **JDK 17** 和 **Android SDK**(platform 34,build-tools 34.0.0)。无需 Go/NDK —— mihomo 内核已作为预构建文件直接内置。 ``` # 将 Gradle 指向你的 JDK 17 和 SDK export JAVA_HOME=/path/to/jdk-17 echo "sdk.dir=/path/to/Android/Sdk" > local.properties ./gradlew assembleDebug adb install -r app/build/outputs/apk/debug/app-debug.apk ``` CI(`.github/workflows/build.yml`)会在每次推送时构建 APK,并在你推送 `v*` 标签时将其附加到 GitHub Release 中。 ## 架构 ``` FlowTrans app (Android) PC ┌────────────────────────────────────────────┐ ┌──────────────────────┐ │ Compose UI - profiles / routing / CA │ │ │ │ | generates config.yaml │ │ mitmproxy :8080 │ │ v │ │ │ │ mihomo core (libclash.so + libbridge.so) │--LAN-->│ decrypts HTTPS │ │ ^ outbound: http / socks5 │ │ (system CA via root) │ │ VpnService TUN -- fd --> Bridge.startTun() │ │ │ └────────────────────────────────────────────┘ └──────────────────────┘ ``` - `com.flowtrans.vpn.FlowVpnService` —— 建立 TUN 并将其 fd 交给内核。 - `com.flowtrans.core.ConfigBuilder` —— 根据当前激活的配置生成 mihomo 的 `config.yaml`。 - `com.flowtrans.data.*` —— Room 中的配置与设置。 - `com.flowtrans.root.CaInstaller` —— 系统 CA 信任辅助工具。 - `com.github.kr328.clash.*` —— 与预构建 mihomo 内核对接的内置桥接代码。 ## 许可证与致谢 GPL-3.0(见 [LICENSE](LICENSE) 和 [NOTICE](NOTICE))。基于并内置了 [mihomo](https://github.com/MetaCubeX/mihomo) 和 [ClashMetaForAndroid](https://github.com/MetaCubeX/ClashMetaForAndroid)(两者均为 GPL-3.0 协议)。 仅限用于教育/经授权的调试用途。
标签:Android应用, mihomo, VPN服务, 代理调试, 后台面板检测, 抓包工具, 服务管理, 网络流量转发