universal-flutter-ssl-pinning
使用 PyGhidra 对 libflutter.so 进行逆向工程,定位 SSL 证书验证函数,然后生成即开即用的绕过脚本,适用于 Frida 和 Renef。
工作原理
- PyGhidra 以无头模式加载
libflutter.so,并扫描所有已定义的字符串,寻找 ssl_client
- 解析该字符串的交叉引用,定位到其所属的函数
- 对每个函数进行反编译,获取准确的参数个数
- 选择具有 3 个参数的函数——这就是
ssl_crypto_x509_session_verify_cert_chain
- 将其 RVA (相对虚拟地址)嵌入到以下脚本中:
- Frida 脚本(
flutter_ssl_pinning.js),在运行时将返回值篡改为 ptr(1)(SSL_VERIFY_OK)
- Renef 脚本(
flutter_ssl_pinning.lua),使用 Memory.patch 将函数入口覆盖为 MOV X0, #1 ; RET(ARM64)
要求
- Ghidra —
brew install ghidra
- pyghidra —
pip install pyghidra
- Frida —
pip install frida-tools 或 Renef — renef.io
在环境变量中设置 GHIDRA_INSTALL_DIR,或者通过 --ghidra-install-dir 参数指定。
用法
# 分析 libflutter.so 并生成两个脚本
python3 flutter_ssl_pinning.py libflutter.so
# 使用 Frida 运行
frida -U -f com.example.app -l flutter_ssl_pinning.js
# 使用 Renef 运行
renef -s com.example.app -l flutter_ssl_pinning.lua
选项
输出文件
| 文件 | 工具 | 机制 |
|---|
flutter_ssl_pinning.js | Frida | Interceptor.attach + retval.replace(ptr(1)) |
flutter_ssl_pinning.lua |
请参阅 example/ 目录,查看生成的示例输出。
测试环境
| 目标 | 状态 |
|---|
Google Flutter 的 libflutter.so (arm64-v8a) |
Google Flutter 和 Shorebird 使用相同的 libflutter.so SSL 引擎。
对于相同的 Flutter 引擎版本,自动发现的 RVA 在不同构建类型中是一致的。
快速流量捕获(无需代理)
除了绕过证书绑定以进行基于代理的中间人攻击外,您还可以使用自包含的 flutter_http_monitor.py 直接在 Frida 中捕获解密的 HTTP 流量。它会自动定位 libflutter.so 中的 BoringSSL SSL_write/SSL_read(适用于任何 Flutter 版本,arm64),并生成一个 Frida 脚本,用于打印明文的请求和响应——包括重组、去除分块、gunzip 解压以及 JSON 美化打印。
pip install capstone pyelftools
# 扫描二进制文件并生成监控脚本(也可以传递 .apk)
python3 flutter_http_monitor.py path/to/libflutter.so -o monitor.js
# 针对应用运行
frida -U -f com.target.app -l monitor.js
可选:在 Frida REPL 中实时调用 addScope('api.example.com') 以仅监控特定主机(类似 Burp 的 scope)。单文件,无需额外分发。
免责声明
本工具仅用于授权的安全研究和渗透测试。
请勿将其用于您不拥有或未获得明确书面许可的应用。