使用Frida与r0Capture绕过移动端SSL Pinning实现HTTPS抓包

发布时间:2026/7/22 6:51:40
使用Frida与r0Capture绕过移动端SSL Pinning实现HTTPS抓包 1. 项目概述为什么我们需要攻克SSL Pinning在移动应用安全测试、逆向分析或者仅仅是出于技术好奇心的驱动下我们常常需要窥探应用与服务器之间传输的网络数据。几年前这或许只需要在电脑上装个抓包代理工具比如Charles或Fiddler然后在手机上设置一下代理就能轻松看到HTTP明文请求。但如今随着安全意识的提升HTTPS已成为标配而SSL Pinning证书绑定技术更是给我们的抓包之路设下了一道坚固的屏障。SSL Pinning的本质是应用在代码层面“记住”了它信任的服务器证书或公钥。当建立TLS连接时应用会将自己内置的证书信息与服务器返回的进行比对。如果不匹配即便用户手机里安装了我们的抓包工具生成的“中间人”证书连接也会被果断拒绝。这就好比你去银行柜员不仅看你的身份证系统根证书还要求你背出开户时设置的密语内置证书指纹对不上就拒绝服务。许多主流App尤其是金融、社交类应用都广泛采用了这一技术来防止中间人攻击。因此传统的抓包方法在遇到SSL Pinning时往往束手无策。我们需要更底层的工具能够绕过应用层的这种校验机制。r0Capture脚本正是在这种需求下诞生的一个利器。它不是一个独立的App而是一个运行在Frida框架上的脚本。Frida是一个动态插桩工具可以让我们在运行时向目标应用注入JavaScript代码从而修改其行为。r0Capture的核心思路就是找到应用中进行证书验证的关键函数然后通过Hook钩子技术让这些验证函数“放行”或者返回我们期望的结果。简单来说这个项目就是教你如何配置环境、运行脚本最终实现一个能“通杀”iOS和Android平台SSL Pinning的抓包方案。无论你是安全研究员、开发调试者还是爱好者掌握这套方法就等于拿到了一把打开移动端加密通信黑盒的万能钥匙。2. 环境准备与工具链搭建工欲善其事必先利其器。在运行r0Capture之前我们需要搭建一个完整的工作环境。这个过程涉及多个组件我会详细说明每个部分的作用、选择理由以及具体的安装配置步骤。2.1 核心工具Frida的安装与配置Frida是整个方案的基石。它分为两部分运行在电脑上的客户端frida-tools和运行在手机上的服务端frida-server。电脑端安装以macOS/Linux为例Windows类似强烈建议使用Python的虚拟环境来管理避免包冲突。# 创建并进入虚拟环境 python3 -m venv frida_env source frida_env/bin/activate # Windows下是 frida_env\Scripts\activate # 安装frida-tools pip install frida-tools安装完成后在终端输入frida --version能显示版本号即表示成功。手机端部署这里的选择取决于你的手机是否已获得RootAndroid或越狱iOS权限。r0Capture的强大之处在于它对两种环境都提供了支持。已Root/越狱环境推荐Android从Frida官网的GitHub Releases页面下载对应你手机CPU架构通常是arm64的frida-server文件。通过ADB推送到手机并运行。adb push frida-server-16.1.4-android-arm64 /data/local/tmp/frida-server adb shell su cd /data/local/tmp chmod 755 frida-server ./frida-server iOS在Cydia或Sileo等越狱商店中添加Frida源直接搜索安装Frida。安装后服务会自动在后台运行。非Root/非越狱环境 这是r0Capture脚本的一个亮点它支持通过重打包或动态加载的方式将Frida Gadget嵌入到目标应用中。以Android为例可以使用objection工具基于Frida的patchapk命令或者手动使用apktool反编译APK将frida-gadget.so库文件添加到其lib目录并修改AndroidManifest.xml以加载它。这个过程相对复杂需要对APK结构有一定了解并且可能触发应用自身的完整性校验。对于iOS非越狱设备则需要使用Xcode开发证书对应用进行重签名并注入Frida动态库这需要苹果开发者账号。注意使用非Root模式存在更高的技术门槛和不确定性。对于初学者强烈建议先在已Root的Android设备或已越狱的iOS设备上实践成功率最高流程最清晰。2.2 抓包代理mitmproxy的选择与设置Frida帮我们绕过校验但实际的流量拦截和查看还需要一个代理工具。这里我推荐mitmproxy而不是老牌的Charles原因有三一是它完全免费开源二是命令行操作更便于自动化集成三是其对HTTP/2等新协议的支持非常好。安装mitmproxypip install mitmproxy安装后你会得到三个命令mitmproxy交互式终端UI、mitmdump命令行版本适合脚本化和mitmwebWeb UI。我们常用mitmdump。生成并安装CA证书启动mitmproxy后它会在~/.mitmproxy目录生成CA证书。我们需要把这个证书安装到手机上。# 启动mitmdump监听8888端口 mitmdump -p 8888然后在电脑浏览器访问http://mitm.it根据页面指引下载对应手机系统的证书文件Android是.cer或.crtiOS是.cer。在手机上安装此证书并务必在系统设置中将其标记为“受信任的根证书”对于Android 7以上还需要将证书安装到系统级目录这通常需要Root权限否则应用默认不信任用户安装的证书。这也是为什么Root环境更简单的原因之一。2.3 目标脚本r0Capture的获取与初步了解r0Capture脚本通常以.js文件形式存在。你可以从GitHub等开源平台搜索并下载它。拿到脚本后不要急着运行先用文本编辑器打开看看。脚本的开头部分通常会有一些配置项例如var is_use_hook_ssl true; // 是否Hook SSL相关函数 var is_use_hook_okhttp true; // 是否Hook OkHttp框架Android常用 var is_use_hook_alamofire true; // 是否Hook Alamofire框架iOS常用 var is_use_hook_sslpinning true; // 是否直接绕过证书绑定逻辑根据你的目标应用可能使用的网络库你可以在这里进行预配置。脚本的主体是大量的Interceptor.attach代码块它们瞄准了各个平台和网络库中负责证书验证、信任决策的关键函数如checkServerTrusted、SSLPinning、URLSession的相关委托方法等。3. r0Capture脚本核心原理与策略解析理解了环境搭建我们深入看看r0Capture这个脚本到底做了什么。它的核心战术可以概括为“多点狙击全面覆盖”针对不同平台、不同网络库的实现机制布置了多个Hook点。3.1 Android平台的Hook策略Android应用实现网络请求的库五花八门但最常见的是系统原生HttpsURLConnection和Square公司开源的OkHttp库。r0Capture对两者都有针对性的处理。针对HttpsURLConnection 其证书验证的核心在TrustManager接口和X509TrustManager的具体实现上。脚本会HookcheckClientTrusted和checkServerTrusted等方法。最基本的绕过方式就是让这些方法直接return不做任何校验。但更优雅的方式是修改其参数让它接受我们mitmproxy证书链中的任何证书。// 示例Hook X509TrustManager.checkServerTrusted var X509TrustManager Java.use(javax.net.ssl.X509TrustManager); var checkServerTrusted X509TrustManager.checkServerTrusted.overload([Ljava.security.cert.X509Certificate;, java.lang.String, java.lang.String); checkServerTrusted.implementation function(chain, authType, hostname) { console.log([] Bypassing checkServerTrusted for: hostname); // 直接返回相当于信任所有证书 // 或者可以在这里打印或修改证书链信息 return; }针对OkHttp OkHttp自身提供了证书绑定的APICertificatePinner。脚本会HookCertificatePinner.check方法。同时OkHttp底层也依赖于TrustManager所以上一步的Hook同样有效形成双重保障。脚本的策略通常是直接让check方法静默通过或者清空应用预设的证书指纹列表。针对Conscrypt等安全提供商 一些应用或系统会使用像Conscrypt这样的替代TLS实现来增强安全性。r0Capture的高明之处在于它也包含了对这些底层库的Hook点例如HookConscrypt中的证书验证逻辑确保不留死角。3.2 iOS/macOS平台的Hook策略iOS端的情况相对统一主要使用系统提供的NSURLSession或URLSession进行网络请求第三方库如AlamofireSwift也是基于此封装。针对URLSession的认证挑战处理 当遇到SSL Pinning时URLSession会通过其委托delegate方法urlSession(_:didReceive:completionHandler:)来发起认证挑战URLAuthenticationChallenge。应用在这个回调里实现自定义的证书验证逻辑。r0Capture的脚本会Hook这个关键的回调方法并直接调用completionHandler告诉系统“使用默认的凭据继续”.performDefaultHandling或者“信任此服务器”.useCredential从而绕过应用的自定义验证。// 示例Hook URLSessionDelegate的didReceiveChallenge方法Objective-C var URLSessionDelegate ObjC.classes.NSURLSessionDelegate[- URLSession:didReceiveChallenge:completionHandler:]; Interceptor.attach(URLSessionDelegate.implementation, { onEnter: function(args) { console.log([] Hooking URLSession authentication challenge.); // args[4] 是completionHandler的block指针 var completionHandler new ObjC.Block(args[4]); // 提前执行完成处理指示信任服务器 const NSURLSessionAuthChallengeUseCredential 0; var cred ObjC.classes.NSURLCredential.credentialForTrust_(args[3]); // challenge.protectionSpace.serverTrust completionHandler.implementation(NSURLSessionAuthChallengeUseCredential, cred); } });针对Alamofire 对于使用Alamofire的Swift应用脚本会定位其内部的ServerTrustPolicy评估逻辑。Alamofire会在一个内部队列里执行证书评估r0Capture通过Hook相关方法直接让评估结果为成功.performDefaultHandling或直接返回一个有效的SecTrust对象。3.3 通用底层HookSSL/TLS库函数除了针对高级框架r0Capture还会尝试Hook更底层的C函数例如OpenSSL库中的SSL_CTX_set_cert_verify_callback、SSL_get_verify_result等或者苹果安全框架Security.framework中的SecTrustEvaluate、SecPolicyCreateSSL等函数。这些Hook是平台无关的只要应用使用了这些标准库就能生效属于“兜底”策略。实操心得在实际使用中你可能会发现并非所有Hook点都对目标应用有效。这是因为应用可能使用了自定义的加密库、将验证逻辑用C编写并深度混淆、或者使用了虚拟机保护等技术。此时需要结合静态分析反编译查看代码和动态调试观察脚本的日志输出看哪个Hook点被触发了来调整脚本的Hook策略或者手动补充新的Hook点。4. 完整实操流程从启动到捕获数据现在我们将所有环节串联起来完成一次完整的抓包操作。假设我们已经在Root的Android手机上准备好了frida-server电脑上安装好了mitmproxy和frida-tools并下载了r0Capture.js脚本。4.1 步骤一启动抓包代理首先在电脑上启动mitmproxy设置好监听端口例如8888并确保手机能通过Wi-Fi连接到电脑所在的同一网络并将手机的代理设置为电脑的IP和这个端口。# 在电脑终端执行 mitmdump -p 8888 -w capture_data.log这里加了-w参数将捕获的流量同时写入文件capture_data.log方便后续分析。4.2 步骤二附加脚本到目标进程接下来使用Frida将r0Capture脚本注入到目标应用中。我们需要知道目标应用的进程名或包名。连接设备确保手机USB连接并开启了USB调试Android或通过Wi-Fi连接frida -H。列出进程frida-ps -U可以列出USB设备上的所有进程。附加并运行脚本假设目标应用包名为com.example.targetapp。frida -U -f com.example.targetapp -l r0Capture.js --no-pause-U: 连接到USB设备。-f: 启动指定的应用如果应用未运行则会启动它。-l: 加载指定的JavaScript脚本。--no-pause: 启动后立即恢复进程运行默认会暂停。执行命令后如果脚本成功注入你会在终端看到大量的Frida输出日志显示各个Hook点被成功附加的信息例如“[] Hooking OkHttp CertificatePinner...”。4.3 步骤三操作应用并观察流量回到手机正常使用目标应用触发你需要抓取数据的网络请求比如登录、刷新列表、提交表单等。此时你的电脑终端会有两个信息流Frida脚本输出显示Hook函数被调用的情况例如“Bypassing checkServerTrusted for api.example.com”。这证明SSL Pinning已被成功绕过。mitmdump输出开始滚动显示拦截到的HTTP/HTTPS请求和响应的概要信息包括URL、方法、状态码等。你可以在mitmdump的交互界面如果使用mitmproxy命令中按回车键选择某个请求查看其详细的请求头、请求体、响应头和响应体。对于HTTPS请求由于证书验证已被绕过你现在能看到解密的明文数据。4.4 步骤四高级过滤与数据保存面对应用产生的大量请求我们需要过滤出关键信息。在mitmdump中过滤可以使用表达式过滤例如只显示包含特定关键词的请求。mitmdump -p 8888 ~s example # 只显示URL中包含example的请求使用-w和-r参数如前所述-w保存所有流量到文件。事后可以用mitmdump -r capture_data.log回放分析或者用-n参数不启动代理直接读取分析文件。结合其他工具将mitmdump捕获的流量-w保存的文件是标准的流量存储格式导入到Wireshark中进行更深入的协议分析或者使用自定义的Python脚本解析capture_data.log。注意事项确保手机代理设置正确且电脑防火墙没有阻止8888端口。如果应用启动后立刻崩溃可能是脚本的某个Hook点与应用不兼容。可以尝试修改脚本注释掉某些Hook模块比如先关闭对OkHttp的Hook采用排除法定位问题。对于使用了强混淆或加固的应用Frida可能无法轻易找到类和方法名。这时需要先进行静态分析找到混淆后的名称并相应修改脚本中的Hook点。5. 疑难排查与进阶技巧即使按照步骤操作你也可能会遇到各种问题。这里记录了一些常见坑点和解决方案。5.1 常见问题速查表问题现象可能原因排查步骤与解决方案Frida连接失败提示DeviceNotFoundError1. USB调试未开启。2.frida-server未在设备上运行。3. 电脑ADB驱动问题。1. 检查手机开发者选项中的USB调试。2. 通过adb shell进入设备ps | grep frida查看进程并重新运行frida-server。3. 重启ADB服务adb kill-server adb start-server。脚本注入成功但mitmproxy仍显示TLS handshake failed1. 手机未正确安装或信任mitmproxy的CA证书。2. 目标应用使用了证书固定且脚本的Hook点未生效。3. 应用使用了非标准端口或自定义协议。1. 重新访问http://mitm.it下载安装证书并在系统设置中设置为完全信任。2. 查看Frida日志确认是否有成功的Hook输出。尝试启用脚本中更多的Hook模块。3. 检查mitmproxy是否支持该协议如WebSocket、gRPC可能需要额外配置。应用启动后立即闪退1. 脚本Hook了不存在的类或方法导致应用崩溃。2. 应用有反调试/反Frida检测。1. 使用frida -U -f com.example.app --no-pause不加脚本测试应用是否能正常启动。然后逐步启用脚本中的Hook模块定位问题点。2. 脚本本身或需配合其他反反调试脚本使用。可以尝试Frida的-D参数指定调试器或使用frida-obfuscation等工具对抗检测。能看到HTTPS请求但请求体/响应体是乱码或加密1. 应用使用了额外的自定义加密在HTTPS之上。2. 数据可能被压缩如gzip。1. 这超出了SSL Pinning绕过的范畴。需要逆向分析应用的自定义加密算法并编写解密脚本。2. mitmproxy会自动解压常见的压缩格式。如果未解压可在请求头中看到Content-Encoding: gzip需手动解压。iOS非越狱设备注入失败1. 重签名后的应用启动崩溃。2. 注入的动态库未正确签名或加载。1. 确保使用有效的开发者证书和正确的Provisioning Profile。2. 检查嵌入Frida Gadget的步骤确保库文件被正确添加到“Embedded Binaries”和“Linked Frameworks and Libraries”中。使用otool -L检查二进制文件的依赖。5.2 进阶技巧与优化脚本定制化不要满足于使用现成的r0Capture.js。根据目标应用你可以精简脚本只保留可能用到的Hook点减少性能开销和冲突概率。也可以根据静态分析结果添加针对特定自定义库的Hook。持久化Hook对于需要长期监控的应用可以研究将Frida脚本持久化到应用中的方法如修改APK的libmain.so的初始化数组。但这属于更高级的逆向工程范畴。结合静态分析使用IDA Pro、Ghidra、Hopper或jadx等工具反编译应用直接搜索X509TrustManager、checkServerTrusted、CertificatePinner、NSURLSession等关键词精准定位验证代码的位置为编写或调整Hook脚本提供最关键的依据。处理双向证书绑定有些高级应用不仅验证服务器证书Server Pinning还会要求客户端提供证书Client Certificate Pinning。这种情况下除了绕过服务器验证还需要将客户端证书从应用中提取出来并配置到mitmproxy中让mitmproxy能使用该证书与服务器通信。这涉及到更深层次的密钥提取和代理配置。性能考虑注入Frida脚本会对应用性能产生一定影响可能会被应用感知。在不需要的时候及时断开Frida连接CtrlC终止进程或使用frida的--detach参数。绕过SSL Pinning是一个动态对抗的过程。随着应用防护手段升级工具和脚本也需要不断进化。r0Capture提供了一个强大而灵活的起点但真正的实战能力来源于对移动端安全机制、网络协议和逆向工具链的深入理解与不断实践。掌握这套方法你就能在合规的安全测试与研究中打开那扇通往加密数据世界的大门。