ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Fiddler+雷电模拟器安卓APP抓包全攻略:从HTTPS解密到实战调试

Fiddler+雷电模拟器安卓APP抓包全攻略:从HTTPS解密到实战调试 搞安卓APP抓包最省事的组合就是Fiddler加雷电模拟器。Fiddler是老牌HTTP调试代理Windows上装完就能用雷电模拟器在PC上跑安卓应用非常顺手自带root开关。两个凑一起不需要真机、不需要额外硬件就能把APP进出的每一个HTTP/HTTPS请求看得清清楚楚。这篇文章就围绕这套组合把从安装配置到证书处理、再到实战抓包和常见坑位的完整路径写出来适合刚接触抓包的移动端开发、测试同学也适合对“APP背后到底发了什么请求”感到好奇的人。1. 为什么是“Fiddler 雷电模拟器”这个组合1.1 Fiddler到底是什么在抓包里扮演什么角色Fiddler本质就是一个代理服务器默认监听8888端口。APP发出的HTTP请求不会直接到达服务器而是先经过Fiddler由Fiddler转发出去返回的数据再原路回到Fiddler再由它交给APP。你只要站在这条链路的中间就能看到全部明文内容。HTTP是明文协议直接就能看HTTPS因为有TLS加密需要Fiddler生成一个根证书安装在系统信任区里这样Fiddler就能解密并重新加密流量做到“中间人解密”。很多刚接触的人会担心中间人解密是不是很高级其实原理不复杂。Fiddler本身内置了证书生成模块你只需要在设置里开启HTTPS解密它就会给访问的站点动态签发一张证书。APP如果信任了Fiddler根证书就会认为这个动态证书是合法的于是握手成功后续内容都能被解开。整个链路里Fiddler做的是“代理证书伪造流量记录”的三合一工作。1.2 为什么选雷电模拟器而不直接拿真机来抓用真机抓包有一个绕不开的麻烦证书安装。安卓7.0往后系统默认不再信任用户安装的证书很多APP还要做证书固定真机上抓包难度一下就上去了。雷电模拟器好就好在可以开rootroot之后能把Fiddler根证书放进系统证书目录让系统层面完全信任它。这种操作在真机上要解锁bootloader、刷recovery非常折腾在模拟器里几行命令就搞定。另外雷电模拟器跑在x86架构上跟PC同处一个局域网Fiddler可以直接通过网络代理访问它不会出现USB连接不稳定、驱动不兼容这些问题。而且模拟器支持多开一个开业务APP一个开测试环境互不干扰。对于日常调试这套组合的效率和成功率都高于真机方案。1.3 这套方案适合什么场景、能解决什么问题最常见的场景是接口调试。APP页面上的数据到底是调了哪个接口、传了哪些参数、返回了什么结构过去只能靠后端日志现在直接在Fiddler里看一目了然。第二个场景是分析APP的流量行为比如启动时偷偷上报了哪些数据、图片是按原图加载还是压缩后的、是否存在频繁的心跳请求。第三个场景是弱网和异常测试Fiddler自带模拟调制解调器的功能可以人为制造高延迟、低带宽的网络环境看APP在这种状态下是优雅降级还是直接崩溃。最后对做协议分析和爬虫开发的人来说通过抓包逆向出APP的接口加密参数是后续一切工作的基础。2. 环境准备从零把两个工具装好2.1 Fiddler版本选择和安装细节Fiddler有两个常见版本——Fiddler Classic和Fiddler Everywhere。Classic是经典免费版功能完全够用界面虽然老一些但是信息密度高适合专注抓包的场景Everywhere是后来出的跨平台付费版界面好看但一些高级功能要订阅。我个人建议你直接装Fiddler Classic安装包小、启动快、折腾成本低。安装时注意从官网下载很多第三方下载站会捆绑广告软件。官网地址我就不贴了搜索引擎输入“Fiddler Classic download”就能找到。安装过程一路Next就可以不需要额外配置环境变量。装完之后打开默认会有一个捕获流量的开关在左下角确认它是开启状态然后在浏览器访问127.0.0.1:8888如果能看到一个Fiddler Echo Service的页面说明代理服务已经正常工作。2.2 雷电模拟器安装和基础设置雷电模拟器去官网下载安装包安装过程比较快。装完第一次启动它会让你选安卓版本我建议选Android 7或Android 9的镜像。Android 5的镜像太旧很多新版APP装不上Android 9的镜像兼容性好而且系统证书目录的挂载方式跟真机更接近后面处理证书会顺利一些。启动模拟器之后先别急着装APP把两个基础设置改掉。第一个是“设置 - 其他设置 - Root权限”选择“开启Root”。这个开关后面处理系统证书的时候必须要用。第二是“设置 - 网络设置”确认网络模式是NAT这样模拟器才能跟宿主机在同一个虚拟局域网里通信。改完这两项重启模拟器让配置生效。2.3 先确认模拟器网络和宿主机的连通性这一步很多人跳过然后后面抓不到包就懵了。检查方法很简单在模拟器里打开浏览器访问一个不会跳转的网站比如https://www.baidu.com能打开说明网络没问题。再把模拟器的浏览器地址栏输入http://你的宿主机IP:8888如果看到Fiddler Echo Service页面说明模拟器能直接访问宿主机的Fiddler服务。宿主机IP怎么查在Windows命令行执行ipconfig找到“以太网适配器”或者“无线局域网适配器”里的“IPv4地址”通常是一串192.168.x.x或者172.x.x.x。记下这个地址后面配置代理和安装证书都会用到。如果模拟器访问不通多半是Windows防火墙拦截了8888端口解决办法稍后细说。3. Fiddler核心配置打开HTTPS解密和远程访问3.1 开启HTTPS解密并设置证书选项Fiddler装好之后默认只抓HTTP明文流量抓到HTTPS会显示一条CONNECT隧道看不到里面的内容。要解密HTTPS需要打开Tools - Options - HTTPS勾选“Capture HTTPS CONNECTs”和“Decrypt HTTPS traffic”。第一次勾选时Fiddler会弹出提示问你是否信任它生成的根证书这里要选择是这样Windows系统会导入Fiddler的根证书。同一个设置页面里有一个“Ignore server certificate errors”选项建议也勾上。有些APP的服务器证书链不完整或者用的是私有证书不忽略错误的话握手会直接失败抓出来的就是一堆TCP连接重置。这个选项不会影响正常站点的解析只是把证书校验放松了一些换取抓包成功率。3.2 配置远程连接并放行Windows防火墙默认情况下Fiddler只允许本机连接它的代理端口雷电模拟器里跑的APP等于是另一台“电脑”必须显式允许远程连接。打开Tools - Options - Connections勾选“Allow remote computers to connect”确认端口是8888然后重启Fiddler。重启之后Windows防火墙通常会弹窗询问是否允许Fiddler监听端口这里一定要勾选“专用网络”并点击允许。如果不小心点了取消后面模拟器就永远连不上。补救方法是手动添加一条入站规则允许TCP 8888端口操作路径是“控制面板 - Windows Defender防火墙 - 高级设置 - 入站规则 - 新建规则”选端口、TCP、8888、允许连接即可。3.3 用QuickExec命令行快速验证Fiddler状态Fiddler下方有一个黑色的命令行输入框叫QuickExec。它支持很多快捷命令比如输入help能看到命令列表输入cls清空当前会话列表。在排查“代理是否生效”这个问题时可以先清空会话再从模拟器里随便打开一个网页如果QuickExec里出现了新会话记录说明流量确实经过了Fiddler。这一步看似简单但能帮你快速区分“链路问题”和“配置问题”省掉后面大量的排查时间。4. 雷电模拟器代理配置让APP流量主动走进Fiddler4.1 通过模拟器WLAN设置配置手动代理模拟器网络设置的入口是“设置 - WLAN”长按你当前连接的WiFi通常是默认的AndroidWifi选择“修改网络”把“代理”改为“手动”主机名填写你刚才查到的宿主机IP端口填写8888保存。此时模拟器里所有WiFi流量都会走到Fiddler。需要注意一点这个方式配置的是WiFi代理并不是全局代理。有些APP为了安全或者反调试会忽略系统代理设置直接用Socket直连。这种情况下这个代理方式就失效了后面我们会讲怎么用iptables强制转发。4.2 使用adb命令设置全局代理雷电模拟器自带adb调试模式设置路径在“设置 - 其他设置 - ADB调试”勾选“开启ADB调试”。然后你在PC上找到雷电模拟器的adb工具通常在安装目录下的adb.exe打开命令行执行adb shell settings put global http_proxy 192.168.1.100:8888把IP换成你的宿主机IP。这条命令通过修改系统全局设置来指定代理不依赖WiFi菜单生效范围更大。取消代理的命令是adb shell settings put global http_proxy :0另外需要提醒一点如果你在WLAN菜单里也配了代理又在adb里配了全局代理两者可能会有冲突到时候很难判断流量走的是哪一条。我的建议是只用一种方式推荐用adb命令因为它自动化程度更高。4.3 遇到代理不生效时停用所有代理设置再排查代理不生效最让人头疼。如果你已经在WLAN里设了代理也adb设了全局代理但Fiddler里就是没有新会话最快的方法是先把两种代理都清掉然后只保留WLAN手动代理重启模拟器的浏览器再试。如果还是不生效就检查Fiddler的“Allow remote computers to connect”是否还开着Windows防火墙是否放行。我曾经遇到过一个很隐蔽的问题宿主机装了虚拟网卡模拟器走了物理网卡两个网段不通改一下虚拟网卡的网络桥接就恢复了。5. 证书安装安卓7以上系统证书才是关键5.1 先安装用户证书验证代理链路是否通畅证书安装分两步。第一步装用户证书用于快速验证链路。模拟器浏览器打开http://宿主机IP:8888页面顶部会有一个“Fiddler Root certificate”的下载链接点击下载系统会弹出证书安装向导。安装时证书名称随便填用途选“WLAN”即可。装完用户证书之后在模拟器里打开浏览器访问一个HTTPS网站正常情况下Fiddler里就能看到解密后的HTTPS请求URL和表单数据都是明文。如果这一步成功说明代理和解密链路已经通了。但要注意很多APP并不信任用户证书你接下来必须安装系统证书否则抓APP时会碰上大把的“证书错误”。5.2 把Fiddler证书转换为安卓系统证书格式并push进去安卓系统的受信任证书存放在/system/etc/security/cacerts/目录文件名是“证书主题哈希值.0”。Fiddler导出的证书是PEM格式不能直接复制进去必须先计算哈希值并重命名。用OpenSSL处理。Windows上的OpenSSL可以通过Git for Windows自带或者单独装一个。先在Fiddler里导出根证书Tools - Options - HTTPS - Actions - Export Root Certificate to Desktop会生成一个FiddlerRoot.cer文件改后缀为.pem。然后执行openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem | head -1输出一个类似a1b2c3d4的字符串这就是证书文件应该用的哈希名。接着把证书重命名为e5f6a7b8.0用你算出来的哈希值然后通过adb把文件push到模拟器系统目录adb root adb remount adb push e5f6a7b8.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/e5f6a7b8.0 adb reboot重启之后证书就生效了。adb root这个命令需要模拟器已经开启root权限如果提示无法root说明模拟器设置没改对回到模拟器的“Root权限”那里确认开启。这里还有个细节不同版本的雷电模拟器挂载方式略有差异如果adb remount失败可以改用adb shell mount -o rw,remount /system来手动挂载。5.3 证书装完但抓不到HTTPS时优先检查模拟器时间这个坑我踩过而且花了大半天才定位到。安卓系统校验证书时会同时检查证书的“有效期范围”和“当前系统时间”。如果模拟器时间跟真实时间差太多哪怕系统证书装得完美握手依然会失败Fiddler里看到的就是连续不断的SSL handshake failed。解决办法是把模拟器的自动时间设置打开在“设置 - 日期和时间 - 自动确定日期和时间”里打开开关或者干脆手动改成宿主机当前的时间。每次重启模拟器之后最好都确认一下时间是否正确。另一个跟证书相关的坑是如果你之前装过旧版Fiddler系统证书目录里可能残留了旧证书这会导致一些APP验证时出现冲突。清理方法是把/system/etc/security/cacerts/下跟Fiddler相关的.0文件全部删掉再重新push一次新证书。5.4 为什么有的APP即使证书装好依然抓不到证书装好了代理也配好了某些APP依然抓不到原因是APP自己做了“证书固定”。这类APP在代码里写死了服务端证书的指纹或者只信任自己内置的CA不信任系统的CA列表。这种情况下Fiddler动态签发的证书在APP眼里是不合法的连接会被直接掐断。针对证书固定常用的绕过思路是使用Frida对APP进行hook把校验证书的方法替换掉。但这套方案涉及模拟器上跑Frida-server需要一定的逆向能力属于进阶内容。这里先提示一点如果你遇到一个APP死活抓不到包先别怀疑Fiddler配置大概率是证书固定的问题。6. 实战抓包从启动APP到看到第一个请求6.1 配置Fiddler过滤条件只留目标域名如果Fiddler里什么流量都抓会话列表会被系统通知、广告SDK、推送服务的请求刷屏根本找不到自己想要的东西。打开Fiddler右侧的Filters页签勾选“Use Filters”在“Host”下拉框里选择“Show only the following Hosts”在输入框里填你要抓的APP域名比如api.example.com再点击“Actions - Run Filterset now”过滤立即生效。配置过滤还有一个好处是减少干扰让Fiddler的内存占用和页面卡顿明显下降。APP启动时往往伴随几十个并发请求不过滤的情况下Fiddler的UI会频繁刷新调试体验很糟糕。建议抓包之前先观察一下APP的域名可以通过一次不带过滤的抓包或者看APP的开发者文档提前知道。6.2 启动APP并观察Fiddler会话列表的关键字段配置好之后在模拟器里启动目标APP正常操作几步切回Fiddler你会看到会话列表里持续有新的记录出现。每一行代表一次完整的HTTP事务关键字段有Result状态码、ProtocolHTTP版本、Host域名、URL路径、Content-Type内容类型、Body请求或响应大小。大多数情况下你先看Host和URL就能判断出这个请求是干嘛的。比如看到一个/login路径的POST请求那肯定是登录接口看到/api/v1/home的GET请求那就是首页数据。点中某一行右侧面板会显示请求头和请求体、响应头和响应体内容一目了然。如果右侧面板是空的检查一下是不是没勾选底部“Request”和“Response”的展示按钮。6.3 使用断点功能修改请求参数做接口测试Fiddler还有一个很实用的能力是断点修改请求。在QuickExec里输入bpu /login回车之后所有URL中包含/login的请求都会被拦截下来。此时Fiddler进入编辑模式你可以随意修改请求头、请求体里的参数再点击“Run to Completion”把修改后的请求放行给服务器。这个功能在调试签名、调试参数错误、逆向接口协议时非常有用。修改响应也有类似命令比如bpafter /login可以拦截并修改服务器返回的数据。改响应常用于模拟异常场景比如把返回的error_code改成0观察APP是否做了容错处理。用完之后在QuickExec里输入bpu或bpafter回车清掉断点否则后续请求会一直被拦截。6.4 从Fiddler复制cURL快速复现一个接口请求Fiddler的会话列表里右键任意一条请求选择“Copy - Just URL”可以复制URL选择“Copy - All as cURL”可以复制完整的cURL命令。这个功能在把抓到的请求转成脚本测试场景时特别好用。拿到cURL之后你可以直接在命令行里执行或者粘到编程工具里二次加工方便地用不同参数重新请求接口。这种方法比手动在界面上看参数直观得多尤其是请求体比较长、参数比较多的情况。复制出来的cURL会带上完整的请求头和Cookie基本可以做到一次复现。有一点要注意如果请求里有时间戳或签名参数复制下来的cURL只能在短时间内有效过了有效期会返回签名错误。7. 高频问题排查从失败到成功的完整路径7.1 模拟器里打开网页提示无法连接或代理错误优先检查宿主机和模拟器之间的网络连通性。在模拟器浏览器里访问http://宿主机IP:8888如果显示无法访问三件事依次排查Fiddler是否勾选了Allow remote computers to connectWindows防火墙是否放行了TCP 8888宿主机和模拟器是否在同一网段。如果访问到了Fiddler Echo页面但打开其它网站时候提示代理错误检查模拟器WiFi代理设置里的端口号是否填成了别的数字端口必须和Fiddler监听端口一致。还有一种情况是宿主机的IP是动态的路由器重启后IP变了导致模拟器里的代理IP失效这种情况改成静态IP最省事。7.2 Fiddler里全是TCP CONNECT隧道看不到真正的HTTP请求这个问题的原因几乎都是HTTPS解密没有开启或者证书没装好。Fiddler的会话列表里如果每一条HTTPS请求都显示成CONNECT隧道内部内容看不到打开Tools - Options - HTTPS确认“Decrypt HTTPS traffic”是勾选状态。如果已经开启但依然只有隧道就要怀疑证书是否被系统信任。在模拟器里访问任意HTTPS网站如果浏览器地址栏出现证书警告说明证书信任链没建立如果浏览器完全不报错但Fiddler还是只能看到隧道尝试重启Fiddler和模拟器很多时候是证书状态缓存没有刷新。7.3 HTTPS握手失败或证书错误频繁出现证书错误通常发生在模拟器时间不准、系统证书缺失、服务器证书不被信任这三种情况。模拟器时间不对是最容易忽略的先手动校准一次时间如果时间经常漂移就在模拟器设置里开启自动同步。系统证书缺失的话回到第5节重新确认证书文件名是否正确、有没有push进对目录。服务器证书不被信任这个情况在勾选了“Ignore server certificate errors”之后一般不会再出现。如果以上都排除了还是握手失败建议用Wireshark抓一下模拟器网卡上的数据包看看TLS握手到底失败在哪一步是ClientHello没发出去还是ServerHello之后中断。Wireshark的tls.handshake.type过滤条件能帮你快速定位是客户端问题还是服务端问题。7.4 某些APP禁用代理或检测代理后拒绝联网不少APP做了代理检测只要检测到系统代理存在就走直连或者直接弹窗提示“网络异常”。针对这种情况单纯设代理是没用的需要借助透明代理。思路是在模拟器里通过iptables把流量强制转发到Fiddler监听的端口同时把模拟器WiFi代理设置为“无”。一个可用的命令序列是先启动Fiddler并开启静态代理然后在模拟器终端里执行adb shell su iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner 0 -j RETURN iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 宿主机IP:8888 iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 宿主机IP:8888这样APP感知不到代理的存在但流量又被强制拉到了Fiddler。需要注意这个方案并不适合所有APP尤其是做了更高强度反调试的APP会检测TLS指纹是否来自真实服务器这里不展开先说有这样一个思路。7.5 常见问题速查表现象可能原因解决方向模拟器无法访问宿主机防火墙拦截、网段不同放行8888端口确认IP在同一网段代理配置后无法上网代理IP或端口写错核对宿主机IP和Fiddler端口Fiddler只显示CONNECT隧道未开启HTTPS解密勾选Decrypt HTTPS traffic证书安装失败模拟器未root、证书格式错误开启Root使用PEM格式转换哈希抓不到某APP的包代理检测、证书固定、非HTTP流量尝试iptables透明代理或Frida hook频繁SSL握手失败模拟器时间不准、系统证书缺失校准时间重装系统证书8. 进阶玩法弱网测试、脚本记录和Wireshark联动8.1 用Fiddler模拟弱网环境观察APP超时表现Fiddler的Rules菜单里有一个Performance项里面预置了“Simulate Modem Speeds”选项勾选后所有经过代理的请求都会被加上模拟网络的延迟和带宽限制但预置参数相对粗糙只有固定延迟和丢包率。想要更精细的弱网场景需要修改CustomRules.js这个文件可以通过Fiddler菜单“Rules - Customize Rules”打开。在CustomRules.js里找到OnBeforeRequest方法输入以下代码可以给所有请求增加延迟if (oSession.isHTTPS) { oSession[request-trickle-delay] 300; oSession[response-trickle-delay] 1500; }这段代码的意思是HTTPS请求每300毫秒发送一块数据响应每1500毫秒返回一块数据。通过调整数字大小可以模拟出极慢网络、高延迟网络等多种弱网环境。实际体验下来弱网测试能暴露很多代码问题比如超时时间设置过短、缓存策略错误、加载态动画卡死。这类问题在网速正常的开发环境里根本发现不了一旦用户处在弱网环境就会集中爆发。建议把模拟出来的网络参数记录到测试报告里方便复现和定位。8.2 用脚本批量保存抓包结果沉淀为接口文档Fiddler支持通过FiddlerScript修改请求和响应也支持把抓到的会话导出成其它格式。右键会话选择“Save - Selected Sessions - as Text”可以把请求和响应内容保存为纯文本日志。一次性保存大量会话时执行“File - Export Sessions”格式选“HTTPArchive v2.0”也就是常用的har文件。har文件几乎是所有抓包工具的通用格式可以导入到Charles里查看也可以用Python分析。比如用Python读取har文件里的URL、请求头、响应体自动生成接口说明文档或者统计每个接口的耗时分布。分享一个我常用的简化思路先把har文件里的URL去重再用正则提取路径和参数名跟后端API文档对照缺失的接口一眼就能发现。8.3 Fiddler看应用层Wireshark看底层协议Fiddler擅长看HTTP/HTTPS能看到URL、Header、Body这些业务层面的内容但对TCP层面的问题比如连接重置、握手重传、TCP窗口大小变化它就不够专精了。Wireshark正好擅长这个领域。当你发现Fiddler里某条请求耗时异常却看不出原因时可以开着Wireshark抓模拟器网卡的数据包用tcp.port 443过滤观察TCP三次握手是否正常、有没有重传、TLS握手有没有异常中断。实际工作中我经常是Fiddler和Wireshark同时开着Fiddler负责“能看懂的业务日志”Wireshark负责“深挖到TCP层的细节”。遇到HTTP状态码5xx去后端日志查遇到连接超时去Wireshark看是否有SYN重传遇到证书报错去Fiddler看握手阶段是哪个环节输出了Alert。这种层次化排查的思路比在单个工具里死磕要高效得多。8.4 搭配Python做自动化抓包后处理抓包数据量大了以后手动看会话列表不现实。Fiddler的FiddlerScript能对会话做自动化的逻辑处理比如遇到特定状态码自动截图、把符合规则的请求自动分类。更通用的做法是把har文件导出再用Python处理。比如用命令python3 -m pip install haralyzer装一个解析har的库读取所有请求和响应统计各接口的请求量、响应时间、状态码分布。之前做一个项目线上有个接口偶发超时后端日志和监控平台查了一整天没结论。我用上面这套流程把模拟器上跑的全部流量导成har写了几行Python脚本统计出超时请求集中在某个CDN节点而且都是在连接复用失效后发生。要不是做了自动化统计这种问题靠肉眼根本发现不了。现在抓完包我都会顺手跑一遍统计分析相当于做了一次交通流量普查比漫无目的地翻日志可靠得多。个人经验与最后的几个提醒这套Fiddler加雷电模拟器的玩法我在日常调试里用了很久写了大量配置脚本和排查笔记总结下来最值得注意的几点第一模拟器的系统时间一定要校准这是HTTPS证书校验失败里最常见的原因第二Fiddler的“Allow remote computers to connect”默认是关闭的装完Fiddler第一件事就是把它打开第三安卓7以上系统证书和用户证书是两套体系装完用户证书只是第一步不装系统证书很多APP照样抓不到。最后分享一个小技巧如果你经常做抓包调试可以把平时用到的adb命令、Fiddler脚本、防火墙配置整理到一个批处理脚本里每次换电脑、重装系统后一键执行能省下非常多时间。抓包只是手段真正有价值的是透过流量看懂一个APP的设计思路和数据交互方式。等你看懂了一套APP的通信结构再去分析别的APP会感觉顺手很多。
返回列表