简介Fiddler 工具包面向需要排查 HTTP/HTTPS 通信的开发、测试与运维人员核心用途是抓包分析、接口联调、性能定位和前端 Mock 验证也可作为学习网络代理与断点调试的实操素材。压缩包为 7z 格式共 90 个文件、约 3.11MB其中 36 个 dll 与 13 个 exe 构成主程序及插件依赖14 个 dat 提供响应模板13 个 pdb 保留调试符号另有 config、wav、ico 等配置与界面资源目录涵盖 Inspectors、Timeline、Scripts、ImportExport、SetupHelper 等模块。已有 2251 人学习下载。包内包含可运行的 Fiddler 主程序、证书与回环工具、语法编辑组件及示例规则脚本适合用来练习 HTTPS 解密、会话过滤、AutoResponder 映射和请求响应改写对想理解代理工具组成、插件加载与脚本扩展的读者也提供了较完整的文件结构和排错线索。1. 先搞清楚这包东西是什么抓包、改包、复现三步走搜 Fiddler 下载的人十有八九是被浏览器 Network 面板卡过一次请求头改不了、响应体想造假造不出来、手机上跑的那条链路压根看不见。Fiddler 解决的就是这三个动作——它在本机开一个监听端口把经过的 HTTP/HTTPS 请求截下来摊开给你看看完能改改完能重放重放完还能存成归档文件下次直接回放。顺带说一句搜索框里敲 Fiddle 也能摸到它这词跟小提琴没关系正式名字是 Fiddler两个 d。它适合谁前后端联调卡在字段上的、移动端要复现线上问题的、做接口回归想把现场留成证据的。前提只有一个——抓的是自己有权限调试的流量别人的包、线上的真实用户数据别往里塞。2. 装完先别急着开抓解密 HTTPS 的四道开关安装包双击到底、一路下一步这一步没有任何技术含量真正决定后面顺不顺的是首次启动后的十分钟。多数人栽的坑不在工具本身而在于默认配置下它只能看见 HTTPS 的隧道建立过程看不见里面任何一个字节——会话列表里全是Tunnel to xxx:443点开只有一行 CONNECT 记录这时候你会怀疑是不是没抓到其实抓到了只是没解开。2.1 首次启动先动这四个设置项打开Tools → Options注意力放在两个标签页上。HTTPS 标签里有三个勾Capture HTTPS CONNECTs、Decrypt HTTPS traffic、Ignore server certificate errors (unsafe)。第一个控制要不要接住隧道建立请求第二个才是真正的解密开关第三个只在调试自签证书的内网服务时才勾——勾了它等于放弃证书校验日常抓包别开开了以后某些客户端的行为会和线上不一致你会拿到假的结论。Connections 标签里是监听端口和监听范围默认端口 8888默认只监听127.0.0.1也就是只有本机能连。这一页改完必须重启 Fiddler 才生效很多人改完直接去连手机连不上还以为网络问题其实就是没重启。四个设置项列一下方便对着改位置选项建议值说明HTTPSCapture HTTPS CONNECTs勾选不勾则 CONNECT 请求直接放过HTTPSDecrypt HTTPS traffic勾选真正的解密开关HTTPSIgnore server certificate errors不勾勾了会掩盖证书问题ConnectionsFiddler listens on port8888换端口要同步改客户端ConnectionsAllow remote computers to connect需要手机抓包时勾选改完必须重启HTTPS 标签页上还有一个Actions按钮里面几项值得记住Export Root Certificate to Desktop把根证书导出来给手机用Open Windows Certificate Manager直接跳到系统证书管理器Reset All Certificates是后悔药——证书链被搞乱、时间过期、重复安装了一堆同名证书时先重置再重新装一遍比一条条删干净快得多。2.2 根证书为什么要进“受信任的根证书颁发机构”解密 HTTPS 的原理不复杂Fiddler 对每一个你访问的站点现场签一张证书签发者就是它自己装在本机的那张根证书。浏览器和客户端只认受信任根证书列表里的签发者所以根证书必须落到受信任的根证书颁发机构这个存储区落到“个人”或者“中间证书颁发机构”里都不算数表现就是满屏红色的证书告警或者干脆握手失败。第一次勾选Decrypt HTTPS traffic时会弹窗问是否信任点“是”就算装好了。但如果你在弹窗里点了“否”或者中途重装过系统、换过用户目录证书状态就会很暧昧——看起来勾着实际不生效。用一条命令确认最直接# 列出本机受信任根证书存储中 Fiddler 签发的根证书 Get-ChildItem Cert:\LocalMachine\Root | Where-Object { $_.Subject -like *DO_NOT_TRUST_FiddlerRoot* } | Select-Object Subject, Thumbprint, NotAfter, HasPrivateKey逻辑说明Cert:\LocalMachine\Root指的是“本地计算机”账户下的受信任根证书存储和当前用户存储Cert:\CurrentUser\Root是两个地方装错位置是高频问题。Subject里包含DO_NOT_TRUST_FiddlerRoot是 Fiddler 根证书的特征串用通配匹配能一次捞全。输出里Thumbprint是唯一指纹有多条记录就说明装重复了留最新的一条、其余删掉NotAfter是有效期过期了握手同样会失败HasPrivateKey为 False 说明这张证书没有私钥签不出站点证书等于白装。提示装完证书后正在运行的浏览器要全部关掉再开Chrome、Edge 这类多进程浏览器对根证书列表的缓存不是实时的不重启会一直报证书错误。2.3 监听地址决定了“谁能连进来”端口 8888 只是门牌号真正决定谁能敲门的是监听地址。只监听127.0.0.1时手机、同事的机器、容器里的服务都连不进来勾上Allow remote computers to connect之后Fiddler 会改为监听0.0.0.0所有网卡上的请求都能进。改完重启然后用系统命令确认一下当前真实状态# 查看 8888 端口的监听情况重点看本地地址那一列 netstat -ano | findstr :8888 # 想看是哪个进程占着这个端口拿最后一列的 PID 去查 tasklist | findstr 上一步输出的PID逻辑说明netstat -ano里-a显示全部连接、-n用数字显示地址和端口不做域名解析快、-o带出进程号。输出的“本地地址”如果是127.0.0.1:8888说明只有本机能连是0.0.0.0:8888或[::]:8888才是全网卡监听。这一条命令同时能解决另一类问题端口被别的进程占了常见是别的调试工具、本地服务、旧版残留进程Fiddler 启动时会提示绑定失败或者启动了但流量根本没进来。改端口比杀进程省事Tools → Options → Connections里换一个 8889、9090 都行改完记得同步改所有客户端的配置。2.4 怎么判断这条流量是真的解密了会话列表的图标和颜色是最快的信号但别只看图标点进去看内容才算数。判断标准可以归成下面这张对照表现象含义下一步会话只有一条CONNECT正文是Tunnel to host:443隧道建了但没解密检查 Decrypt HTTPS 是否勾选、证书是否可信Inspectors 里能看到明文请求头和 JSON 响应体解密成功正常分析响应体显示Response body is encoded. Click to decode.内容被压缩gzip/br点那一行解码或检查 Accept-Encoding点开是乱码、HexView 里一堆不可打印字符二进制协议或 protobuf换 HexView 看结构别硬当文本读出现红色证书告警条根证书未受信或已过期重置证书重装还有一种容易被误判的情况某些客户端在检测到证书异常时会直接降级或重试会话列表里能看到请求发出去了但响应是空的。这种不要急着怀疑 Fiddler先把客户端日志打开对照时间点多数时候是客户端自己拒绝了那张现场签发的证书。3. 移动端抓包从端口到证书一条链路走通桌面端抓包属于开箱即用移动端才是真正拉开差距的地方。整条链路是四段手机和电脑在同一个网段、手机把请求指向电脑的监听端口、手机信任 Fiddler 的根证书、应用愿意信任用户证书。四段里任何一段断了表现都一样——手机上什么都抓不到或者所有请求失败。3.1 先把网络前提摆平同网段与内网地址手机和电脑必须在同一个局域网里公司网络常见的隔离策略会把无线客户端互相隔离这时候同一个 WiFi 下也 ping 不通。判断方法很朴素电脑上看一眼内网地址手机浏览器直接访问电脑上跑的任何 HTTP 服务能打开就是通的。# Windows 下看内网地址找“无线局域网适配器”那一段的 IPv4 地址 ipconfig # 更省事的写法只筛 IPv4 地址行 ipconfig | findstr /i IPv4逻辑说明ipconfig会输出所有网卡有线、无线、虚拟网卡虚拟机、容器、调试工具装的虚拟网卡都在里面一定要看当前联网那张网卡的地址选错虚拟网卡是高频翻车点——地址填上去手机连过来请求进了虚拟网卡就再也没出来。192.168.x.x、10.x.x.x、172.16~31.x.x是内网段169.254.x.x说明没拿到地址得先解决网络本身。3.2 手机侧把请求导到监听端口手机连上同一个 WiFi进 WiFi 详情把网络设置从自动改成手动填两项主机名填电脑的内网地址端口填 8888。保存后手机上的 HTTP 请求就会先到电脑。这一层做对之后先别急着抓 App用手机浏览器打开一个 http 开头的普通页面Fiddler 会话列表里应该立刻出现一条记录——出现了说明链路通没出现说明问题在前三段的某一段别继续往下折腾。几个细节值得记住一是部分安卓机型在手动配置里同时有“绕过”输入框留空就行填了内容会把指定域名排除在外二是改完设置后 WiFi 会重连一次重连期间请求会失败属于正常三是抓完一定要改回自动不然关掉 Fiddler 之后手机就上不了网第二天上班发现手机不能用血泪经验。3.3 证书iOS 两步走Android 分版本HTTPS 要解密手机上必须装根证书。证书从电脑上导出Tools → Options → HTTPS → Actions → Export Root Certificate to Desktop得到一个.cer文件。把这个文件传到手机上方式随意聊天工具发给自己、本地起个 HTTP 服务下载都行别用邮箱附件部分邮箱会拦截证书文件。iOS 上是两步缺一步都不生效。第一步把描述文件装上设置 → 通用 → 描述文件入口 → 选中刚下载的文件 → 安装。第二步才是关键设置 → 通用 → 关于本机 → 证书信任设置 → 找到 Fiddler 那张证书 → 打开完全信任开关。很多人只做了第一步然后看着满屏握手失败怀疑人生——第一步只是“装上了”第二步才是“信任它作为根”。Android 要分版本看。7.0 以前用户手动安装的 CA 证书默认全局生效7.0 之后targetSdkVersion 24应用默认只信任系统证书区用户证书区装的证书对 App 不可见浏览器可能还能用App 一律握手失败。三条路可选一是用模拟器模拟器通常可以直接往系统证书区写二是自己开发的 App 在清单里声明网络安全配置让 debug 包信任用户证书三是在调试构建里做证书校验豁免。第二条最合规也最常用!-- res/xml/network_security_config.xml -- network-security-config !-- 只在 debug 构建里放开用户证书release 构建不受影响 -- debug-overrides trust-anchors certificates srcuser / certificates srcsystem / /trust-anchors /debug-overrides /network-security-config逻辑说明debug-overrides只在android:debuggabletrue的构建里生效打包上线的 release 包不会因为这段配置放宽证书信任这是它和把user直接写进base-config的本质区别——后者等于给正式包开了口子属于典型的“调试代码上线”事故。trust-anchors里的user指向用户证书区system是系统区两个都写上是为了让调试包在两种情况下都能通。清单里还要加一行android:networkSecurityConfigxml/network_security_config到application节点漏了这行配置不生效。3.4 抓不到时的排查顺序从最便宜的一步开始排查讲究顺序别一上来就重装。我习惯按这个顺序走每一步都能给出明确结论第一步看电脑上netstat的监听地址是不是0.0.0.0不是就去勾Allow remote computers并重启。第二步看手机浏览器能不能打开电脑上的 HTTP 页面打不开就是网络隔离或地址填错。第三步打开一个 http 页面看会话列表有没有记录有记录说明转发通了问题在 HTTPS 解密环节。第四步检查手机上证书到底是“装上了”还是“信任了”iOS 尤其容易漏第二步。第五步如果只有某个 App 抓不到而浏览器正常基本可以判定是这个 App 做了证书校验或用了自己的网络栈这时候换思路比换工具有效。注意调试结束把手机 WiFi 的手动设置改回自动把装上的证书在系统设置里移除。留着不管下次网络出问题时你会先怀疑运营商浪费半天。4. 把抓到的包用起来过滤、断点、AutoResponder 与重放抓得到只是入场券真正省时间的是把抓包变成可控实验只看关心的接口、在请求发出前改一个字段、不依赖后端就能把前端流程跑通、把一个请求反复重放对比差异。这四件事分别对应 Filters、断点、AutoResponder、Composer用熟了联调效率是另一个量级。4.1 Filters先把噪声挡在门外一个页面打开就是几十上百条请求图片、字体、埋点、心跳真正要看的可能就三条。右侧Filters标签里Hosts下拉选Show only the following Hosts输入框里填域名多个用分号隔开改完必须点Actions → Run Filterset now才生效这一步漏掉是经典问题——配置填得好好的会话列表没变化以为功能坏了。过滤条件可以写得更细Request Headers → Show only if URL contains支持正则用来锁定某个路径前缀Response Status Code可以只留 4xx/5xx专门看失败请求。过滤是“显示层”的过滤不影响抓取本身被过滤掉的会话仍然在随时能放开条件找回来。真正省事的是黑匣子命令行就在会话列表下方那个黑色输入框里# 只显示 URL 里包含 /api/order 的会话其余隐藏 select /api/order # 只高亮 5xx 的响应其他照常显示 5xx # 清空当前列表不影响已保存的归档 cls逻辑说明select是显示过滤比 Filters 面板快得多适合临时聚焦加状态码是筛选响应状态cls只是清屏别和“清空所有会话”混为一谈前者随时能恢复后者才是真删。这些命令敲完立即生效不用点任何按钮熟练之后基本不再打开 Filters 面板。4.2 断点只在你关心的那一行停断点是 Fiddler 最有“作弊感”的功能。请求发出前拦下来改完再放行——测后端对异常字段的处理、测前端对空数据的兜底都不用等后端配合。命令行方式最直接# 请求发出去之前断住改请求头、改 body、改 URL 都行 bpu /api/order/create # 响应回来之后断住改返回值看前端怎么渲染 bpafter /api/order/detail # 按 HTTP 方法断POST 全断 bpm POST # 取消所有断点别忘了这一步 bpu逻辑说明bpu是 before request命中的请求会停在会话列表里图标带红色断点标记点开Inspectors改完内容后点绿色的Run to Completion放行bpafter是响应回来后断住适合改返回值bpm按方法匹配适合“这个接口的请求我都要改”的场景。最后一行bpu不带参数就是取消全部请求断点bpafter同理。血泪教训是断点忘了取消第二天打开工具发现所有请求都卡着不动怀疑网络、怀疑服务、怀疑人生其实就一个命令的事。断点还有一层用法是只看不改把请求断住看清楚完整的请求头——尤其是Cookie、Authorization、自定义的签名头——然后直接放行。签名算法对不上、鉴权头拼错这类问题光看浏览器面板是看不全的。4.3 AutoResponder不写后端也能把前端跑通前端要做一个“订单列表为空”的状态后端说造这个数据得改数据库要测一个 500 错误的兜底 UI后端说这个接口不好造。这时候 AutoResponder 就是救命稻草把匹配到的请求直接拦下返回你指定的本地文件或者指定状态码请求根本不会发到真实服务。操作路径是右侧AutoResponder标签勾上Enable rules和Unmatched requests passthrough后一个必须勾否则没匹配上的请求全部失败整个页面都打不开。然后把会话列表里的请求直接拖进规则区它会自动生成一条匹配规则底下选动作返回本地文件、返回指定状态码、或者返回一段固定内容。规则写法有几种前缀用对了能省很多事规则写法含义典型场景EXACT:http://api.demo.local/v1/config完整 URL 精确匹配固定接口做 mockREGEX:.*\/v1\/order\/\d正则匹配一批同构接口统一处理http://api.demo.local/v1/user不带前缀按前缀匹配快速拖拽生成的默认规则勾选Enable rules之后命中的请求在会话列表里会有特殊标记一眼能分辨哪些是真实响应、哪些是本地造的。用完之后记得取消勾选否则你会对着一个早就改过的接口调试半天发现返回的还是昨天那份本地文件。4.4 Composer 重放一次改动一次对照Composer标签是个请求编辑器把会话列表里的任意一条拖进去URL、方法、请求头、请求体全部带过来改完点Execute就发出去。它解决的是“同一个请求参数差一点点结果差很多”的场景改一个pageSize看分页边界、改一个时间戳看幂等逻辑、改一个Accept-Encoding看压缩行为。实用的做法是成对重放拖一条进去执行再拖一条改一个参数执行然后在会话列表里选中这两条右键Compare Sessions差异会高亮出来。响应体的差异、响应时间的差异、响应头里Cache-Control的差异一次看清。比手动在两个窗口之间来回对照靠谱得多尤其是响应体几 KB 的 JSON。重放还有一个容易忽略的点Composer默认会带上原来的Cookie和鉴权头会话过期之后重放会拿到 401这时候不要以为是接口挂了先看请求头里的令牌是不是过期了。5. 避坑五类抓不到包的现场与处置顺序抓包这件事成功的样子都一样失败的姿势各有各的不同。下面这五条是我这些年反复遇到的按“现象 → 原因 → 解决”写清楚遇到了直接对号入座。5.1 五条高频现场其一手机装完证书App 里所有请求还是失败。现象是浏览器能抓到明文同一个手机上的 App 全部握手失败日志里写着证书链不可信。原因是 Android 7.0 之后用户证书区对应用不可见或者这个 App 自己做了证书校验。解决分两步先确认版本和targetSdkVersion能用模拟器就用模拟器系统证书区可直接写入必须在真机上调的走network_security_config的debug-overrides用 debug 包联调。如果 debug 包也不行说明应用内置了证书校验这时候换思路——让后端在测试环境提供一份不校验的构建比跟工具较劲划算。其二桌面客户端抓不到浏览器一切正常。现象是浏览器里会话哗哗地出公司那个桌面客户端一条都没有。原因是客户端没有走系统级的转发设置用的是自己的网络栈或者是它走的是长连接、私有协议。解决先确认客户端有没有独立的网络设置项有就手动填127.0.0.1:8888没有的话查一下它是不是用了系统级 HTTP 服务的配置这类配置和浏览器读的不是同一个地方需要在系统层面单独设置。搞不定就换抓包位置在客户端和服务之间加一层别死磕本机。其三会话列表里全是 502一个成功的都没有。现象是所有请求返回 502或者连接被重置。原因通常是上游证书有问题自签、过期、域名不匹配Fiddler 校验失败后拒绝转发也可能是 TLS 版本不匹配服务端只接受某个较新的版本。解决先在Tools → Options → HTTPS里临时勾上Ignore server certificate errors验证是不是证书问题确认之后去修服务端证书别长期开着这个开关TLS 版本问题在HTTPS标签页的协议列表里调整把服务端支持的版本勾上。其四响应体全是乱码或者一行提示。现象是 Inspectors 里正文显示Response body is encoded. Click to decode.或者直接一堆不可打印字符。原因是响应做了 gzip 或 br 压缩或者接口本身返回的是 protobuf、MessagePack 这类二进制格式。解决压缩的点那一行提示解码即可二进制的换HexView看结构别当文本读同时把请求头里的Accept-Encoding改小一点再重放一次很多时候能看到未压缩的原始内容。其五HTTP/2 站点抓不到或者抓得残缺。现象是某个站点请求发出去没响应或者只有部分请求可见。原因是 HTTP/2 的多路复用和 Fiddler 的解密流程存在兼容问题尤其是在 HTTPS 解密开启的情况下。解决在Tools → Options → HTTPS里把 HTTP/2 相关的选项关掉强制降级到 HTTP/1.1 再看确认能抓之后再决定要不要为了性能分析重新打开。5.2 处置顺序从最便宜的一步开始试遇到抓不到最忌讳的是直接从“重装工具”开始。我习惯按成本从低到高排先看监听地址和端口一条netstat十秒再看客户端有没有真的把请求发出来换个最简单的 HTTP 页面验证链路再看证书是“装了”还是“信了”再看过滤条件是不是把会话藏起来了Filters面板最容易忘最后才怀疑应用做了证书校验。顺序对了八成问题在前三步就结束。顺序错了你可能花两小时重装了三遍工具最后发现是Filters里昨天填的一个域名还挂着。提示每改一处配置就验证一次别一口气改五个选项再去看结果。出问题时你不知道是哪一项起的作用只能全部回滚重来。6. FiddlerScript 与 .saz把一次性抓包变成可回放的用例抓包的价值不在于“看见”在于“留下来还能复现”。做接口回归时我会把整段会话存成.saz归档File → Save → All Sessions下次直接File → Load Archive打开请求、响应、时间戳全在配上重放功能就是一份能跑的证据链。归档文件不大一个中等复杂度的流程几十 MB放进缺陷单里比截图有说服力得多。更进一步是 FiddlerScript在Rules → Customize Rules里打开CustomRules.js可以给会话自动打标记、自动记录耗时、自动把特定接口的响应落盘// CustomRules.js 片段给测试环境接口打标记并把慢请求单独记下来 class Handlers { static function OnBeforeRequest(oSession: Session) { // 只处理测试环境的域名其他流量不做任何改动 if (oSession.HostnameIs(api.demo.local)) { oSession[ui-color] purple; // 会话列表里染成紫色一眼认出 oSession[ui-bold] true; // 加粗避免被瀑布流淹没 } } static function OnBeforeResponse(oSession: Session) { if (oSession.HostnameIs(api.demo.local)) { var cost oSession.Timers.ClientDoneResponse - oSession.Timers.ClientBeginRequest; if (cost 800) { // 超过 800ms 的响应单独标红 oSession[ui-color] red; oSession[ui-custom-column] slow: cost ms; } } } }逻辑说明OnBeforeRequest在请求发出前触发OnBeforeResponse在响应回来后触发这两个是最常用的钩子。HostnameIs做精确域名匹配避免误伤其他流量ui-color是会话列表的行颜色ui-bold控制加粗Timers里存的是各阶段时间戳单位毫秒相减得到客户端视角的总耗时。改完保存Fiddler 会提示是否重新加载脚本点“是”立即生效不用重启。参数别写死域名和阈值都做成变量放在文件顶部换项目时改一处就够。我踩过的坑是这个脚本改完之后忘了保存编辑器里改得好好的切回会话列表发现颜色没变来回折腾了十几分钟。从那以后我每次动CustomRules.js改完先看一眼标签页上有没有未保存的圆点再切回去验证一条会话是否真的变色——这个小动作救过我不少次。希望帮到你。本文还有配套的精品资源点击获取