1. 项目概述:为什么我们需要在移动端抓包并绕过SSL锁定?
在移动应用开发、安全测试或是日常的逆向分析工作中,抓包是一个绕不开的核心技能。无论是想分析某个App的网络请求逻辑、调试自己开发的API接口,还是排查线上用户反馈的“网络错误”,抓包工具都能让你清晰地看到设备与服务器之间到底在“聊”些什么。Fiddler作为一款经典的HTTP/HTTPS调试代理工具,因其强大的功能、直观的界面和免费的特性,成为了众多开发者和测试人员的首选。
然而,随着移动应用安全意识的提升,SSL证书锁定(SSL Pinning)技术被广泛应用。简单来说,这项技术就像给你的App和服务器之间的通信上了一把“私锁”。App内置了服务器的“真钥匙”(证书或公钥),在建立HTTPS连接时,它会比对Fiddler这类中间人代理提供的“钥匙”。一旦发现钥匙不对(即证书不匹配),就会立刻中断连接,让你抓包失败。这层保护使得直接使用Fiddler抓取现代App的HTTPS流量变得异常困难,尤其是在安卓高版本和iOS系统上。
因此,一个完整的“Fiddler抓包+绕过SSL证书锁定”方案,就成为了移动端网络分析工作流中的关键一环。它不仅仅是安装一个软件、配置一个代理那么简单,更是一场与系统安全机制和App防护策略的“博弈”。接下来,我将基于多年的实战经验,为你拆解从环境搭建、证书安装到绕过锁定的完整流程,涵盖安卓与iOS两大平台,并分享那些官方文档里不会写的“踩坑”心得。
2. 核心思路与准备工作:搭建可靠的中间人代理环境
在开始具体操作前,我们必须理解整个过程的底层逻辑:中间人攻击(Man-in-the-Middle, MITM)。Fiddler在这里扮演的就是“中间人”的角色。你的手机将所有网络流量发送给Fiddler,Fiddler解密、查看(或修改)后再转发给真正的目标服务器,反之亦然。要实现这一点,需要三个核心条件:
- 网络可达:手机和运行Fiddler的电脑必须在同一局域网下,并能相互通信。
- 信任代理:手机需要信任Fiddler颁发的“假”证书,否则会提示连接不安全。
- 突破锁定:对于启用了SSL Pinning的App,需要设法让它接受Fiddler的证书,或者让它无法校验证书。
2.1 环境准备清单
工欲善其事,必先利其器。以下是开始前你需要准备好的:
- PC端(运行Fiddler):
- 操作系统:Windows(Fiddler Classic原生支持)或 macOS/Linux(可通过Wine或虚拟机运行,或考虑使用Fiddler Everywhere)。
- Fiddler Classic:从官网或可靠渠道下载安装。本文以Windows下的Fiddler Classic v5.0为例。
- 网络:确保电脑的防火墙允许Fiddler监听端口(默认为8888)。
- 移动端(被抓包设备):
- 安卓设备:推荐使用真机。如果需要模拟器,夜神模拟器、雷电模拟器的兼容性较好,且通常自带Root权限,方便后续操作。不推荐使用Android Studio自带的AVD进行抓包,网络桥接配置复杂且性能一般。
- iOS设备:iPhone或iPad。需要一台已越狱的设备,或者使用一些仅在特定条件下有效的方法(后文会详述)。
- 网络环境:
- 将电脑和手机连接到同一个Wi-Fi网络。这是最简单稳定的方式。
- 记录下电脑在当前Wi-Fi下的局域网IP地址(如
192.168.1.105)。在Windows命令提示符中输入ipconfig,查看“无线局域网适配器 WLAN”下的IPv4地址。
2.2 Fiddler基础配置:开启HTTPS解密与远程连接
安装好Fiddler后,第一次运行需要进行关键配置,否则只能抓到HTTP流量,对HTTPS束手无策。
启用HTTPS解密:
- 打开Fiddler,点击菜单栏的Tools -> Options。
- 切换到HTTPS选项卡。
- 勾选最上方的“Decrypt HTTPS traffic”。这时会弹出几个警告窗口,大致意思是Fiddler要安装自己的根证书到系统,以便解密流量,一律点击“是”或“确定”。
- 在“Actions”按钮下,点击“Trust Root Certificate”,将Fiddler的根证书安装到电脑的“受信任的根证书颁发机构”存储区。这一步至关重要,否则浏览器也会报证书错误。
- 建议同时勾选“Ignore server certificate errors”,避免一些服务器证书配置问题导致抓包中断。
允许远程计算机连接:
- 仍在Tools -> Options中,切换到Connections选项卡。
- 勾选“Allow remote computers to connect”。
- 记住Fiddler listens on port后面的端口号,默认是8888。如果该端口被占用,可以修改为其他未被使用的端口,如
8889。 - 配置完成后,务必重启Fiddler以使设置生效。
注意:完成此步骤后,你的电脑已经成为了一个“可信的”中间人代理。Fiddler会自动生成一个唯一的根证书(FiddlerRoot),所有后续手机端需要安装的正是这个证书的派生证书。
3. 安卓平台抓包与绕过SSL锁定全流程
安卓平台的情况相对复杂,不同系统版本(尤其是Android 7.0为分水岭)和手机厂商的定制化带来了诸多挑战。
3.1 基础代理设置与证书安装(针对未启用SSL Pinning的App)
对于大多数普通App或未严格实施证书锁定的App,以下步骤足以完成抓包。
手机连接代理:
- 在手机上,进入当前Wi-Fi网络的详细设置。
- 将代理设置为“手动”。
- 主机名填写你电脑的局域网IP(如
192.168.1.105)。 - 端口填写Fiddler的监听端口(如
8888)。 - 保存设置。
安装Fiddler证书到手机:
- 在手机浏览器中访问
http://你的电脑IP:8888,例如http://192.168.1.105:8888。 - 你会看到Fiddler的欢迎页面,点击页面中的“FiddlerRoot certificate”链接下载证书文件。
- 对于Android 7.0以下版本:下载后直接安装,系统会提示你为证书命名(如“FiddlerRoot”),然后完成安装。你可以在“设置 -> 安全 -> 受信任的凭据 -> 用户”中看到它。
- 对于Android 7.0及以上版本:这是第一个大坑。由于系统安全策略变更,用户安装的证书默认不再被App信任。你需要将证书安装到系统证书区。这通常需要Root权限。
- 有Root权限的手机:下载的证书文件是
.cer格式。你需要将其转换为.pem或.crt格式,并重命名为特定的哈希名,然后放入/system/etc/security/cacerts/目录,并设置权限为644。这个过程较为繁琐,建议使用Magisk模块(如“Move Certificates”)来一键完成。 - 无Root权限的手机:可以尝试将证书安装为用户证书,然后针对目标App,在其网络安全配置中声明信任用户证书。但这需要App的源码或能修改其安装包,对大多数情况不适用。
- 有Root权限的手机:下载的证书文件是
- 在手机浏览器中访问
此时,你应该已经可以在Fiddler中看到手机产生的HTTP和部分HTTPS流量了。如果HTTPS流量显示为“Tunnel to”,或者App报网络错误,那很可能就是遇到了SSL证书锁定。
3.2 绕过SSL证书锁定的实战方案
当基础方法失效时,我们就需要祭出“绕过大法”。这里介绍几种主流且经过验证的方法。
方案一:使用Xposed/EdXposed模块(经典有效,需Root)
这是曾经最主流、最通用的方案,其原理是通过Hook系统或App的证书验证相关API,使其总是返回“验证成功”。
- 适用环境:已Root的安卓手机,并安装了Xposed框架(或它的衍生版本EdXposed、LSPosed)。
- 推荐模块:
- TrustMeAlready:名气最大,效果很好。它主要Hook了安卓的
TrustManager和CertificatePinner(OkHttp库的锁定机制)。 - SSLUnpinning:功能类似,也是一个经典选择。
- TrustMeAlready:名气最大,效果很好。它主要Hook了安卓的
- 操作步骤:
- 在Xposed管理器(如EdXposed Manager)中下载安装对应模块。
- 启用模块,并勾选需要绕过证书锁定的目标App。
- 重启手机或目标App。
- 理论上,此时再打开Fiddler,就能抓到该App的HTTPS明文流量了。
- 实操心得:
- 这种方法对大多数使用系统API或流行网络库(如OkHttp)的App有效。
- 但对于一些使用自定义SSL验证、或将证书公钥硬编码在Native层(C/C++代码)的App,可能仍然无效。
- 在Android 11及以上版本,由于系统对Hook框架的检测和限制更严格,可能需要更复杂的隐藏Root和Xposed的措施。
方案二:使用Frida脚本进行动态Hook(灵活强大,需一定技术基础)
Frida是一个动态代码插桩工具,功能比Xposed更底层、更灵活。你可以编写或使用现成的脚本来在内存中修改App的证书验证逻辑。
- 适用环境:手机端安装frida-server,电脑端使用Python frida工具包。手机最好有Root权限。
- 操作流程:
- 在电脑上安装Python和frida:
pip install frida-tools。 - 根据手机CPU架构,从Frida官网下载对应的
frida-server,推送到手机并运行。 - 编写或寻找针对证书验证函数的Frida脚本。网上有大量开源脚本,例如针对
java.security.cert.X509Certificate.verify或OkHttp的CertificatePinner.check方法的Hook脚本。 - 在电脑上运行命令:
frida -U -f com.target.app -l bypass_ssl_pinning.js,即可在App启动时注入脚本。
- 在电脑上安装Python和frida:
- 注意事项:
- Frida功能强大,但学习成本稍高。
- 一些加固的App会检测Frida的运行,导致注入失败或App闪退,需要进行反调试对抗。
- 这是一种动态方案,每次分析都需要连接电脑执行脚本。
方案三:修改App安装包(一劳永逸,但操作复杂)
直接修改APK文件,移除或修改其证书锁定相关的代码或配置,然后重新签名安装。
- 常用工具:Apktool(反编译/回编译)、dex2jar/jadx(查看Java代码)、Keytool/Jarsigner(签名)。
- 常见修改点:
- 网络安全配置文件:查找
res/xml/network_security_config.xml文件,修改其中的<pin-set>或将<domain-config>的cleartextTrafficPermitted设置为true(仅对HTTP有效,对HTTPS Pinning无效需删除pin)。 - 反编译Smali代码:搜索
CertificatePinner、TrustManager、X509TrustManager等关键词,找到验证逻辑,将其修改为直接return或跳过验证。 - Native层修改:如果验证在so库中,则需要使用IDA Pro等工具分析修改so文件,难度极大。
- 网络安全配置文件:查找
- 核心痛点:
- 操作繁琐,需要对安卓逆向有一定了解。
- 很多商业App都进行了加固,直接反编译会失败,需要先脱壳。
- 修改后需要重新签名,而很多App有签名校验,修改后无法运行,又需要先绕过签名校验。这变成了“套娃”问题。
方案四:使用虚拟环境/沙箱(免Root新思路)
这是近年来比较流行的免Root方案,代表工具有VirtualXposed、太极等。它们创建一个虚拟的安卓环境,在这个环境中可以安装Xposed模块而无需真实Root系统。
- 优点:不需要解锁Bootloader、刷机获取Root,避免了银行类App检测Root导致无法运行的问题。
- 缺点:
- 并非所有App都能完美运行在虚拟环境中,可能存在兼容性问题。
- 性能可能有一定损耗。
- 操作步骤比直接Root手机安装Xposed要多几步。
个人经验总结:对于安卓抓包,我通常会准备一台专门用于测试的、已Root且安装了EdXposed和Magisk的旧手机。Magisk本身可以隐藏Root,配合Shamiko等模块可以更好地隐藏Magisk自身和Xposed,以绕过一些App的强力检测。在这台手机上安装TrustMeAlready模块,能解决90%以上App的抓包问题。对于剩下的“硬骨头”,再考虑结合Frida进行动态分析。这是目前兼顾效率和成功率的组合方案。
4. iOS平台抓包与绕过SSL锁定全流程
iOS系统以其封闭性和统一性著称,这给抓包带来了不同的挑战和相对统一的解决方案。核心前提是:设备必须越狱。虽然存在一些针对特定版本的非越狱方法(如使用描述文件安装自签名证书并信任),但对于启用了SSL Pinning的App,在非越狱环境下绕过几乎是不可能的。
4.1 基础代理设置与证书安装(iOS)
- 连接代理:与安卓类似,进入iPhone的“设置 -> 无线局域网”,点击当前连接的Wi-Fi右侧的“i”图标,滑到最下面选择“配置代理 -> 手动”,填入电脑IP和Fiddler端口。
- 安装证书:
- 用iPhone的Safari浏览器访问
http://电脑IP:8888,下载Fiddler证书。 - 下载完成后,进入“设置 -> 通用 -> VPN与设备管理”(或“描述文件”),找到下载的证书,点击安装。
- 安装后,还需要进入“设置 -> 通用 -> 关于本机 -> 证书信任设置”,找到刚刚安装的Fiddler根证书,并完全信任它。这一步必不可少,否则HTTPS流量无法解密。
- 用iPhone的Safari浏览器访问
完成以上步骤后,Safari浏览器的流量、以及一些未启用SSL Pinning的App的流量,应该就能在Fiddler中看到了。
4.2 绕过iOS的SSL证书锁定
在越狱的iOS设备上,我们拥有系统级权限,可以安装各种强大的越狱插件(Tweaks)来全局或针对性地绕过证书锁定。
方案一:使用Cydia Substrate或libhooker插件(最主流)
越狱后,默认会安装包管理工具Cydia或Sileo。我们可以从中搜索安装以下插件:
- SSL Kill Switch 2:这是iOS平台上最著名的SSL Pinning禁用工具。它通过Hook iOS系统的安全传输层(SecureTransport)等底层的证书验证函数,来全局禁用证书锁定。安装后,在设置中启用即可,对大多数App效果显著。
- AppStore++:这个插件主要用于降级安装App,但有时旧版本App的证书锁定可能更弱或没有,间接解决问题。
- Flex 3:一个强大的补丁制作工具。你可以在Flex的云仓库中搜索目标App,看是否有其他用户分享了已制作好的、用于禁用SSL Pinning的补丁(Patch)。你也可以自己分析App,找到验证函数并制作补丁。
方案二:使用Frida(跨平台统一)
与安卓类似,Frida同样可以在越狱的iOS设备上大显身手。由于iOS系统统一,针对系统API的Frida脚本通用性更强。
- 在Cydia中添加Frida源(
https://build.frida.re),然后安装Frida。 - 在电脑上同样使用
frida-tools。 - 运行命令连接越狱设备,注入SSL绕过脚本。网上有成熟的针对iOS的通用脚本,如
ios-ssl-bypass。
方案三:手动导入系统证书(一劳永逸)
这是比“完全信任”用户证书更彻底的方法。越狱后,我们可以通过Filza等文件管理器,将Fiddler的根证书(需要转换为.pem格式)直接放入iOS的系统证书目录/etc/ssl/certs/或/var/Keychains/中,并设置正确的权限。这样,系统会将其视为真正的受信任根证书,几乎所有App都会买账。但操作涉及系统文件,风险较高,建议操作前备份。
iOS抓包心得:对于iOS,我的首选方案永远是“越狱 + SSL Kill Switch 2”。这个组合简单粗暴,有效性极高。在越狱环境下,整个系统的控制权在你手中,很多问题都有统一的解决方案。如果SSL Kill Switch 2对某个特定App无效,我会接着使用Frida进行更精细化的Hook。需要提醒的是,iOS越狱随着系统更新其工具和兼容性一直在变化,在进行越狱前,务必确认你的设备型号和iOS版本是否有成熟的、稳定的越狱方案。
5. 高阶技巧与深度问题排查实录
即使按照上述流程操作,在实际抓包过程中你仍可能遇到各种“诡异”的问题。下面分享一些高阶技巧和常见问题的排查思路。
5.1 Fiddler过滤与会话处理技巧
当所有流量都经过Fiddler时,会话列表可能会非常杂乱,快速定位目标请求是关键。
- 使用Filters(过滤器):在Fiddler右侧的“Filters”标签页,勾选“Use Filters”。可以按进程(
Process)、主机(Host)、请求头/内容等条件过滤。例如,只想看某个域名的请求,就在“Hosts”区域选择“Show only the following Hosts”,并填入域名如*.example.com。 - 关注状态码与图标:
200:成功。304:未修改(缓存)。404:未找到。500:服务器内部错误。Tunnel to...:这是一个HTTPS隧道,说明Fiddler只建立了连接,但未能解密内容。这通常是证书问题或SSL Pinning导致的。
- 使用“Any Process”拖拽工具:Fiddler左上角有一个“Any Process”的瞄准镜图标,将其拖拽到电脑上任意窗口(如浏览器、某个桌面应用),可以立即过滤出只属于该进程的流量,这个功能极其好用。
5.2 抓不到包或全是TUNNEL的深度排查
这是最常见的问题,可以按照以下清单逐步排查:
- 检查代理设置:确认手机Wi-Fi代理的IP和端口绝对正确。电脑IP是否变更?可以尝试在手机浏览器访问
http://电脑IP:8888,看是否能打开Fiddler页面。 - 检查防火墙:临时关闭电脑的Windows Defender防火墙和任何第三方安全软件,测试是否是防火墙阻止了8888端口的入站连接。
- 确认证书已安装且受信:
- 安卓:进入“设置->安全->加密与凭据->受信任的凭据->用户”,查看是否存在Fiddler的证书。对于高版本安卓,确认是否已通过Root手段安装到系统区。
- iOS:务必在“证书信任设置”中启用完全信任。
- 重启大法:重启Fiddler,重启手机,有时能解决一些玄学问题。
- 检查App特性:
- 是否使用了HTTP/3 (QUIC)?Fiddler Classic对QUIC支持有限,可能导致抓不到包。可以尝试在Fiddler脚本(
Rules -> Customize Rules)中禁用QUIC,或使用Wireshark等底层抓包工具。 - 是否使用了证书双向验证(mTLS)?除了客户端验证服务器证书,服务器也要求验证客户端证书。这种情况非常罕见,但一旦出现,Fiddler作为中间人无法提供有效的客户端证书,连接会失败。这需要拿到App内置的客户端证书和私钥并导入Fiddler,难度极高。
- 是否在Native层实现的网络请求?有些游戏或高性能App使用C++直接进行Socket通信,不走系统的HTTP/HTTPS代理设置。这时需要抓取整个网卡的数据包,使用Wireshark是更合适的选择。
- 是否使用了HTTP/3 (QUIC)?Fiddler Classic对QUIC支持有限,可能导致抓不到包。可以尝试在Fiddler脚本(
- 尝试其他抓包工具:如果Fiddler始终不行,可以换用Charles或mitmproxy试试。它们的原理相同,但实现细节有差异,有时Charles能抓到Fiddler抓不到的包(反之亦然)。
5.3 针对特定顽固App的对抗思路
有些App采用了组合拳进行防护,例如:SSL Pinning + Root/越狱检测 + 代理检测 + 模拟器检测。你需要层层突破:
- 环境伪装:使用Magisk(安卓)或相关的越狱隐藏插件(如Liberty Lite、Shadow),隐藏Root/越狱状态。对于代理检测,有些App会检查系统是否设置了全局代理,你可以尝试使用ProxyDroid(安卓)这类工具实现透明代理,或者使用VPN模式的抓包工具(如Packet Capture安卓App),让流量先经过一个本地VPN再转发给Fiddler。
- 动态Hook对抗检测:使用Frida编写脚本,Hook App中用于检测Root、代理、模拟器的函数,使其永远返回“安全”的结果。
- 使用物理真机:很多检测在模拟器上尤为严格,换用一台不常用的真机进行测试,可能就能绕过检测。
- 降级安装旧版本:旧版本App的安全措施往往较弱。如果业务允许,可以尝试寻找并安装旧版本的APK或IPA。
6. 安全、合规与伦理边界
最后,也是最重要的一部分,我们必须严肃讨论使用这些技术的边界。
- 仅用于合法授权范围:抓包和逆向技术只能用于你自己拥有或有权测试的应用程序、或明确属于安全研究范畴的公开应用。绝对禁止用于窃取他人数据、干扰他人服务、进行商业间谍活动或任何形式的非法入侵。
- 尊重用户协议与法律法规:很多App的用户协议明确禁止逆向工程。在进行任何测试前,请务必阅读相关协议,并确保你的行为符合所在地的法律法规。
- 用于正向目的:这些技术真正的价值在于:
- 开发调试:前端开发人员调试API接口,后端开发人员排查问题。
- 安全测试:作为白帽子或安全工程师,发现并报告应用中的安全漏洞,帮助厂商提升产品安全性。
- 学习研究:分析优秀应用的网络架构设计,学习其协议实现,提升个人技术水平。
我个人的体会是,掌握抓包和绕过SSL锁定的技术,就像拥有了一把打开网络世界黑箱的钥匙。它让你从被动的“用户”,变成了能主动观察和理解的“研究者”。这个过程充满挑战,但每一次成功抓取到目标流量、分析出协议逻辑时带来的成就感,是无与伦比的。技术本身是中立的,关键在于使用它的人。希望这份详尽的指南,能帮助你在合法合规的范围内,更高效地完成你的开发、测试或学习工作。记住,遇到问题多搜索、多尝试、多思考,每一个坑踩过去,都是宝贵的经验积累。