用于在运行时重写移动应用,以直接中间人攻击(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、、。-----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 上,一个不错的启动命令是:
上面的命令使用了所有相关脚本,但你通常可以使用任意子集,尽管在几乎所有情况下,你都应把 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 上的其他一些场景中也有使用。
这些脚本是更广泛的 HTTP Toolkit 项目的一部分,由 NGI Zero Entrust Fund 资助,该基金由 NLnet 设立,并得到欧盟委员会下一代互联网计划的财政支持。更多信息请访问 NLnet 项目页面。
chmod +x /.../frida-server/.../frida-serveradb 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
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
这实际上会让你的 CA 信任所有证书,并禁用针对你的 CA 的所有证书固定、证书透明度及其他限制。请注意,与其他许多 Frida 钩子不同,该脚本 不会 完全禁用 TLS 验证(那非常不安全)。相反,它覆盖验证逻辑,确保使用你的特定 CA 证书的所有连接都被信任,同时不会放宽验证以允许第三方拦截。
android/
android-proxy-override.js
覆盖目标应用的 Android 代理设置,确保所有遵循代理设置的流量都通过代理服务器重定向并被拦截。
android-system-certificate-injection.js
修改 Android 原生 API,确保所有信任库默认信任你的额外 CA 证书,从而允许捕获加密的 TLS 流量。
android-certificate-unpinning.js
修改或禁用许多常见的已知额外证书限制技术,包括证书固定(只接受一小部分已识别的证书,而不是系统信任的所有证书)和证书透明度(验证所有使用的证书是否已在公共证书日志中注册)。
android-certificate-unpinning-fallback.js
检测未处理的证书验证失败,并尝试使用自动生成的后备补丁处理未知且无法识别的情况。这种方式更具实验性,可能有些不可预测,但对混淆场景非常有用,通常要么修复固定问题(在首次失败之后),要么至少会在 Frida 日志输出中高亮相关代码,便于进一步逆向。该脚本与 android-certificate-unpinning.js 共享部分逻辑,不能单独使用——如果你想使用该脚本,还需要包含非后备的证书固定绕过脚本。
android-disable-root-detection.js
禁用跨原生层和 Java 层的常见 root 检测检查,以防止检测到已 root 的 Android 设备。
该脚本拦截对已知 root 指示器(如 su、Magisk 及相关应用)的文件系统访问、shell 命令和包查询,并伪造关键系统属性(ro.secure、ro.debuggable 等)以模拟生产环境。
它会阻止诸如文件存在性检查和 shell 命令执行之类的可疑行为,帮助逃避使用标准及高级 root 检测的应用的检测。
android-disable-flutter-certificate-pinning.js
确保基于 Flutter 的应用(通常忽略系统证书配置)信任你的 CA 证书,即使在大多数显式证书固定的情况下也是如此。该脚本目前仍处于实验阶段。
ios/
ios-connect-hook.js
直接捕获所有 iOS 网络流量,将所有连接路由到配置的代理主机和端口。
这是一个适用于 所有 网络连接的低层钩子。它确保所有连接都被强制重定向到目标代理服务器,即使是那些忽略代理设置或建立其他原始套接字连接的连接。
ios-disable-detection.js
禁用 JailMonkey 越狱检测。
utilities/test-ip-connectivity.js
你可能通常不会在拦截本身中使用它,但它在你进行配置设置时会非常有用。
该脚本允许你配置一组可能的 IP 地址和一个目标端口,让进程测试每个地址,并在找到第一个可到达的地址时向 Frida 客户端发送消息。如果你不确定从目标设备(手机)访问代理服务器(电脑)时最佳 IP 地址是哪个,这对于自动化配置流程会很有用。