如何将Scapy捕获的Ether帧转换为字节格式
解决Scapy捕获数据包转字节的报错问题
错误原因
你用sniff(iface='lo', count=1)得到的data是PacketList类型(类似列表的容器,哪怕只抓1个包),而raw()函数需要传入单个的数据包对象(比如Ether、IP这类),直接对PacketList调用raw()就会触发TypeError。
正确写法
要获取单个数据包的字节内容,只需要从PacketList里取出第一个元素(索引0)再调用raw():
from scapy.all import * while True: # 捕获1个包,得到PacketList packet_list = sniff(iface='lo', count=1) # 取出第一个包,转成字节 packet_bytes = raw(packet_list[0]) # 可以直接存储或打印 print(packet_bytes)
你的两种写法问题分析
- 写法一:和最初的错误一样,直接对
sniff返回的PacketList用raw(),没取单个包,所以报错。 - 写法二:
prn参数是用来处理每个捕获到的包的回调,这里lambda x: raw(x)会把每个包转成字节,但sniff返回的依然是原始的PacketList,所以print(data)输出的还是PacketList,不是字节数据。如果要通过prn存字节,可以改成这样:
from scapy.all import * captured_bytes = None def save_packet_bytes(packet): global captured_bytes captured_bytes = raw(packet) while True: sniff(iface='lo', count=1, prn=save_packet_bytes) # 现在captured_bytes里就是字节形式的数据包 print(captured_bytes)
内容的提问来源于stack exchange,提问作者AndAsh
相关产品推荐
相关产品推荐

