为什么手造 pcap
📄 r0capture 手动构造 pcap 包而非用 scapy/pyshark 的设计原因。
常规做法 vs r0capture
| 做法 | 工具 | 代价 |
|---|---|---|
| 常规 | scapy / pyshark 构造包 | 引入大依赖,慢 |
| r0capture | struct.pack 手拼 | 零依赖,快 |
r0capture 的选择
r0capture 不依赖 scapy,直接用 Python 标准库 struct 拼 pcap:
python
# 全局头
pcap_hdr = struct.pack('=IHHiIII', 0xa1b2c3d4, 2, 4, 0, 0, 65535, 228)
# 记录头
rec_hdr = struct.pack('=IIII', ts_sec, ts_usec, incl_len, orig_len)
# IPv4 头
ip_hdr = struct.pack('>BBHHHBBHII', 0x45, 0, total_len, ...)
# TCP 头
tcp_hdr = struct.pack('>HHLLBBHHH', src_port, dst_port, seq, 0, 0x5018, ...)
# 载荷
data为什么能省略
r0capture 抓的是应用层明文,不需要真实网络层的:
- 以太网帧头(pcap 用 LINKTYPE_IPV4 跳过)
- TCP 三次握手(假包不模拟)
- TCP 真实 seq/checksum(填假值,Wireshark 容错)
只要 src/dst addr+port 真实 + 载荷正确,Wireshark "Follow TCP Stream" 就能重组明文。
好处
- 零依赖:只要 Python 标准库,部署简单
- 快:struct.pack 极快,抓包不阻塞
- 可控:每字段都自己定,便于调试
- 小:不引入 scapy 数 MB 依赖
代价
- pcap 里 seq/checksum 是假的,Wireshark 显示警告(不影响明文查看)
- 没有完整握手,不能看 TCP 状态机
但对"看明文"这个目标,这些都无所谓。