用于在运行时重写移动应用,以直接中间人攻击(MitM)所有 HTTPS 流量的 Frida 脚本
属于 HTTP Toolkit:用于构建、测试和调试 HTTP(S) 的强大工具
本仓库包含的 Frida 脚本,旨在完成移动设备上全自动 HTTPS MitM 拦截所需的一切工作。
这套脚本可以组合使用,以处理拦截、管理证书信任并禁用证书固定与透明度检查,从而对 Android 和 iOS 上的 HTTP(S) 流量进行 MitM 拦截;也可以独立使用和调整,仅挂钩特定功能。
这些脚本可以自动处理:
-----BEGIN CERTIFICATE----- 开头。你可以用文本编辑器打开查看并提取此内容。config.js,并添加这些详细信息:
CERT_PEM:你的 PEM 格式 CA 证书。PROXY_PORT:代理端口PROXY_HOST:从你的设备角度看到的代理地址(或使用 adb reverse tcp:$PORT tcp:$PORT 通过 ADB 转发端口,并将 127.0.0.1 作为主机)frida-server,解压后通过 adb push 推送到设备,然后用下面 4 条命令运行:adb shell、su、chmod +x /.../frida-server、/.../frida-server。adb devices)。请注意,在已 root 的设备上,Frida 只能以 root 身份运行,这正是上面示例中 su 所提供的能力。运行 su 或类似命令后,要确认你已是 root,请检查在 shell 中运行 whoami 是否输出 root。tech.httptoolkit.pinning_demo)config.js 开头)的情况下启动你感兴趣的应用。使用哪些脚本由你决定,但在 Android 上,一个不错的启动命令是:
frida -U \
-l ./config.js \
-l ./native-connect-hook.js \
-l ./native-tls-hook.js \
-l ./android/android-proxy-override.js \
-l ./android/android-system-certificate-injection.js \
-l ./android/android-certificate-unpinning.js \
-l ./android/android-certificate-unpinning-fallback.js \
-l ./android/android-disable-root-detection.js \
-f $PACKAGE_ID
-----BEGIN CERTIFICATE----- 开头。你可以用文本编辑器打开查看并提取此内容。config.js,并添加这些详细信息:
CERT_PEM:你的 PEM 格式 CA 证书。PROXY_PORT:代理端口PROXY_HOST:从你的设备角度看到的代理地址https://build.frida.re 作为软件源来安装。frida-ps -Uai,以确认其正常工作。frida-ps -Uai 找到你感兴趣应用的 ID(快速测试可尝试 github.com/httptoolkit/ios-ssl-pinning-demo——ID 为 com.httptoolkit.ios-pinning-demo)config.js 开头)的情况下启动你感兴趣的应用。使用哪些脚本由你决定,但在 iOS 上,一个不错的启动命令是:
frida -U \
-l ./config.js \
-l ./ios/ios-connect-hook.js \
-l ./ios/ios-disable-detection.js \
-l ./native-tls-hook.js \
-l ./native-connect-hook.js \
-f $APP_ID
上面的命令使用了所有相关脚本,但你通常可以使用任意子集,尽管在几乎所有情况下,你都应把 config.js 放在第一个脚本的位置(它定义了一些供其他脚本使用的变量)。
例如,如果只在 Android 上单独进行证书固定绕过,而代理和证书配置由其他方式处理,且不需要混淆后备方案,你可以直接运行:
frida -U \
-l ./config.js \
-l ./android/android-certificate-unpinning.js
-f $PACKAGE_ID
每个脚本顶部都有大段注释,详细说明其功能和工作原理。脚本如下:
config.js
该脚本定义了其他脚本使用的变量:
CERT_PEM - 要信任的额外 CA 证书,PEM 格式PROXY_HOST - 要使用的代理服务器 IP 地址(IPv4)(如果只做证书固定绕过则不需要)PROXY_PORT - 要使用的代理服务器端口(如果只做证书固定绕过则不需要)DEBUG_MODE - 默认为 false,但将其改为 true 会启用大量额外输出,可用于调试和逆向分析问题。BLOCK_HTTP3 - 默认为 true,通过丢弃所有到 443 端口的 UDP 连接来阻止 HTTP/3。该脚本应在命令行中列于其他脚本之前。
native-connect-hook.js
直接捕获所有网络流量,将所有连接路由到配置的代理主机和端口。
这是一个适用于 所有 网络连接的低层钩子。它确保所有连接都被强制重定向到目标代理服务器,即使是那些忽略代理设置或建立其他原始套接字连接的连接,并在启用时阻止 HTTP/3 连接。
该钩子作用于 libc,适用于 Android、Linux、iOS 及许多其他相关环境。
native-tls-hook.js
修改基于 BoringSSL 的库的所有 TLS 验证,以信任你配置的 CA 证书。
值得注意的是,该脚本挂钩了 iOS 上内置的 BoringSSL API,这是 iOS 处理 TLS 证书验证的常规方式(因此足以满足几乎所有 iOS HTTPS 拦截),但它在 iOS 和 Android 上的其他一些场景中也有使用。
这实际上会让你的 CA 信任所有证书,并禁用针对你的 CA 的所有证书固定、证书透明度及其他限制。请注意,与其他许多 Frida 钩子不同,该脚本 不会 完全禁用 TLS 验证(那非常不安全)。相反,它覆盖验证逻辑,确保使用你的特定 CA 证书的所有连接都被信任,同时不会放宽验证以允许第三方拦截。
android/