You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scapy中sniff()函数如何获取ASCII格式的原始字节数据?

解决Scapy sniff()获取ASCII格式原始字节数据的问题

Scapy默认的show()或summary()会按协议结构输出内容,不会自动将数据包的原始负载转换为Wireshark风格的ASCII格式,需要手动提取并处理负载字节来实现需求。

  • 核心思路:
    1. 检查数据包是否包含目标协议层(比如TCP),提取其payload字段的原始字节数据
    2. 将字节数据转换为可打印ASCII字符串,不可打印字符用.替代(和Wireshark的显示逻辑对齐)
    3. 将处理逻辑集成到sniff()的prn参数,或对捕获后的数据包批量处理

实时捕获时输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:55:09