ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

免费抓包工具选型与实战:从Wireshark到mitmproxy的全面指南

免费抓包工具选型与实战:从Wireshark到mitmproxy的全面指南 干了十几年网络调试和接口联调说实话抓包工具这件事平时不起眼但真到排查问题的时候手边没个趁手的工具那真是寸步难行。前两天还有朋友问我现在免费的、能跨平台用的抓包软件到底有哪些各个工具之间差别又在哪里。这个问题看起来简单其实背后牵扯到的场景特别多有人是要抓网页接口看登录态有人是想分析小程序和App的请求还有人要调试USB设备、蓝牙外设甚至路由器上的通信数据不同场景需要的工具完全不是一个路子。所以我决定把这几年实际用过、踩过坑的免费抓包方案系统整理一遍顺便把每个工具背后适合解决的痛点、配置流程和一些常规文档里不会写的细节都摊开聊希望能帮不同基础的读者少走点弯路。1. 先搞清楚自己到底要抓什么抓包工具不是越多越好也不是越复杂越好第一步永远是明确自己的场景。因为不同层级的流量抓取手段完全是两套逻辑比如HTTP层的请求用代理类工具最方便而底层以太网帧或者USB、蓝牙这类非IP协议的通信数据就得靠专用的抓包器甚至硬件配合了。1.1 按层级和场景给抓包需求分类以我自己的经验日常碰到的抓包需求基本能分成四类网页与HTTP/HTTPS接口调试典型场景是网页端排查登录状态、分析接口返回结构、定位请求头参数异常。这类场景最成熟工具选择也最多Fiddler、Charles、mitmproxy都干这活。移动端App与小程序抓包手机上的App、微信小程序、各种Hybrid应用流量同样是基于HTTP或HTTPS但受证书信任机制、代理检测、证书固定SSL Pinning等因素影响抓包前提是先解决中间人代理的信任问题。局域网与底层协议分析路由器上的流量、物联网设备上报的数据、工控协议等这类已经不是“普通HTTP请求”的范畴需要抓完整的网络帧典型工具是Wireshark和tcpdump。非IP类接口抓包USB外设通信、蓝牙BLE数据包、串口数据等。这类最容易被人忽略很多人以为抓包只有网络请求一种实际USB和蓝牙模式下也有独立的抓包链路。1.2 为什么市面上不存在“万能抓包工具”很多人最开始的想法是找一个工具解决所有平台的抓包但实测下来这想法不现实。原因在于各平台系统限制和权限机制不同Windows下有WinPcap/Npcap配合的Wireshark生态macOS上要用Root权限才能监听的BPF驱动Android和iOS对用户安装的CA证书又限制得越来越死Linux最灵活但很多图形工具需要自己编译。再加上USB、蓝牙这类独立协议栈更是每个都要单独的工具链。所以不存在一个真正意义上的全平台万能方案更靠谱的思路是按平台和场景组合出一套自己顺手的工具集。这篇文章后面所有内容本质上都是围绕“按场景选工具”这个核心逻辑展开的。2. 桌面端必备老牌工具实测盘点桌面端是目前抓包工具最成熟的领域也是大部分人接触抓包的起点。我重点讲三个免费且跨平台或Windows端表现极强的工具Wireshark、Fiddler Classic和mitmproxy它们分别代表了“底层帧分析”“HTTP中间人代理”“命令行与自动化”三个方向。2.1 Wireshark底层协议分析之王Wireshark几乎是所有做网络相关工程的人都绕不开的工具。它基于Npcap/WinPcapWindows或libpcapLinux/macOS抓取网卡数据帧能直接看到二层MAC地址、三层IP头、四次握手细节功能强到可以逐帧查看TCP重传、乱序、丢包。它不仅是抓包工具更是一套完整的协议解析器支持上千种协议的字段解码。免费、开源、全平台支持Windows/macOS/Linux都有安装包这是Wireshark最大的资本。但它的学习曲线确实陡峭第一次打开满屏的协议树和十六进制流很容易让人懵。以排查“网页加载慢”为例用Wireshark打开抓到的pcap文件后通过Statistics下的Flow Graph可以直观看到TCP握手时间、TLS协商耗时、每个请求之间的间隔。很多人做接口联调时遇到超时问题第一反应是看后台日志但如果网络链路本身有问题日志根本不会显示完整链路这时候Wireshark的Expert Info专家信息会直接标注异常如“TCP Retransmission”和“Duplicate ACK”定位效率直接拉满。实际使用技巧上有三点值得注意抓包过滤器不是显示过滤器。抓包前设置tcp port 443这类Capture Filter可以减少磁盘写入避免在高流量环境下丢帧显示过滤器只是隐藏不需要的包该抓的照样抓。如果想抓本机到本机或虚拟机的流量比如宿主机访问模拟器里的服务Wireshark默认看到的可能是回环接口或虚拟网卡要选对Capture Interface。mumu模拟器等安卓模拟器通常有自己的虚拟网卡选错网卡会导致抓不到流量。新版Wireshark内置了“解密TLS”功能只要在Preferences里配置TLS的私钥RSA Key或使用Session Keys文件就能看到解密后的HTTP明文内容。不过前提是你有私钥或者客户端启用了KeyLogFile这在调试自己的客户端时很有用抓别人流量时基本用不上因为拿不到私钥。2.2 Fiddler ClassicWindows端HTTP/HTTPS调试效率标杆Fiddler Classic是老牌Windows免费工具虽然官方主推的Fiddler Everywhere已经变成订阅制但Classic版本依然免费也依然好用。它本质是一个代理服务器启动后监听本机的8888端口所有走系统代理的HTTP/HTTPS流量都会经过它所以它不仅能抓本机程序浏览器、桌面客户端、模拟器等的请求还能让手机通过同一个局域网代理进来从而间接变成手机抓包工具。和Wireshark那种“看到的是会话而不是协议细节”相比Fiddler抓到的直接是HTTP请求和响应左侧列表能看到URL、状态码、耗时右侧能看Headers、Cookies、Body非常直观。做API调试时我经常用它的Composer功能直接修改请求参数重新发送比Postman还顺手因为能基于抓到的原始包改签名算法那些Header都还保留着。Fiddler最大的坑在HTTPS解密。默认情况下它只能看到SSL握手后的密文要看到明文请求必须安装并信任它的根证书。步骤如下菜单栏Tools - Options - HTTPS勾选Capture HTTPS CONNECTs和Decrypt HTTPS traffic。点击Actions - Trust Root Certificate把Fiddler生成的根证书导入系统信任列表。重启抓包进程让新会话重新握手。证书装完之后要注意Windows系统对“根证书”信任授权的弹窗如果弹了好几次说明之前有旧证书残留最好先在“证书存储”里把Fiddler开头的证书全部删掉再重新信任否则会出现证书冲突导致的解密失败。另外Fiddler Classic默认只支持.NET Framework环境下的HTTPS解密个别新型加密套件比如TLS 1.3在老版本里可能解密不了这时候优先升级到最新版。2.3 mitmproxy命令行与Python自动化抓包的神器如果说Fiddler是图形界面的效率工具mitmproxy就是命令行与自动化场景的效率工具。它是一个Python写的开源中间人代理跨平台Windows/macOS/Linux都能用提供三个入口mitmproxy交互式TUI界面适合在终端里边抓边看。mitmweb基于Web的界面适合在浏览器里看请求列表和详情。mitmdump纯命令行模式配合Python脚本使用适合自动化。我日常用得最多的是mitmdump加Python插件的方式。比如要批量抓取某个小程序或App的接口数据可以写一个插件拦截特定URL路径把响应体里的JSON存到本地文件实现自动化数据归集。这比在Fiddler里手动导出强太多因为不需要人工干预。安装很简单pip install mitmproxy启动mitmweb -p 8080让设备或模拟器指向这台机器的8080端口就能开抓。和Fiddler一样HTTPS流量也需要安装mitmproxy自带的CA证书证书路径在启动时会输出一般是~/.mitmproxy/mitmproxy-ca-cert.pem手机或电脑安装并从系统代理指向8080即可。mitmproxy脚本的语法不复杂比如想拦截某个请求并修改响应核心就是一个类from mitmproxy import http def response(flow: http.HTTPFlow) - None: if api.example.com in flow.request.pretty_host: data flow.response.get_text() # 到这里你可以改data、存文件、甚至替换响应体 flow.response.set_text(data.replace(old, new))这个脚本用mitmdump -s script.py -p 8080跑起来就能生效。做接口回放、数据筛选、自动化回归测试时这套组合拳非常能打。3. 移动端与小程序抓包真机、模拟器怎么选移动端抓包的难点不在于工具而在于“让手机信任你的代理证书”。因为Android 7.0以后App默认不信任用户添加的CA证书很多App还会开启SSL Pinning直接用Fiddler或Charles代理抓包大概率只能看到Tunnel to开头的一堆握手记录看不到明文。3.1 真机抓包代理加证书信任的完整流程先把通用流程整理清楚无论是华为、小米还是iPhone都适用手机和电脑连同一个局域网。电脑上启动Fiddler或mitmproxy代理端口设为8888或8080。手机Wi-Fi设置里手动配置代理为“电脑IP:端口”。手机浏览器访问http://电脑IP:端口下载代理工具的根证书。安装并信任该证书iOS需要到“设置-已下载描述文件”里安装再到“证书信任设置”里打开开关Android要看系统版本Android 7.0以下直接就能信任7.0以上需要分情况。关键点是Android 7.0以上“只信任用户的CA证书”会失效。原因是系统App默认的Network Security Config只信任系统预装证书不信任用户安装的证书。最直接的解决办法是App如果是可调试的比如debug包可以直接在AndroidManifest里配置android:networkSecurityConfig如果没有源码就得用能注入信任证书的测试框架或者尝试在模拟器系统中把证书装为系统证书。这里不展开提特定工具但思路就是两个方向让App信任你的证书或者绕开SSL Pinning。iOS相对好一些因为iOS14之后虽然限制了用户证书的默认信任但在“设置-通用-关于本机-证书信任设置”里手动打开“针对根证书启用完全信任”大部分基于系统网络栈的App都能被代理到。问题主要出在用了非系统网络库比如某些长连接SDK的App上那种流量压根不走Wi-Fi代理只能用全局隧道方案这里也不细说。3.2 Windows上的安卓模拟器抓包mumu等模拟器怎么配很多人喜欢在电脑上用安卓模拟器跑App或小程序这就省去了真机证书安装的麻烦但同样的坑也换了形式出现。以mumu模拟器为例默认的网络模式是通过宿主机的NAT转发出去的所以模拟器里的流量你可以直接在宿主机上用Fiddler或Wireshark看到但前提是抓包工具的代理设置要正确。实际操作我推荐一个最简单的方式在模拟器系统的Wi-Fi设置里长按已连接的WLAN修改代理为手动填宿主机IP和Fiddler端口然后浏览器访问Fiddler的下载证书地址安装证书。如果模拟器版本自带Root甚至可以直接用adb把证书推进系统证书目录解决Android 7.0以来的信任问题。但这里有个必须注意的点模拟器里的日期如果和宿主机不一致会导致证书有效期错误抓包时会出现“证书已过期”的报错。我遇到不止一次原因就是模拟器快照恢复后时间漂移。遇到这种问题先在模拟器里把“自动日期时间”打开再同步一次能省很多排查时间。另外mumu模拟器如果开的是“桥接模式”流量会直接走物理网卡Fiddler抓不到只有NAT模式下才走宿主机的回环口这时Fiddler的“All Processes”默认就能看到。如果发现Fiddler左列表里完全找不到模拟器的流量第一件事就是确认模拟器的网络模式是不是NAT不要急着重装证书。3.3 小程序专属抓包方案小程序和普通App有个很大的区别它的网络框架由宿主App微信、支付宝、抖音等提供宿主App的SSL Pinning策略直接决定了普通代理能不能看到内容。实测下来微信小程序很多时候用Fiddler或mitmproxy能抓到部分请求但图片资源和部分接口会被“拦截”成连接失败。一种有效方案是先用系统代理正常抓如果发现接口能看到但内容乱码大概率是证书未信任或被Pinning此时可以尝试将证书安装到系统证书目录如果连握手都失败则需要考虑禁用宿主的代理检测或者抓包的机器上配上对应域名的证书。另一种思路是直接用模拟器版本的小程序比如Android模拟器里的微信因为模拟器Root环境下更容易控制系统证书成功率比真机高不少。遇到“小程序里的视频或文件加载不出来”的情况多数过疑点集中在代理不支持HTTP/2流式响应或WebSocket升级。Fiddler老版本对WebSocket支持一般想抓小程序的WebSocket数据更推荐用mitmproxy或Chrome DevTools的“WS”标签二者对协议帧的还原更完整。4. 专项场景USB、蓝牙、网课视频等抓包方案除了常规的HTTP流量很多人的实际需求更冷门但同样棘手比如USB设备到底发了什么指令、蓝牙设备连接后为什么老断、网课视频的流地址从哪拿。这部分我来挨个说。4.1 USB抓包用免费工具还原设备通信USB抓包听起来很专业其实免费方案也有。Windows下最常用的是Wireshark搭配USBPcap驱动。USBPcap是一个开源的USB抓包驱动安装后Wireshark的接口列表里会出现USBPcap设备选择对应接口开始抓包就能看到USB控制和传输层的URBsUSB Request Blocks。操作上与抓网卡包类似但有几个坑USBPcap可能不支持所有USB控制器芯片尤其是新版xHCI和某些ARM平台转接的USB口抓不到数据时先换个USB口试试。USB协议解析树远比网络协议复杂建议先看Field里的“URB Function”列判断这个包属于哪个接口Endpoint的通信再跟踪长度。如果想抓USB通信里的应用层明文比如HID键盘按键值、串口芯片收发内容需要在Wireshark里右键解码为对应的USB协议类型否则默认只显示URB层。macOS上没有USBPcap这样的驱动更通用的方式是先用ioreg和log stream --predicate subsystem com.apple.USBAudio过滤系统日志必要时再接硬件协议分析仪。不过对大多数场景来说Windows USBPcap已经能覆盖90%的USB调试需求。4.2 蓝牙抓包从Android日志到专用Sniffer蓝牙抓包分BLE和经典蓝牙两种免费工具里我推荐一条低成本路线Android系统自带的Bluetooth HCI抓包日志btsnoop。开发者选项里打开“Bluetooth HCI snoop log”蓝牙通信的HCI层数据会加密写入一个文件一般位于/sdcard/Android/data/btsnoop_hci.log或/data/misc/bluetooth/logs/用Wireshark打开这个log文件就能完整还原蓝牙配对、连接、GATT服务的读写操作。这个方法最大的价值是“免费且无需额外硬件”但局限是只能看自己Android手机发出的HCI命令看不到对端设备的物理层数据。想要更深入比如抓一个BLE设备的广播包就得要硬件Sniffer如nRF Sniffer配合Wireshark插件Nordic官方提供配套方案这已超出“纯软件抓包”的范畴但思路是一样的用Wireshark做协议解析层Sniffer硬件负责射频层收包。蓝牙相关抓包的难点往往不在工具而在协议本身。BLE的GATT操作一层套一层Attribute Handle是十六进制UUID是128位的排查问题时先从Wireshark右下角的专家信息看有没有“ATT protocol”错误再对照设备的服务手册。我个人经验是能先跑通抓包看原始数据再谈分析不然连从哪开始查都不知道。4.3 网课视频与网页端Cookie等自动化抓包思路“网课视频抓包”这样的热词背后本质是想把网页端播放的视频流地址找出来或者验证自己网站的防盗链逻辑是否严密这类需求在测试和教研行业都很常见。核心思路其实不复杂视频流无非是HTTP请求返回的一段MP4或M3U8链接用Fiddler或mitmproxy抓包时筛选后缀名包含m3u8、mp4、flv、ts的URL即可。拿HLS流为例抓到的m3u8文件内容通常是这样的#EXTM3U #EXT-X-VERSION:3 #EXTINF:5.0, https://cdn.example.com/segment/001.ts #EXTINF:5.0, https://cdn.example.com/segment/002.ts把整个m3u8列表序列和分片地址拼接起来就是完整的流地址。但注意很多平台的流地址带了防盗链签名有效期短且绑定了IP或Referer直接拿到地址放浏览器里访问不一定能放出来。如果只是调试推荐在Fiddler的Filters标签里把域名限定成视频CDN域名或者用AutoResponder拉长响应体比一遍遍刷新找分片更高效。至于“网页全平台CK登录器”这类热词说的其实是自动化获取网页端Cookie以实现免登录或状态保持的操作多用于自动化测试和自用脚本。抓包层面就一句话登录成功后的请求头Cookie字段就是你要的东西用mitmproxy脚本拦截Set-Cookie响应头落到本地文件即可。但这里必须强调无论做什么自动化都要在授权范围内进行只处理自己拥有或获得明确测试许可的系统。同样下载网课视频等操作也应当注意版权和平台使用条款技术本身是中性的但使用边界务必守好。5. 工具选型对比与避坑指南看到这里很多人还是会纠结到底该选哪个工具我直接给一张按平台和场景对照的选型表以及自己长期使用中总结的一些避坑记录和方法论。5.1 免费全平台工具横向对比下面这个表是这几个工具的核心差异按我自己的使用频率和推荐度排的。工具免费程度支持平台最佳抓包场景学习曲线备注Wireshark完全免费开源Windows / macOS / Linux底层网络帧、USB配合USBPcap、蓝牙日志解析较高生态最全协议解码最强Fiddler Classic免费WindowsWindowsHTTP/HTTPS接口调试、Web调试、WinApp调试中等Windows端效率之王老版本TLS1.3解密受限mitmproxy / mitmweb完全免费开源Windows / macOS / Linux命令行与Python自动化、小程序/App批量抓取中等脚本能力强适合DevOps工作流Charles免费试用Windows / macOS / Linux移动端真机调试、HTTPS解密中等虽然是付费工具但试用可用不少人当主力用tcpdump完全免费开源Linux / macOS服务器端命令行抓包、节流环境分析较高无图形界面但配合Wireshark分析pcap文件是黄金组合补充一个常见误区很多人看到Burp Suite以为它是全能抓包工具其实Burp Suite Community版本更多是针对Web安全测试的代理抓包只是它的入口而且它的界面和过滤逻辑是为“渗透测试”设计的普通HTTP调试用Fiddler或mitmproxy更顺手。如果你主要做Web安全方向再考虑Burp。5.2 HTTPS证书安装到底怎么操作才不容易翻车证书是抓包工具里最容易劝退新手的环节。我把Fiddler和mitmproxy的证书安装全流程和易错点汇总一下按平台区分好。Fiddler以Windows为例打开Fiddler菜单栏Tools - Options - HTTPS。勾选“Capture HTTPS CONNECTs”和“Decrypt HTTPS traffic”。点“Actions - Trust Root Certificate”弹窗选“是”。若手机需要用手机浏览器访问http://电脑IP:8888点页面里的“FiddlerRoot certificate”下载并安装。易错点先删旧证书再装新证书否则会出现“证书链信任”被旧证书干扰的情况。另外Fiddler的代理端口默认是8888如果占用在Tools - Options - Connections里改掉手机端同步改即可。mitmproxy以Android模拟器为例启动mitmweb -p 8080。模拟器Wi-Fi设代理为宿主机IP:8080。模拟器浏览器访问http://mitm.it下载对应平台的证书。Android 7.0以上如果App不信任用户证书可以用adb把证书转成系统证书openssl x509 -inform PEM -in ~/.mitmproxy/mitmproxy-ca-cert.pem -outform DER -out mitmproxy-ca-cert.der # 用hash方式重命名证书文件 HASH$(openssl x509 -inform PEM -in ~/.mitmproxy/mitmproxy-ca-cert.pem -noout -subject_hash) adb root adb remount adb push mitmproxy-ca-cert.der /system/etc/security/cacerts/$HASH.0 adb shell chmod 644 /system/etc/security/cacerts/$HASH.0 adb reboot这一步的核心逻辑是把“用户证书”提升为“系统证书”这样Android系统会对所有App默认信任。注意只有带Root的模拟器或已Root的真机才能操作而且不同Android版本系统证书目录位置略有差异但大体是/system/etc/security/cacerts/。5.3 我踩过的几个坑SSL Pinning、Android 7.0、代理失效坑一Android 7.0以上用户证书不被信任。这在上面已经说了就不重复总之记住“用户证书”和“系统证书”是两回事而系统证书写入需要Root。坑二SSL Pinning证书固定。部分金融、社交类App在客户端内置了服务端公钥指纹或证书指纹代理工具给它换了个中间人证书客户端一校验指纹不对直接断开连接。表现就是Fiddler里看到一堆TCP RST或者App直接报网络错误。处理思路按优先顺序是看App有没有提供“测试环境”或“忽略SSL校验”的开关。使用支持SSL Pinning绕过方案的定制测试框架比较典型的是在越狱/root环境注入SSL Unpinning模块。实在没有方案就回到Wireshark抓TLS ClientHello从加密内容里看SNI域名至少能定位连了哪个服务器再从服务端日志侧排查。坑三代理配置生效但请求全失败或“CONNECT失败”。这种情况八成是工具端口冲突或代理模式下有HTTP/2兼容问题。Fiddler老版本对HTTP/2的优先连接支持不好时会看到某些域名连接失败换成mitmproxy或新版Fiddler就好很多。坑四抓包工具本身把系统代理关掉后电脑反而上不了网。这是因为Windows系统代理没有恢复很多工具退出时会异常退出没有把注册表里的代理设置还原。手动去“Internet选项-连接-局域网设置”里把“为LAN使用代理服务器”取消勾选就能恢复。5.4 抓包这件事的合法边界最后聊点题外的但这部分我认为比工具本身更重要抓包能力越强越要清楚边界在哪里。抓包本身是网络诊断、开发调试、安全测试的常规手段完全合法。但同样的技术也有被滥用的可能比如抓取他人通信内容、绕过付费或授权机制、窃取账号Cookie等都是明确非法或违规的行为。我的原则很简单只抓自己设备、自己服务的流量。在测试环境中做验证不拿生产数据和他人隐私做实验。如果涉及第三方服务先确认测试授权和平台条款。举个实际例子做爬虫或自动化测试时很多人会顺手把目标站点全站流量抓下来分析接口但这个行为一旦超出“访问公开数据”的范围很容易触犯相关法律法规。同是抓包用于故障排查和用于越权访问性质天差地别。工具不设防使用人得自己设防。我个人在实际操作中的体会是把抓包当成“把通信内容可视化呈现”的能力它帮我们理解网络世界运行方式的效率极高。你可以用它排查线上故障、做接口联调、分析设备协议、研究安全漏洞但前提永远是——在合法合规的范围内使用。这也是整个工具集的核心价值让工程师在出现问题时多一种低成本定位的手段而不是让这份技术能力变成“双刃剑”里危险的那一面。最后再分享一个小技巧如果你经常从命令行抓Linux服务器上的包tcpdump -i eth0 -w /tmp/a.pcap配合Wireshark在本地打开文件分析是比直接远程GUI更稳定高效的组合。服务器上尽量少装图形组件抓完包拖回本地用Wireshark这种重型工具解析既安全又能利用Wireshark的完整协议栈。这套组合我用了很多年依旧觉得是抓包流里的黄金搭档。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进