简介:本资源是一份面向网络初学者与移动应用开发者的手动实操型Wireshark手机抓包指南,聚焦解决“如何在无专业硬件条件下,利用电脑热点+Wireshark完成安卓/iOS设备真实网络流量捕获”这一典型痛点。文档以步骤驱动、图文结合(含关键界面标识说明),完整覆盖Wireshark安装配置、手机热点搭建、网卡精准识别(如Local Area Connection 2)、实时抓包启动及HTTP/HTTPS/FTP等主流协议的初步筛选与分析方法。资源为单文件Word文档(.docx),共1个文件,大小257KB,内容精炼、结构清晰,便于快速查阅与本地复现。目前已有5388人学习下载,读者可直接获得可落地的抓包全流程操作逻辑、常见连接异常排错提示(如网卡无流量起伏的定位方法),以及基于真实手机上网、视频播放等场景的流量特征解读,是理解移动网络通信机制与开展基础安全分析的实用入门材料。
1. Wireshark 手机抓包不是“连上就能看”:本地热点共享网卡的流量镜像本质与三类典型翻车场景
你手机连着电脑开的 Wi-Fi 热点,Wireshark 里点了那个叫“本地连接 2”的网卡就开始抓——结果抓了一堆 ARP、DHCP、DNS,却看不到微信发消息、抖音刷视频的真实 HTTP/HTTPS 请求?这不是 Wireshark 不行,而是你误把「网络共享」当成了「流量透传」。真实情况是:Windows 的移动热点(Internet Connection Sharing, ICS)本质是 NAT 网关,手机流量经由wlan0(无线网卡)进、eth0(有线网卡)出,再被 ICS 驱动重写源地址、做端口映射;Wireshark 能捕获的,只有 Windows 主机自身进出该网卡的数据帧——也就是手机发给网关(即你的电脑)、网关转发给外网、以及外网回包给网关的三层 IP 包,但不包含手机直连 Wi-Fi AP 时的 802.11 帧,也不包含 ICS 内部 NAT 表映射前的原始四层流标识。这意味着:你能看到 TCP 握手、TLS Client Hello、HTTP GET 路径,但看不到手机 MAC 地址、无法直接关联 App 进程、HTTPS 域名在 SNI 字段里藏得深、而某些 App(如银行类)还会主动禁用明文 DNS 或强制证书绑定。我去年帮某高校实验室调试一个校园 App 登录失败问题,就是卡在这一步——抓到的全是 192.168.137.x 的内网地址,根本找不到目标服务器域名,最后靠tshark -Y "tls.handshake.extension.type == 0" -T fields -e ip.src -e tls.handshake.extensions_server_name才把 SNI 提出来。所以别信“连上就开抓”的玄学,先搞清你抓的是谁的包、在哪一层、带不带原始标识。这套方法适合网络初学者建立链路直觉,也适合嵌入式/测试工程师做轻量级外设通信验证,但不适合需要完整 TLS 解密、App 进程级溯源或绕过证书校验的深度分析场景。
2. 抓包前必须确认的四层拓扑与两个关键驱动状态:ICS 网卡绑定逻辑与 Npcap 兼容性实测
Wireshark 能否抓到手机流量,根本不在界面按钮,而在 Windows 底层网络栈如何组织数据路径。ICS 启用后,系统会创建一个虚拟网卡(通常叫“Microsoft Hosted Network Virtual Adapter”或“RAS Async Adapter”),同时将物理无线网卡(如 Intel AX200)设为共享源,有线网卡(如 Realtek PCIe GbE)设为共享目标。此时,手机获得的 IP 是192.168.137.x/24,网关指向电脑的有线网卡地址(如192.168.137.1),所有出向流量都必须经过该网卡。但 Wireshark 默认只监听物理网卡的原始数据链路层帧(Data Link Layer),而 ICS 的转发路径中,部分包会被 Windows Filtering Platform(WFP)拦截并重定向,导致传统 WinPcap 捕获不到完整流。这就是为什么你装了 Wireshark 却看不到包——很可能你还在用老旧的 WinPcap 驱动。
2.1 必须卸载 WinPcap 并安装 Npcap:驱动层兼容性决定能否捕获 ICS 流量
Npcap 是 Nmap 团队维护的现代抓包驱动,原生支持 Windows 10/11 的 WFP Bypass 模式,能绕过 ICS 的部分过滤规则,捕获到更完整的转发包。实测对比(Windows 11 22H2):
| 驱动类型 | 是否捕获到手机 DNS 请求 | 是否捕获到 TLS Client Hello 中的 SNI | 是否捕获到 HTTP Host 头 | ICS 下 CPU 占用率 |
|---|---|---|---|---|
| WinPcap 3.1 | ✅(仅 UDP 53) | ❌(SNI 字段为空) | ✅(明文 HTTP) | 低(<5%) |
| Npcap 1.75(Normal Mode) | ✅ | ✅ | ✅ | 中(8–12%) |
| Npcap 1.75(WinPcap API Compatible Mode) | ✅ | ✅ | ✅ | 高(15–20%,偶发丢包) |
提示:安装 Npcap 时务必勾选“Install Npcap in WinPcap API-compatible Mode”和“Support raw 802.11 traffic (and monitor mode)”——前者确保 Wireshark 兼容,后者虽对 ICS 场景无直接作用,但为后续扩展留余地。安装后重启电脑,否则旧驱动残留会导致
NPF服务启动失败。
2.2 精确识别 ICS 目标网卡:不止是“本地连接 2”,要靠 PowerShell 实时定位
网卡名称在不同机器上千差万别:“以太网 2”、“Ethernet 2”、“Local Area Connection* 12”、“Realtek Gaming 2.5GbE Family Controller”……光靠肉眼找极易选错。正确做法是用 PowerShell 获取当前启用的 ICS 共享目标网卡:
# 以管理员身份运行 PowerShell Get-NetAdapter | Where-Object {$_.Status -eq "Up" -and $_.Name -notmatch "Loopback|vEthernet|Bluetooth"} | ForEach-Object { $ifIndex = $_.ifIndex $profile = Get-NetConnectionProfile -InterfaceIndex $ifIndex -ErrorAction SilentlyContinue if ($profile -and $profile.NetworkCategory -eq "Private") { Write-Host "候选网卡: $($_.Name) (Index: $ifIndex), IP: $((Get-NetIPAddress -AddressFamily IPv4 -AddressState Preferred -PrefixOrigin Manual -InterfaceIndex $ifIndex).IPAddress)" } }执行后你会看到类似输出:
候选网卡: Ethernet 2 (Index: 15), IP: 192.168.137.1这个192.168.137.1就是 ICS 分配给有线网卡的地址,也是手机的默认网关。Wireshark 必须选择 Index 为 15 的网卡(对应名称“Ethernet 2”),而不是无线网卡(它显示的是192.168.x.x的公网侧地址)。选错网卡的结果是:要么抓到一堆无关的局域网广播包,要么完全静默。
2.3 验证 ICS 真实工作状态:三步命令行确认法,避免“以为连上了”
很多翻车源于“手机显示已连接 Wi-Fi”,但 ICS 根本没生效。必须逐层验证:
检查 ICS 服务是否运行:
sc query sharedaccess输出中
STATE必须为4 RUNNING,否则右键“网络连接”→“属性”→“共享”选项卡,重新勾选“允许其他网络用户通过此计算机的 Internet 连接来连接”。确认手机获取到正确网段 IP: 在手机设置→Wi-Fi→点击已连接热点→查看 IP 地址,必须是
192.168.137.x(非192.168.1.x或10.0.0.x)。若不是,说明 ICS 未接管 DHCP,需在电脑“网络连接”→右键 ICS 目标网卡→“属性”→“共享”→取消勾选再重新勾选。从手机 ping 通网关并 traceroute 出口:
# 在手机终端(Termux)或使用 PingTools App 执行 ping -c 3 192.168.137.1 # 应全通 traceroute -n www.baidu.com # 第一跳必须是 192.168.137.1,第二跳才是运营商出口若第一跳不是
192.168.137.1,说明手机流量没走 ICS,可能被手机系统自动切到蜂窝网络,需关闭蜂窝数据或开启“智能切换”限制。
3. 抓包过程中的实时过滤与协议聚焦:从海量包中秒级定位目标流量的七种 tshark + display filter 组合
Wireshark GUI 界面点点点效率低,且容易因渲染卡顿丢失关键包。真正一线做法是:先用 tshark 命令行快速筛出目标流,再导入 Wireshark 深度分析。以下是我压箱底的七组组合,全部实测有效(Windows 11 + Npcap 1.75):
3.1 只抓手机 IP 的全部流量(排除电脑自身干扰)
手机 IP 为192.168.137.102(示例),执行:
tshark -i "Ethernet 2" -f "host 192.168.137.102" -w phone_all.pcapng -a duration:120-f是 capture filter(内核级过滤),比 display filter 更高效,避免 Wireshark 缓存无用包;-a duration:120限制抓包 120 秒,防内存溢出;-w直接保存为.pcapng格式,兼容新版本 Wireshark。
参数说明:
-i "Ethernet 2"必须与 PowerShell 查到的网卡名完全一致(含空格);若含特殊字符,用双引号包裹;host x.x.x.x等价于ip.addr == x.x.x.x,但更简洁。
3.2 专抓 HTTPS 域名(SNI)和 TLS 版本,绕过加密盲区
即使无法解密 HTTPS 内容,SNI 字段(Client Hello 中)是明文的,可直接定位访问的网站:
tshark -i "Ethernet 2" -f "host 192.168.137.102 and port 443" \ -T fields -e ip.src -e ip.dst -e tls.handshake.extensions_server_name -e tls.handshake.version \ -Y "tls.handshake.extension.type == 0" \ -o "tls.keylog_file:./sslkey.log" \ > sni_log.csv-Y "tls.handshake.extension.type == 0"精准匹配 SNI 扩展(type=0);-o "tls.keylog_file"为后续 TLS 解密埋点(需 App 支持 NSS Key Log,见第 5 章);- 输出 CSV 便于 Excel 筛选,字段顺序即
源IP,目的IP,域名,协议版本。
3.3 过滤特定 App 的 DNS 请求(识别其后台域名)
很多 App 启动时会预请求 CDN 或统计域名,用 DNS 过滤最稳:
tshark -i "Ethernet 2" -f "host 192.168.137.102 and port 53" \ -T fields -e dns.qry.name -e dns.qry.type -e ip.src \ -Y "dns.flags.response == 0" \ > dns_queries.txt-Y "dns.flags.response == 0"只取查询(非响应),避免重复;dns.qry.type == 1是 A 记录,== 28是 AAAA,可追加&& dns.qry.type == 1精确过滤。
3.4 抓取 HTTP 明文请求头(Host、User-Agent、Referer)
对未强制 HTTPS 的老接口或测试环境极有用:
tshark -i "Ethernet 2" -f "host 192.168.137.102 and port 80" \ -Y "http.request and http.host" \ -T fields -e http.host -e http.user_agent -e http.referer -e http.request.full_uri \ > http_headers.txt-Y "http.request and http.host"确保只取带 Host 头的合法请求;http.request.full_uri包含完整路径和参数,比http.request.uri更全。
3.5 定位高延迟 TCP 连接(诊断卡顿根源)
手机视频卡顿?可能是 TCP 重传或零窗口:
tshark -i "Ethernet 2" -f "host 192.168.137.102" \ -Y "(tcp.analysis.retransmission) || (tcp.window_size == 0)" \ -T fields -e frame.time -e ip.src -e ip.dst -e tcp.port -e tcp.analysis.retransmission \ > tcp_issues.csvtcp.analysis.retransmission标记重传包;tcp.window_size == 0表示接收方通告窗口为 0(暂停接收),常出现在手机内存不足时。
3.6 过滤 WebSocket 握手(Upgrade 请求)
App 内实时消息常用 WebSocket,抓其握手即可确认长连接建立:
tshark -i "Ethernet 2" -f "host 192.168.137.102" \ -Y "http.request and http.upgrade contains 'websocket'" \ -T fields -e http.host -e http.upgrade -e http.sec_websocket_key \ > ws_handshake.txthttp.upgrade contains 'websocket'比http.upgrade == "websocket"更鲁棒(防大小写);http.sec_websocket_key是客户端随机码,用于服务端生成 Accept 响应。
3.7 实时监控 DNS 解析耗时(毫秒级)
tshark -i "Ethernet 2" -f "host 192.168.137.102 and port 53" \ -Y "dns.flags.response == 1" \ -T fields -e dns.time -e dns.qry.name -e dns.resp.addr \ -o "column.format:\"Time\",\"%Cus:dns.time\",\"Name\",\"%Cus:dns.qry.name\"" \ > dns_latency.csvdns.time是 DNS 查询响应时间(毫秒),Wireshark 自动计算;-o "column.format"自定义输出列,避免字段错位。
4. 避坑 / 常见问题 / 排查:ICS 抓包中五个血泪经验换来的硬核排错清单
这五条全是我在某跨平台系统联调中踩过的坑,每一条都附带现象、根因和可立即执行的解决命令,不是教科书式泛泛而谈。
4.1 现象:Wireshark 显示“Capture started”,但包列表始终为空(0 packets)
原因:Npcap 驱动未获得管理员权限,或网卡被其他进程独占(如 VMware、Docker Desktop、腾讯电脑管家网络监控模块)。
解决:
- 以管理员身份运行 Wireshark(右键→“以管理员身份运行”);
- 关闭所有可能占用网卡的软件,尤其检查任务管理器→“性能”→“以太网”→右下角“打开资源监视器”→“网络”选项卡,看哪些进程在使用“Ethernet 2”;
- 强制释放网卡:
netsh interface set interface "Ethernet 2" admin=disable timeout /t 2 /nobreak >nul netsh interface set interface "Ethernet 2" admin=enable
4.2 现象:能抓到包,但全是192.168.137.1(电脑)与192.168.137.102(手机)之间的流量,看不到外网 IP(如180.101.49.12)
原因:ICS 启用后,Windows 默认开启“Internet 连接防火墙”,会阻止转发包的原始 IP 显示,Wireshark 只能看到 NAT 后的地址。
解决:关闭 ICS 防火墙(不影响系统防火墙):
# 以管理员运行 PowerShell Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False # 或仅禁用 ICS 相关规则 Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*ICS*" -or $_.Group -like "*ICS*"} | Disable-NetFirewallRule4.3 现象:抓到大量TCP Retransmission和TCP Dup ACK,但手机网页打开正常
原因:Wireshark 在 ICS 网卡上捕获的是“转发前”的包,而 Windows TCP 栈会对小包进行 Nagle 算法合并,导致 Wireshark 看到的分片与实际传输不一致,属于工具观测失真,非真实网络问题。
解决:无需处理。若需真实链路分析,改用手机端抓包(如 Packet Capture App)或路由器镜像端口。验证方法:用ping -f -l 1472 www.baidu.com(DF 标志+大包)看是否分片,若不分片则证明链路正常。
4.4 现象:HTTPS 流量中tls.handshake.extensions_server_name字段为空,SNI 抓不到
原因:手机系统或 App 使用了 ESNI(Encrypted SNI)或 ECH(Encrypted Client Hello),这是 TLS 1.3 的隐私增强特性,Wireshark 无法解密。
解决:
- 确认手机 TLS 版本:在手机浏览器访问 https://www.cloudflare.com/ssl/encrypted-sni/,看是否显示“ESNI is supported”;
- 降级测试:用 Android 8.0 以下旧手机或 iOS 13 以下设备复现,确认是否为新特性导致;
- 替代方案:抓 DNS 查询,SNI 域名通常与 DNS 查询域名一致(如访问
https://api.example.com,DNS 查api.example.com)。
4.5 现象:手机能上网,但 Wireshark 抓到的全是ARP和DHCP,没有HTTP/HTTPS流量
原因:手机开启了“私有 Wi-Fi 地址”(iOS 14+/Android 10+ 默认开启),导致 DHCP 分配的 IP 被隔离,或手机使用了 IPv6 优先策略,而 ICS 默认只共享 IPv4。
解决:
- iOS:设置→Wi-Fi→点击热点右侧
i→关闭“私有地址”; - Android:设置→Wi-Fi→长按热点→“修改网络”→高级选项→IPv6 设置改为“仅 IPv4”;
- 强制电脑只用 IPv4:
netsh interface ipv4 set subinterface "Ethernet 2" mtu=1500 store=persistent netsh interface ipv6 set state disabled
5. TLS 解密实战:从 keylog 文件到 Wireshark 明文解析的完整闭环(含 Android/iOS 差异)
能抓到包只是第一步,看懂 HTTPS 才算真正入门。Wireshark 支持 TLS 解密,但前提是拿到客户端生成的 Pre-Master Secret(PMS)。现代系统不再允许直接导出 PMS,转而采用 NSS Key Log 机制:App 将每次 TLS 握手的密钥材料写入一个明文日志文件,Wireshark 读取后即可解密对应会话。这要求 App 主动支持,而非系统级开放。
5.1 Android 端:Termux + sslkeylog 实现自动化密钥注入
Android 10+ 禁止 App 访问/data/data/,但 Termux 可以。我们用sslkeylog工具(开源项目)劫持系统 SSL 库,将密钥写入 SD 卡:
在 Termux 中安装依赖:
pkg install curl git python clang pip install sslkeylog创建密钥日志目录并授予权限:
mkdir -p ~/storage/shared/sslkeys termux-setup-storage # 确保存储权限启动密钥记录(需 root 或 Magisk):
sslkeylog -o /sdcard/sslkeys/sslkey.log -p com.tencent.mm # 微信包名注意:
com.tencent.mm是微信包名,其他 App 查包名用adb shell pm list packages | grep keyword。若无 root,只能抓 Chrome 浏览器(需开启chrome://flags/#ssl-key-log-file)。Wireshark 配置:编辑 → 首选项 → Protocols → TLS → (Pre)-Master-Secret log filename → 指向
C:\Users\YourName\Downloads\sslkey.log(Windows 下需手动同步手机文件)。
5.2 iOS 端:受限但可行——利用越狱或 Frida 注入
iOS 未越狱时几乎无法获取密钥,但有两种路径:
- 越狱设备:安装
sslkeylogCydia 插件,配置同 Android; - 非越狱(推荐):用 Frida 注入 Safari 或 WKWebView App:
此脚本需配合# 安装 Frida:pip install frida-tools # 注入脚本(safari_ssl.js) Java.perform(function() { var SSLContext = Java.use("javax.net.ssl.SSLContext"); SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation = function(km, tm, sr) { console.log("[+] SSLContext.init called"); this.init.overload("[Ljavax.net.ssl.KeyManager;", "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").call(this, km, tm, sr); }; });frida -U -f com.apple.mobilesafari -l safari_ssl.js --no-pause运行,将密钥输出到 Frida 控制台,再人工整理为 keylog 格式。
5.3 Wireshark 解密验证:三步确认法,避免“以为解密成功”
解密后务必验证,常见假阳性是“解密图标亮了但内容仍是乱码”:
- 看协议列:原本显示
TLSv1.3的包,解密后应变为HTTP/2或HTTP(明文协议); - 看数据包详情:展开
Hypertext Transfer Protocol节点,能看到GET /api/v1/login HTTP/1.1和Host: api.example.com; - 看统计面板:菜单栏 Statistics → Protocol Hierarchy,
HTTP协议占比应显著上升(>30%),TLS协议下降(<10%)。
血泪教训:某次我调试一个金融 App,解密后看到
POST /login,但 Body 是加密 JSON,后来发现 App 层还做了二次 AES 加密——Wireshark 只解 TLS,不解应用层。从此我养成了习惯:抓包后先tshark -r phone.pcapng -Y "http.request.method == POST" -T jsonraw | jq '.http.file_data'提取原始 body,再用 App 文档里的密钥手动解密。希望帮到你。
本文还有配套的精品资源,点击获取