我试图使用scapy sniff函数嗅探UDP数据包,我在Looback接口发送数据包,发送代码很简单如下:
from socket import *
IPv4 = "127.0.0.1"
Port = 45943
ClientSock = socket(AF_INET, SOCK_DGRAM)
while True:
MESSAGE = raw_input()
ClientSock.sendto(MESSAGE, (IPv4, Port))
但是当我运行时(在导入scapy后的另一个终端选项卡中):
a = sniff(iface="lo0", count = 5)
我得到以下结果:
>>> a.nsummary()
0000 Raw
0001 Raw
0002 Raw
0003 Raw
0004 Raw
虽然我应该得到UDP数据包!,任何人都可以指出我在这里缺少的任何东西。 感谢
答案 0 :(得分:3)
无法猜测数据链接类型(interface = lo0 linktype = 0)
该消息转换为“Scapy不理解DLT_NULL链路层头类型,如* BSD和OS X中的环回设备所使用的,因此它不支持* BSD和OS X上的环回设备”
如果你想在OS X上使用Scapy来捕获环回设备,那么你运气不好,除非并且直到Scapy被增强以处理DLT_NULL。 (DLT_NULL不是 难以处理的,所以大概是不处理的唯一原因是大多数人在环回设备上使用它是在Linux上这样做的环回设备上的链路层头类型值是DLT_EN10MB,即以太网,所以没有人愿意解决它。我会看看我是否可以使它工作,如果是的话,给它们发送一个补丁。)
答案 1 :(得分:0)
一些建议。
您可以使用
之类的内容打印出有关各个数据包的更多信息,而不是a.nsummary()a[1].show()
a[1].show2()
hexdump(a[1])
检查第一个数据包。 2)您可以强制协议解码为特定类型的数据包格式。例如,可以使用
强制RAW_IP数据包捕获(链路层报头类型= 101)为IPv6conf.l2types.register(101, IPv6)
如果要在UDP之上添加新图层,可以根据使用的端口添加新的剖析器。