我有一个关于从特定客户端嗅探数据包的问题。我正在运行一个非常简单的UDP服务器,如下所示:
from socket import *
IPv4 = ""
Port = 54345
ServerSock = socket(AF_INET, SOCK_DGRAM) # UDP
ServerSock.bind((IPv4, Port))
print "Socket is ready to receive data.."
while True:
data, addr = ServerSock.recvfrom(1024) # buffer size is 1024 bytes
print data
我打算捕获到端口号(54345)的每个数据包并解析其标头值。我认为如果数据包保存到.pcap文件并且可能使用scapy来处理它们是可行的,但是一旦它到达使用“socket.recvfrom”,它是否可以处理每个数据包?感谢
答案 0 :(得分:1)
您已经获得了数据。但是,你得到的是UDP数据包和源地址;如果你想要完整的原始数据包,使用IPv4和UDP标头,那就不同了。
在某些平台上,您可以将普通UDP套接字设置为IP_HDRINCL
,或者还有其他等效套接字。如果您这样做,每个recvfrom
都会在数据中包含标题,因此您已经拥有了所需的一切。
在其他平台上,您可以使用SOCK_RAW
代替SOCK_DGRAM
。使用原始套接字可以做些什么大不相同。在许多Unix平台上,您可以将IPPROTO_UDP
与SOCK_RAW
一起使用,然后bind
使用普通的UDP地址和端口,尽管可能存在限制,并且它们在每个平台上都有所不同。例如,在OS X上,您必须是root用户才能创建原始套接字,并且只能将原始套接字绑定到单接口地址(意味着没有''
/ INADDR_ANY
/ {{1 }})。如果你谷歌的“SOCK_RAW Python”和“SOCK_RAW”,你应该能够找到你需要的东西。 (sockets module docs中的最后一个示例显示了如何在Windows上使用原始套接字。)
获得数据后,将其保存到'0.0.0.0'
文件并不难。格式记录在Wireshark Wiki的LibpcapFileFormat。如果您对stdlib pcap
模块有任何熟悉,那么应该很容易弄清楚如何编写这种格式。这是一个简短的样本:
struct
如果您不想自己这样做,我没有使用库来编写pcap文件的经验,但pcap_hdr = struct.pack('=IHHiIII',
0xa1b2c3d4, # magic number
2, 4, # pcap 2.4 format
0, # UTC timezone for timestamps
0, # "in practice, all tools set it to 0"
65535, # max packet length
228) # LINKTYPE_IPV4, or maybe you want LINKTYPE_RAW
pcapfile.write(pcap_hdr)
将是我看的第一个地方,然后是{{3 } python-libpcap
/ libpcap
的绑定。如果这些都不起作用,请查看PyPI。
如果所有这些听起来都超出了你,你可能不希望以这种方式做事。只需运行您的UDP服务器,并使用Wireshark捕获发送给它的所有数据包。
答案 1 :(得分:0)
是的,有可能。这就是你的程序实际上已经做到的。