如何完整读取.pcap文件?tcpdump捕获数据包为何缺失字符
解决tcpdump输出中缺失字符的问题
先看你捕获的数据包内容:
reading from file /tmp/prueba.pcap, link-type LINUX_SLL (Linux cooked v1) 13:35:51.767194 IP6 fdc1:41d:9c3:dbef:a6e9:69f0:59aa:b70a.47193 > fdc1:41d:9c3:dbef:0:ff:fe00:8c00.47193: UDP, length 63 0x0000: 6000 0000 0047 1140 fdc1 041d 09c3 dbef `....G.@........ 0x0010: a6e9 69f0 59aa b70a fdc1 041d 09c3 dbef ..i.Y........... 0x0020: 0000 00ff fe00 8c00 b859 b859 0047 d42e .........Y.Y.G.. 0x0030: 3f0c 0000 0dc2 50f1 0d7b 2254 696d 6522 ?.....P..{"Time" 0x0040: 3a5b 3136 3632 3033 3933 3531 2c22 225d :[1662039351,""] 0x0050: 2c22 4d6f 6417 0012 320f 00f0 0352 6f6c ,"Mod...2....Rol 0x0060: 6c22 3a5b 3533 302c 2264 c2ba 225d 7d l":[530,"d.."]}
问题根源是tcpdump的ASCII预览会把非可打印ASCII字符替换成.,这类字符的存在容易让你误以为后续内容缺失。你看到的"Mod"后的0x17是不可打印的控制字符(ETX),被替换成.,但这不代表"e"不存在——或是你的应用层协议中"Mode"的"e"被编码成了非ASCII字节,只是tcpdump没正确显示。
要完整读取消息并编写自动化提取程序,可用以下几种方法:
方法1:用tshark直接提取应用层数据
tshark是Wireshark的命令行工具,能精准提取原始数据:
# 输出UDP负载的十六进制字符串 tshark -r /tmp/prueba.pcap -T fields -e data.data # 直接转成可读字符串(忽略非可打印字符) tshark -r /tmp/prueba.pcap -T fields -e data.data | xxd -r -p
方法2:用Python的Scapy库解析
适合编写自动化程序,直接读取pcap并提取UDP负载:
from scapy.all import rdpcap, UDP, IPv6 packets = rdpcap('/tmp/prueba.pcap') for pkt in packets: if pkt.haslayer(UDP): payload = pkt[UDP].payload.load # 打印原始字节 print(payload) # 转成字符串(忽略非可打印字符) print(payload.decode('ascii', errors='ignore')) # 按十六进制查看 print(payload.hex())
通过Scapy可直接访问原始负载字节,不受tcpdump显示限制,方便提取数值。
方法3:调整tcpdump显示参数
如果坚持用tcpdump,可用-xx打印完整十六进制数据,自行对照解析:
tcpdump -r /tmp/prueba.pcap -xx
从你提供的十六进制数据看,0x0050行的4d6f64是"Mod",后续的0x17并非"e"(对应0x65),若确认应用层应为"Mode",需检查发送端编码逻辑——但既然你排除了传输问题,用上述方法提取原始数据后,就能基于实际字节编写自动化提取逻辑。
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

