为了账号安全,请及时绑定邮箱和手机立即绑定

Python 抓包,工具、脚本与 iOS 真机补抓流程

标签:
iOS

对开发者来说,Python 抓包不仅是抓到网络流量那么简单,而是把数据流转成可验证的证据、可复现的复现步骤和可执行的修复建议。下面以工程实战角度,讲清用 Python 做抓包/解析的常用方案、典型脚本模板、调试 HTTPS 的要点以及当桌面代理失效或 App 做证书 pinning 时怎样用Sniffmaster抓包补齐证据。

为什么用 Python 抓包?
Python 有成熟库(scapy、pyshark、mitmproxy、asyncio + aiohttp 等),适合做自动化抓取、过滤、统计与回放。相比纯手工 tcpdump -> Wireshark,Python 容易把流程脚本化、嵌入测试或 CI,并能生成审计报告。

工具与职责快速对照(仅一览)

  • scapy:灵活的包构造与抓取,适合做自定义协议解析与主动探测。
  • pyshark:基于 tshark 的解析器,方便把 pcap 导入到 Python 做批量统计。
  • mitmproxy:可编程的代理,能以 Python 脚本方式修改/记录 HTTPS 流量(适合开发环境)。
  • requests/aiohttp:配合代理或 SSLKEYLOGFILE 做受控抓取与复现。
  • tcpreplay/socat(外部工具):用于把抓到的流量在隔离环境回放给开发复现。
  • 设备侧抓包工具(如 Sniffmaster):当代理不可行时,用于导出设备端原始 pcap,与服务器端 pcap 做对比分析。

实战一:用 scapy 快速抓 TCP 包并统计重传(示例)

from scapy.all import sniff, TCP

def handle(pkt):
    if TCP in pkt and pkt[TCP].dport==443:
        print(pkt.summary())

sniff(filter="tcp port 443 and host 10.0.0.5", prn=handle, store=0, timeout=30)

这个脚本适合快速在测试机上观察到达 443 的流量概况。遇到大量 SYNRST,优先判断防火墙或服务端是否监听。

实战二:用 pyshark 批量提取 TLS 握手失败统计

import pyshark
cap = pyshark.FileCapture('capture.pcap', display_filter='tls.alert_message')
counts = {}
for p in cap:
    ia = p.ip.src
    counts[ia] = counts.get(ia,0)+1
print(sorted(counts.items(), key=lambda x:-x[1])[:10])

把 TLS Alert 的高频来源列出来,能迅速定位到问题区域(某个 ASN / 运营商 / IP 段)。

实战三:用 mitmproxy 做自动化抓包与重放(开发环境)
mitmproxy 支持用 Python 插件拦截、修改请求和记录会话,适合做接口调试与自动化用例回放。注意:这类代理式解密仅用于测试环境或经过用户明确授权的场景。

HTTPS 调试要点(工程提醒)

  • 在测试环境可以用 SSLKEYLOGFILE 导出会话密钥,Wireshark + pyshark 能直接解密 TLS。生产不得随意导出真实会话密钥。
  • 若遇到证书链不完整、SNI 错误或 ALPN 不匹配,先用 openssl s_client 验证,再用 Python 抽取 pcap 中的 ClientHello 对比。
  • HTTP/2 与 HTTP/3(QUIC)要分别处理:HTTP/2 仍能在 TLS 解密后用常规工具解析,QUIC 则基于 UDP,解密难度更高,优先依赖客户端/服务端日志与多点抓包比对。

当代理失效或 App 启用 Pinning 时怎么办?(关键流程)

  1. 收集证据与时间窗:记录精确复现时间、设备、App 版本、request-id。
  2. 服务端抓包:在边缘或源站用 tcpdump 抓 -s 0 的 pcap 保存。
  3. 设备侧导出 pcap:如果无法在设备上安装代理或修改 App,需从设备直接导出原始包。这里的“设备端 pcap”是定位真机问题的关键证据。
    • 可以使用能通过 USB 直连并按 App 过滤导出 pcap 的工具(例如 Sniffmaster)。该类工具无需越狱或改包,适合把 iOS/Android 上的握手层面证据导出给工程师做比对。
  4. 对比分析:用 pyshark/Wireshark 同时打开 server.pcap 与 device.pcap,按时间线和五元组比对 ClientHello、ServerHello、证书链与 tls.alert。
  5. 结论与修复:若 device 端看到的证书颁发机构与 server 不一致,说明中间替换;若证书一致但出现 bad_certificate 类 Alert,可能为 pinning 或客户端验证逻辑问题。

示例:用 Python 自动比对 ClientHello 的 SNI

import pyshark
def extract_sni(pcap):
    cap = pyshark.FileCapture(pcap, display_filter='tls.handshake.type==1')
    snis=[]
    for p in cap:
        try:
            snis.append(p.tls.handshake_extensions_server_name)
        except AttributeError:
            snis.append(None)
    return snis

print(extract_sni('device.pcap')[:5])
print(extract_sni('server.pcap')[:5])

把两端的 SNI 列出来,快速判断是否存在差异。

工程化建议与合规注意

  • 抓包脚本与分析工具应纳入项目工具链,遇到类似问题可以一键执行(采集、提取、统计、归档)。
  • 设备侧抓包必须走审批;导出的 pcap 加密存储、最小保留、脱敏处理。
  • 把常见的 pyshark/tshark 命令写成标准化脚本(例如统计 TLS Alert、重传、长连接时延),便于快速定位。

结语
Python 在抓包与流量分析上既能做轻量的交互式调试,又能做批量的证据化统计。把 Python 脚本化的抓包与传统 tcpdump/Wireshark、代理工具结合起来,能把“偶发真机问题”变成可验证的工程任务。

当桌面代理无能为力(证书 pinning、mTLS 或企业透明代理)时,从设备端导出的原始 pcap 是关键证据;像 Sniffmaster 这样的设备侧抓包方案可作为工程取证链路的合理补充,用来与服务器端 pcap 做逐帧对比定位问题。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消