调试抖音这类加密App的时候,我最常被问到的就是“为什么抓不到包”“为什么装了证书还是只看到CONNECT隧道”。说实话,抖音和其他主流大厂App在客户端做了不少防护,真机和普通抓包工具直接怼上去,大概率只看到一堆TLS握手垃圾信息。这个保姆级教程里的组合——Fiddler + 夜神模拟器——是我用了很久、踩过不少坑之后觉得对新手最友好、对环境要求最低的一套方案。它解决的是“如何稳定看到抖音App的HTTPS明文请求”这个核心问题,适合做移动端开发调试、接口分析、爬虫逆向、安全测试的朋友参考,哪怕你之前没配过Android代理,按着步骤一步步来也能跑通。
整套方案还有一个关键点是把SSL Pinning绕过单独拉出来讲。很多教程只教你装好证书,结果一抓抖音直接空白,原因就是抖音自己校验了证书绑定,不处理这一层,前面全白干。这篇文章会把环境搭建、证书信任链、绕过原理、坑点排查一次说完。
1. 方案选型:为什么是Fiddler + 夜神模拟器
1.1 Fiddler相比Charles、Wireshark的取舍
抓包工具有不少,Charles、Wireshark、Burp Suite、Reqable各有各的用户群。Fiddler Classic最大的优势是免费、上手快、Windows下表现稳,而且对HTTPS解密这块做得非常成熟,一个开关就能开启中间人解密,不像Wireshark那样要在网卡层抓包再做TLS密钥导出,光配置就劝退一半新手。
Charles也是一款优秀工具,但它的试用期限制和授权价格让很多入门用户直接放弃。Burp Suite更偏Web渗透测试场景,对移动App的代理配置和证书预处理流程相对繁琐。Fiddler在“快速搭建、快速出结果”这个目标上,胜出得非常明显。
Wireshark则是另一个维度的工具,它在二层三层抓包,能看到TCP握手、DNS、协议细节,但它看不到HTTPS的明文内容。如果你只是想看抖音App调用了哪个接口、传了什么JSON参数,Wireshark帮不上忙。选Fiddler,本质上就是选择“我要看应用层HTTP/HTTPS明文”。
1.2 模拟器相比真机的优势
很多人喜欢用真机抓包,但我更推荐模拟器,核心原因是可控性和恢复成本。真机上安装证书、改系统证书目录需要root,而现在的手机root成本越来越高,刷机变砖的风险也不是人人都能接受。夜神模拟器则天生带root权限,系统证书目录可以直接读写,SSL Pinning绕过所需要的Xposed环境也能轻松搞定。
另外,模拟器有快照功能。抓包前拍一个快照,如果安装Xposed模块或者改系统证书改坏了,一键恢复,不用重装系统。这个体验在真机上完全无法复制。
还有一点容易被忽略:抖音这类超大App在模拟器里跑起来,CPU和内存开销其实是可控的。夜神模拟器可以自定义CPU核数和内存,给它4核+4GB内存,跑抖音短视频操作流非常顺畅,比部分旧款真机还流畅。
1.3 HTTPS抓包的核心原理:中间人解密
HTTP抓包大家都知道,流量是明文,Fiddler直接就能看到请求和响应。但互联网现在几乎全是HTTPS,抓包工具面对的不是明文,而是一堆看起来像乱码的加密数据。
Fiddler解密HTTPS的思路是“中间人代理”。它作为客户端和服务器之间的代理节点,做两件事:
- 对客户端(App)来说,Fiddler伪装成服务器,用自己的根证书签发一个动态证书,让客户端信任它
- 对服务器来说,Fiddler伪装成客户端,用真实的TLS握手流程去访问服务器
这个过程中,客户端与Fiddler之间的流量是Fiddler可控解密的,Fiddler与服务器之间的流量也是真实可解密的。前提条件是客户端必须信任Fiddler的根证书。这就是为什么教程里那么强调安装证书,证书装不上或者不被信任,Fiddler就只能看到CONNECT隧道,根本看不到HTTP内容。
理解了这一层,你就能明白为什么有SSL Pinning的App就算装了证书也抓不到包。因为SSL Pinning会做校验:你这个证书是不是服务器颁发的那一张?如果不是,直接断开连接,不管系统是不是信任它。
提示:这里的“代理”是Fiddler作为调试代理服务器的功能,跟常见的HTTP代理工具是同一类技术,属于开发调试的正常操作。请只在你自己有权限调试的App和环境下使用。
2. 环境准备与基础配置
2.1 安装必装环境:Fiddler Classic、夜神模拟器、ADB
这一套环境最核心的三个组件,按顺序装就行。
Fiddler Classic是主抓包工具,官方地址下载安装包,优先使用“Fiddler Classic”而不是“Fiddler Everywhere”。Fiddler Everywhere虽然界面现代化,但授权策略收紧,部分版本离线激活麻烦,Classic版本功能够用且免费。安装过程一路Next即可,不需要额外配置。
夜神模拟器用于运行Android环境,官方下载安装即可。安装后建议在设置里把分辨率设为手机竖屏模式(720x1280足够),Android版本可以根据需求选择Android 7或Android 9镜像。注意,Android版本的选择会影响后面的证书配置复杂度,文章后面会展开说。
ADB工具用于连接模拟器和推送文件。夜神模拟器自带adb路径,通常在其安装目录下的bin或者nox_adb.exe。也可以使用Android SDK自带的adb。建议把adb配置到系统环境变量里,后续命令行操作会省很多事。
2.2 开启Fiddler HTTPS解密与远程连接
Fiddler装好后,打开菜单栏的Tools -> Options,进入HTTPS选项卡,勾选:
- Capture HTTPS CONNECTs
- Decrypt HTTPS traffic
在弹出的证书信任提示里选择“是”,让Windows信任Fiddler根证书。这一步是给电脑端浏览器用的,模拟器用的证书后面单独处理。
接着进入Connections选项卡,勾选Allow remote computers to connect,这是最关键的一步。默认情况下Fiddler只监听本机回环地址,模拟器相当于另一台“远程电脑”,不放开这个选项,模拟器的流量根本进不来。
这里注意Fiddler默认监听端口是8888,后续模拟器配置代理时要用到这个端口。可以自定义,但强烈建议保持8888默认,因为后面的教程和命令行工具默认认这个端口,改来改去容易出问题。
2.3 让模拟器流量走Fiddler
打开夜神模拟器,然后在Windows命令行执行:
adb connect 127.0.0.1:62001夜神模拟器的默认adb端口是62001,如果连接失败,可以用nox_adb.exe connect 127.0.0.1:62001确认一下。连接成功后执行adb devices应该能看到设备列表里出现一个127.0.0.1:62001的设备。
接着要把模拟器网络代理指向电脑的Fiddler。在模拟器里打开设置,进入Wi-Fi,长按当前已连接的Wi-Fi网络,选择“修改网络”,展开“高级选项”,把“代理”改为“手动”,主机名填你电脑的局域网IP,端口填8888。
电脑的局域网IP怎么查?命令行执行ipconfig,找IPv4 地址,比如192.168.1.100。注意不要填127.0.0.1,因为127.0.0.1在模拟器里指向的是模拟器自己,不是你的电脑。
配置完后,打开模拟器里的浏览器随便访问一个HTTP网站,Fiddler里应该就能看到请求记录。这一步通了,说明代理链路已经建立。
3. HTTPS证书安装与信任链搭建
3.1 下载并安装Fiddler根证书到模拟器
代理链路通了,但HTTPS还是抓不到明文,因为模拟器里的App还不信任Fiddler根证书。接下来的核心工作就是把这个根证书装进模拟器的系统信任区。
先在模拟器自带的浏览器里输入:
http://你的电脑IP:8888Fiddler会生成一个页面,右下角有FiddlerRoot certificate下载链接,点击下载证书文件。默认文件名是FiddlerRoot.cer。
将这个.cer文件通过adb推送到模拟器的/sdcard/Download/目录:
adb push FiddlerRoot.cer /sdcard/Download/然后在模拟器里打开文件管理器,点击FiddlerRoot.cer,系统会引导你安装证书。在Android 7以下的系统,这一步通常就够用了。但如果你是Android 7及以上镜像,事情还没完,往下看。
3.2 Android 7+系统证书目录迁移
Android 7.0开始有一个安全策略变化:App默认只信任系统证书,不再信任用户安装的证书。这意味着你手动安装到“用户证书”区的Fiddler证书,对抖音这类App来说等于没装,它根本不看用户证书区。
解决办法是把Fiddler证书移动到系统证书目录。系统证书目录是/system/etc/security/cacerts/,这个目录在正常状态下是只读的,但夜神模拟器有root权限,可以先把/system重新挂载为可写。
需要准备的工具有:一个能计算证书哈希的openssl工具,以及adb命令行。先把.cer转换成.pem格式:
openssl x509 -inform DER -in FiddlerRoot.cer -out FiddlerRoot.pem然后计算证书的哈希文件名:
openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem会输出一串十六进制数字,比如e5c3944b,这串数字是Android系统证书目录的命名规则。把证书重命名成:
e5c3944b.0接着执行挂载和复制操作:
adb root adb remount adb push e5c3944b.0 /system/etc/security/cacerts/执行成功后,在模拟器命令行里验证一下系统证书是否存在:
adb shell ls /system/etc/security/cacerts能看到以.0结尾的证书文件,就说明系统证书装好了。
需要注意,夜神模拟器的Android镜像如果是只读文件系统,adb remount可能不生效。这时候可以用adb shell进去后手动执行mount -o rw,remount /system。有些版本的模拟器还需要在设置里开启“root权限”开关,默认root权限是关闭的,需要在夜神模拟器的设置里打开。
3.3 验证证书是否被抖音App信任
证书装好后,怎么确认真的生效了?不要急着抓抖音,先在模拟器浏览器里访问一个https://开头的网站,比如https://www.baidu.com。如果Fiddler里能看到HTTPS请求的明文(Headers、JSON、响应内容),说明系统证书信任链已经打通。
如果浏览器提示证书无效或者页面打不开,问题大概率出在第3.2步。检查以下几点:
- 证书是否已经放进
/system/etc/security/cacerts/ - 证书文件名是否是
openssl x509 -subject_hash_old算出的那串十六进制加.0 - 模拟器是否已经重启过。系统证书缓存有时候需要重启App才能生效,建议重启一次模拟器再验证
到这一步,普通App的HTTPS抓包已经没问题了。但抖音这种做了SSL Pinning的App,仍然会拒绝连接。这也是很多教程卡住的地方,下一部分单独解决。
4. SSL Pinning绕过实战
4.1 理解SSL Pinning:为什么装了证书还是抓不到
SSL Pinning直译就是“证书绑定”或“证书锁定”。正常HTTPS通信中,客户端在TLS握手阶段会校验服务器证书是否由受信任的CA签发。SSL Pinning在此基础上多加了一层校验:客户端保存了服务器证书的指纹或公钥,每次连接时比对当前证书和保存的指纹是否一致。
如果一致,说明服务器是真的;如果不一致,即使系统信任证书,客户端也会强行断开连接。抖音App就使用了这种机制。我们通过Fiddler中间人解密时,拿给抖音的证书是Fiddler动态签发的,指纹自然和抖音服务器真实证书不一样,于是连接被掐断。
绕过SSL Pinning的核心思路就是让App“放弃”自己的证书校验逻辑。具体做法有很多种,常见的有修改APK反编译后去除校验逻辑、Hook掉校验函数、或者使用Xposed模块在运行时替换校验行为。
对大多数场景和大多数版本,最简单的方案是使用Xposed/LSPlant + JustTrustMe模块,用Hook的方式在运行时干掉证书校验。
4.2 搭建Xposed/LSPlant环境并安装JustTrustMe
夜神模拟器自带root权限,这为安装Xposed框架提供了极大便利。但很多教程推荐的经典Xposed框架在老版本Android上有兼容问题。我这里推荐使用LSPlant作为替代,它对新版模拟器镜像的兼容性更好,安装过程也简单。
首先在模拟器里下载安装LSPlant的APK,然后在LSPlant应用里点击“安装”按钮,等待框架装载完成。这一步需要root权限,弹窗提示时点击允许即可。
装好LSPlant后,下载JustTrustMe模块的APK并安装。JustTrustMe是一个开源的Xposed模块,它做的事情非常暴力也很有效:Hook掉常见的TrustManager、OkHttp的CertificatePinner、X509TrustManager等关键类,让App在TLS握手时不校验证书指纹。
安装完成后,在LSPlant的模块管理界面启用JustTrustMe,然后重启模拟器。这一步一定是重启模拟器,不是重启App。Xposed模块的加载发生在App进程启动阶段,不重启进程不会生效。
重启后,在模拟器里打开抖音App,回到电脑端的Fiddler,你会发现之前只显示CONNECT隧道的情况变了,开始出现真正的HTTPS请求记录,包括抖音的接口域名、路径、请求头和请求体,全都能看到明文。
4.3 绕过后的验证与抓包效果
这里分享一个我实测下来的操作细节:打开抖音App后,不要急着刷视频,先让它在首页停几秒钟。抖音启动阶段会发送一批初始化请求,包括设备信息上报、配置拉取、启动广告配置等,这些请求在Fiddler里都有非常清晰的体现。
然后上下滑动浏览视频,触发播放和推荐接口,这是观察接口调用的黄金场景。你会在Fiddler里看到类似这样的请求类型:
/aweme/v1/feed/:推荐流视频列表/aweme/v1/commit/item/digg/:点赞接口/aweme/v1/aweme/post/:用户主页视频列表
这些接口的请求体里通常会有m开头的加密参数,不同版本App字段名不同。看到这类请求,就说明整个链路已经通了,接下来无论是做数据分析还是接口调试都非常方便。
注意:SSL Pinning绕过技术只适合用在你拥有调试权限的App、测试环境或学习研究场景中。请勿用于非法抓取他人服务数据、绕过付费验证或侵犯他人权益,技术本身是中性的,但使用的边界需要自己把握。
5. 高频问题排查与避坑笔记
5.1 开了Fiddler后浏览器/模拟器上不了网
这是碰到最多的问题。打开Fiddler后,电脑浏览器、模拟器全部断网,关掉Fiddler又恢复正常。这个问题几乎都是因为Fiddler开启了“系统代理”并且代理配置异常。
Fiddler在启动时会自动把Windows系统代理设置为127.0.0.1:8888,退出时自动还原。如果Fiddler异常崩溃,系统代理没有被还原,就会导致整个电脑上不了网。解决办法是重新打开Fiddler再正常退出一次,或者在Windows的“Internet选项 -> 连接 -> 局域网设置”里,手动取消代理服务器勾选。
另外一个导致这个现象的原因是Fiddler端口被占用或者SSL解密配置异常。建议把Fiddler升级到最新版,并检查Tools -> Options -> HTTPS里的证书设置,如果证书过期,点击“Reset certificates”重新生成根证书。
5.2 证书安装了但抖音还是抓不到包
这个现象通常有三种原因,按出现频率排序如下。
第一,模拟器里装的是用户证书而不是系统证书。Android 7以上抖音根本就不会信任用户证书,你需要在设置 -> 安全 -> 加密与凭据 -> 信任的凭据里分别查看“系统”和“用户”两个标签页,确认Fiddler证书在“系统”标签页里。如果在“用户”标签页,说明证书没有正确迁移到/system/etc/security/cacerts/。
第二,LSPlant/JustTrustMe没有真正生效。打开LSPlant应用,确认模块管理里JustTrustMe是已启用状态,然后重启模拟器。有些模拟器镜像对LSPlant支持不好,如果启用后依然抓不到,建议换成Android 7的镜像重试,这个版本兼容性最好。
第三,抖音App版本过新,可能加入了反调试或对Xposed环境的检测。这种情况下,任何证书和Hook方案都会被识别,App会弹出“网络异常”或者干脆不发送接口请求。处理办法是安装稍旧版本的抖音App进行测试,比如2023年左右发布的版本,兼容性更好,SSL Pinning也相对容易绕过。
5.3 抖音App启动崩溃或被检测
有一段时间我在测试中频繁遇到抖音App启动后黑屏或者闪退,排查后发现问题出在模拟器的“设备指纹”上。抖音会检测运行环境的模拟器特征,比如CPU型号、传感器列表、Build字段中的generic字样等,一旦判定是模拟器,就会限制部分功能甚至直接退出。
解决方案分两步。第一步,在夜神模拟器设置里把机型改成某款常见手机,比如小米11、Pixel 4等,不同的模拟器版本设置路径不一样,通常在“设置 -> 其他设置 -> 手机型号”里可以自定义。第二步,尽量不开启模拟器的“模拟定位”功能,GPS信息异常也会触发风险控制。
如果改完机型还是被检测,那就换一个思路:用线上接口测试环境验证,或者降低App版本。说实话,抖音的防护策略一直在变,想用最新版App做长期稳定的抓包调试,难度系数很高,不如固定一个旧版本环境作为测试基线。
5.4 Fiddler弱网模拟的另类用法
在调试抖音App的时候,我顺手把Fiddler的弱网模拟功能也用上了。这个功能在很多教程里被忽略,但对实测接口超时和异常重试逻辑非常有用。
在Fiddler菜单栏打开Rules -> Performance -> Simulate Modem Speeds,就开启了弱网模式,它会把网络延迟和带宽模拟到拨号上网的水平。这时候再观察抖音App的推荐流请求,你会看到明显的分页加载和超时重试行为,这对理解弱网下App的容错机制很有帮助。
更精细的做法是在Fiddler Script里自定义延迟时间。按F12或菜单打开FiddlerScript,在OnBeforeRequest函数里加上休眠时间,可以模拟特定API的慢响应:
if (oSession.fullUrl.Contains("/aweme/v1/feed/")) { System.Threading.Thread.Sleep(3000); }这段脚本的意思是:遇到推荐流接口时,人为延迟3秒响应,这样可以测试App在接口慢响应时的加载体验和超时逻辑。实测下来非常方便,不用真去调路由器限速。
5.5 常用问题速查表
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| Fiddler启动后电脑断网 | 系统代理未正确还原 | 打开设置手动关闭代理或重置Fiddler证书 |
| 模拟器能上网但Fiddler无记录 | 代理未配置或端口错误 | 检查代理地址和端口,Fiddler勾选远程连接 |
| 只有CONNECT隧道抓不到明文 | 证书不被信任或Pinning生效 | 检查系统证书目录,启用JustTrustMe |
| 抖音启动闪退 | 模拟器被检测 | 修改机型特征,换旧版抖音 |
| HTTPS页面证书报错 | 证书未正确安装到系统区 | 用openssl转格式并计算hash后push进cacerts |
| 证书装到用户区而非系统区 | 操作顺序问题 | 确认证书最终路径是在/system/etc/security/cacerts/ |
6. 最后再分享一点实际操作中的体会
这一整套流程跑下来,我最深的体会是:抓包调试这件事,七分靠环境,三分靠技术。很多人卡在“证书装了没用”这一步,往往不是技术问题,而是Android版本差异、模拟器root开关没打开、LSPlant模块没启用这类小细节。建议严格按照顺序操作,每完成一步就验证一步,别等全部配好再找问题,到时候排查成本会高很多。
还有一个小技巧,建议在系统里装一个jadx备用。当JustTrustMe这类通用Hook方案失效时,可以直接用jadx打开抖音APK,搜索CertificatePinner或者checkServerTrusted关键字,定位到具体的校验位置,再用Xposed模块对目标方法做精准Hook。这个方法虽然比通用方案复杂,但能应对绝大多数App的进阶防护。
最后再提醒一次:本文所有技术方案请严格用于你自己拥有权限的App、测试接口或安全学习场景。技术研究的边界在于是否被授权,越过了这条线,再简单的方法也会变成风险。希望这套教程能帮你省掉绕路的时间,把你的精力真正用在接口分析、数据理解和功能调试上。