从特定客户端捕获数据包UDP(Python)

时间:2013-01-07 20:58:42

标签: python sockets network-programming

我有一个关于从特定客户端嗅探数据包的问题。我正在运行一个非常简单的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”,它是否可以处理每个数据包?感谢

2 个答案:

答案 0 :(得分:1)

您已经获得了数据。但是,你得到的是UDP数据包和源地址;如果你想要完整的原始数据包,使用IPv4和UDP标头,那就不同了。

在某些平台上,您可以将普通UDP套接字设置为IP_HDRINCL,或者还有其他等效套接字。如果您这样做,每个recvfrom都会在数据中包含标题,因此您已经拥有了所需的一切。

在其他平台上,您可以使用SOCK_RAW代替SOCK_DGRAM。使用原始套接字可以做些什么大不相同。在许多Unix平台上,您可以将IPPROTO_UDPSOCK_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)

是的,有可能。这就是你的程序实际上已经做到的。