Python数据包嗅探/捕获 - pcapy未捕获数据包

4 投票
1 回答
4362 浏览
提问于 2025-04-18 00:29

我把无线网络接口设置成了监控模式,这样我就能成功捕捉到网络数据包,并用Wireshark进行分析。我想用pcapyimpacket实现类似的功能。但我发现pcapy捕捉到的数据包和Wireshark不一样。我现在在2012年的Macbook Pro上运行Mac OS X 10.9,但在使用TP-LINK TL-WN722N无线USB适配器的Ubuntu上也遇到了同样的问题。

下面是我写的一个脚本,明显没有成功。虽然在Wireshark中能看到探测请求,但用pcapy却一个都没捕捉到。

import pcapy
import impacket

DECODER = impacket.ImpactDecoder.RadioTapDecoder()


def packet_handler(header, data):
   radio_packet = DECODER.decode(data)
   dot11 = radio_packet.child()
   if dot11.get_subtype() == impacket.dot11.Dot11Types.DOT11_SUBTYPE_MANAGEMENT_PROBE_REQUEST:
       management_base = dot11.child()
       if management_base.__class__ == impacket.dot11.Dot11ManagementFrame:
           print management_base.get_source_address(), management_base.get_destination_address()


p = pcapy.open_live("your_interface_here", 2000, 0, 1000)
p.loop(-1, packet_handler)

在这个例子中,en1处于监控模式。使用从Wireshark生成的pcap文件时,这个方法是有效的,只需把open_live改成open_offline就可以了:

p = open_offline('path_to_file')

我是不是没有正确设置pcapy

1 个回答

1

如果你在Wireshark中捕获了一些数据包,但不是所有的数据包都能看到,可以尝试开启混杂模式(这样可以捕获所有数据包,即使它们的校验和有问题):

1) 为pcapy设置混杂模式

promiscuous = True
p = pcapy.open_live("your_interface_here", 2000, promiscuous, 1000)

2) 为你的网络接口设置混杂模式。如果你不知道在Mac上怎么做,在Linux上可以这样操作:

os.system('sudo ifconfig eth0 promisc')

然后关闭并静音你的网络接口。

我在使用pcapy和铜缆以太网时也遇到过同样的问题。以上的方法对我解决了这个问题。

撰写回答