Scapy中sniff()函数如何获取ASCII格式的原始字节数据?
解决Scapy sniff()获取ASCII格式原始字节数据的问题
Scapy默认的show()或summary()会按协议结构输出内容,不会自动将数据包的原始负载转换为Wireshark风格的ASCII格式,需要手动提取并处理负载字节来实现需求。
- 核心思路:
- 检查数据包是否包含目标协议层(比如TCP),提取其
payload字段的原始字节数据 - 将字节数据转换为可打印ASCII字符串,不可打印字符用
.替代(和Wireshark的显示逻辑对齐) - 将处理逻辑集成到
sniff()的prn参数,或对捕获后的数据包批量处理
- 检查数据包是否包含目标协议层(比如TCP),提取其
实时捕获时输出ASCII payload
from scapy.layers.inet import TCP from scapy.all import sniff def tcp_ascii_prn(pkt): if TCP in pkt: payload_bytes = bytes(pkt[TCP].payload) # 转换为Wireshark风格的ASCII显示 ascii_payload = ''.join([chr(b) if 32 <= b <= 126 else '.' for b in payload_bytes]) print(f"[TCP Port 5900] ASCII Payload: {ascii_payload}") # 执行捕获 captured_pkts = sniff(filter="tcp port 5900", iface="eth0", prn=tcp_ascii_prn, count=20)
处理已捕获的数据包
如果已经完成捕获(数据包存在captured_pkts变量中),可以批量转换输出:
for idx, pkt in enumerate(captured_pkts): if TCP in pkt: payload_bytes = bytes(pkt[TCP].payload) ascii_payload = ''.join([chr(b) if 32 <= b <= 126 else '.' for b in payload_bytes]) print(f"Packet {idx+1} ASCII Payload: {ascii_payload}")
补充说明
- 若需要同时查看协议结构和ASCII payload,可以在自定义
prn函数中同时调用pkt.show()和上述ASCII转换逻辑 - 针对UDP等其他协议,只需替换对应的协议层(比如
from scapy.layers.inet import UDP,判断UDP in pkt)即可复用字符转换逻辑
内容的提问来源于stack exchange,提问作者João silva
相关产品推荐
相关产品推荐

