1

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

4

2 回答 2

1

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

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

在其他平台上,您可以SOCK_RAW使用SOCK_DGRAM. 你可以用原始套接字做什么变化很大。在许多 Unix 平台上,您可以使用IPPROTO_UDPwith SOCK_RAW,然后bind使用普通的 UDP 地址和端口,尽管可能有限制,并且它们在每个平台上都不同。例如,在 OS X 上,您必须是 root 才能创建原始套接字,并且您只能将原始套接字绑定到单接口地址(意味着没有''/ INADDR_ANY/ '0.0.0.0')。如果你用谷歌搜索“SOCK_RAW Python”和“SOCK_RAW”,你应该能够找到你需要的东西。(套接字模块文档中的最后一个示例显示了如何在 Windows 上使用原始套接字。)

获得数据后,将其保存到pcap文件中并不难。该格式记录在Wireshark Wiki的LibpcapFileFormat中。如果您熟悉 stdlibstruct模块,应该很容易弄清楚如何编写这种格式。这是一个简短的示例:

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)

如果您不想自己这样做,我没有任何使用库编写 pcap 文件的经验,但scapy我会首先查看,然后是/的python-libpcap绑定。如果这些都不起作用,请检查 PyPI。libpcapWinPcap

如果所有这些听起来都超出了您的想象,那么您可能不想以这种方式做事。只需运行您的 UDP 服务器,并使用 Wireshark 捕获发送给它的所有数据包。

于 2013-01-07T23:07:00.227 回答
0

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

于 2013-01-07T21:05:53.390 回答