Flutter 抓包终极指南:使用 reFlutter + TunProxy + Burp Suite 绕过 SSL Pinning
Flutter 应用因使用自己的网络栈(Dart IO),普通系统代理通常无法拦截其 HTTPS 流量。本文将通过 reFlutter 静态逆向补丁技术,配合 TunProxy 虚拟网卡转发和 Burp Suite 深度解析,手把手教你构建一套完整的 Flutter 流量分析环境,彻底解决 Flutter App 抓不到包、无法解密 HTTPS 的痛点。
本次成功抓包的关键组合是:
reFlutter:对 APK 进行静态 patch,强制 Flutter Socket 流量重定向到指定代理端口(默认 8083),并辅助绕过部分 TLS 验证。
TunProxy:使用 Android VPNService 机制,进一步强制路由 App 流量到 Burp
Burp Suite:配置 invisible proxying 进行 MITM 解密。
Android Studio Emulator:root + writable-system
准备工作
- 工具准备
- reFlutter(最新版推荐通过
pip install reflutter安装) - Burp Suite(Community 或 Professional 版)
- Android Studio + AVD Emulator(推荐 API 30+,启用 root)
- uber-apk-signer(用于 APK 签名,可以从 https://github.com/patrickfav/uber-apk-signer/releases 下载)
- TunProxy APK(可以从 https://apkpure.com/tunproxy/com.tun.proxy 下载)
- OpenSSL :用于生成 Burp CA 证书 hash
- ADB :可以使用 adb 命令
- reFlutter(最新版推荐通过
-
创建 Android 虚拟机
Android 版本选择11~14,比较稳定,兼容性好。一定要选择 Google APIs 版本的,不要选 Google Play 的镜像(Play 版通常无法轻松 root)
- Emulator 启动方式(关键,可写系统)
使用完整路径启动(Windows 示例):
# 列出你所有的 Android 虚拟机名称 & "C:\Users\<你的用户名>\AppData\Local\Android\Sdk\emulator\emulator.exe" -list-avds # 带 -writable-system 参数启动 & "C:\Users\<你的用户名>\AppData\Local\Android\Sdk\emulator\emulator.exe" -avd 你的AVD名称 -writable-system
详细操作步骤
步骤 1:使用 reFlutter 处理 APK
# 安装 reflutter
pip install reflutter
# 处理 apk 文件
reflutter moke.apk
- 工具会自动识别 SnapshotHash 并输出
release.RE.apk。 - reFlutter 默认启用流量拦截模式(强制重定向到 Burp 8083 端口)。
步骤 2:重签名 APK
使用 uber-apk-signer 进行重签名
# 对 apk 重签名
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk
签名完成后得到可安装的 APK。将APK拖到安卓虚拟机进行安装,如果以前安装过则先卸载再进行安装。
步骤 3:配置 Burp Suite Listener(8083 端口)
- Proxy → Proxy Settings → Proxy Listeners → Add
- Bind to port:8083
- Bind to address:All interfaces
- Request handling:必须勾选 Support invisible proxying
- Running 一定要是勾选的状态。
步骤 4:安装 Burp CA 证书到系统(System 标签页)
- Burp 导出 CA 证书 → 选择
Certificate in DER format→ 选择导出目录 → 文件名填写为cacert.der - 使用 OpenSSL 生成旧 hash 并重命名:
openssl x509 -inform DER -in cacert.der -out cacert.pem openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1 # 这里会输出一个 hash 值,比如我的是:9a5ba575 # 你将下面的命令替换成你输出的 hash 值 # 后面必须加 .0 cp cacert.pem 9a5ba575.0 - 推送并安装:
# 这一段命令如果执行不成功 # 后面的操作都没用! # 你的虚拟机必须是带 -writable-system 参数启动的才可以 # 开启 root adb root # 执行 remount adb remount Disabling verity for /system Using overlayfs for /system Using overlayfs for /vendor Using overlayfs for /product Using overlayfs for /system_dlkm Using overlayfs for /system_ext Now reboot your device for settings to take effect # 如果你执行 remount 输出了以上内容,接着再执行下面的命令 # 重启,等1~2分钟,等虚拟机完全启动好 adb reboot adb root adb remount # 如果输出的是 remount succeeded # 接着下面的 adb push 执行就行了# 先推送到 sdcard adb push 9a5ba575.0 /sdcard/ adb shell mv /sdcard/9a5ba575.0 /system/etc/security/cacerts/ # 设置权限 chmod 644 /system/etc/security/cacerts/9a5ba575.0 exit adb reboot - 重启虚拟机后,在 Settings → Security & privacy → More security settings → Encryption & credentials → Trusted credentials → System 标签页确认有 PortSwigger 证书,就表明安装成功
步骤 5:安装并配置 TunProxy(关键成功步骤)
- 安装 TunProxy APK(拖拽到虚拟机进行安装)。
- 打开 TunProxy,在输入框填写
你电脑的IP:8083 - 点击 Start,允许 VPN 连接。
步骤 6:安装并运行目标 App
- 卸载原版 App(避免冲突)
- 安装签名后的 reFlutter 处理过的 APK
- 启动 → 操作 App 进行网络请求
步骤 7:验证与抓包
- 在 Burp 的 Proxy → HTTP history 中查看请求信息(能看到业务接口的明文请求/响应)。
常见问题与注意事项
- remount 失败:必须使用
-writable-system启动 Emulator,并在 remount 后重启。 - 抓取的接口不全:确认 Burp Listener 已勾选 Support invisible proxying;
- Flutter 版本更新快:若 SnapshotHash 不支持,需检查 reFlutter 的 enginehash.csv 或自行编译 patched engine。
- 仅用于合法安全研究:如自家 App 测试或授权渗透。
导出抓包记录进行分析
在 Burp HTTP history 中:
- 全选或多选记录 → 右键 → Save items
- 底部 取消勾选 Base64-encode(保持明文),保存为
名称.xml格式的文件,