背景:我正在自学数据包嗅探。我在一个shell中运行一个非常简单的服务器,从另一个shell中运行telnet,然后尝试不同的方法来嗅探流量。当我使用原始套接字(IPPROTO_TCP)时,我会捕获我发送的内容。我只捕获我发送的内容,而不是互联网。 libcap的行为让我困惑如下:
(1)首先,要检查它,我使用pcap_findalldevs捕获所有设备(也见下面的(2))。我发现wlan0很好。如果我使用
连接到“所有流量”(根据手册页)if ( !( pcap_handle = pcap_open_live(NULL, 4096, 1, 0, errbuf) ) )
我捕获了我发送的内容(加上更多内容,请参阅(3))。 当我尝试使用
连接到它时if ( !( pcap_handle = pcap_open_live("wlan0", 4096, 1, 0, errbuf) ) )
,对我来说这似乎是正确的方式,而不是'所有',我捕获了大量的一般流量,但我没有发送任何东西。想法?
(2)我首先找到使用pcap_findalldevs的所有设备。由于pcap_if_t结构可能包含多个元素,因此我将所有这些元素打印出来,以查看以下内容:
Devices found:
1. eth0 - None:
family: 17, address: 2.0.0.0
2. wlan0 - None:
family: 17, address: 3.0.0.0
family: AF_INET, address: 192.168.0.159
family: 10, address: 0.0.0.0
3. usbmon1 - USB bus number 1:
4. usbmon2 - USB bus number 2:
5. usbmon3 - USB bus number 3:
6. usbmon4 - USB bus number 4:
7. usbmon5 - USB bus number 5:
8. any - Pseudo-device that captures on all interfaces:
9. lo - None:
family: 17, address: 1.0.0.0
family: AF_INET, address: 127.0.0.1
family: 10, address: 0.0.0.0
我对此都很陌生。一些设备提供AF_INET(= IPv4),IPv6(10)和数据包(17)的捕获。当我连接到“wlan0”时,如何确保我连接到某些设备的“地址”?这与问题有关吗?
(3)使用原始套接字时,我真的只捕获我发送到服务器的内容。当我使用libcap时,我还会从打印的字节中捕获必须是互联网标题的内容。我对此都很陌生。如果有人可以详细说明我在这里捕获的是什么,我没有在原始套接字上捕获,这将是值得赞赏的。那些UDP或ICMP数据包,根据定义,我的IPPPROTO_TCP套接字无法捕获,这就是为什么我没有看到那些使用原始套接字的原因?
非常感谢。
编辑:我使用gcc / gdb组合在东芝上网本的Ubuntu 10.04下工作。
答案 0 :(得分:3)
wlan0
上进行捕获时,如果实际上是通过Wi-Fi设备发送的,则您看不到发送的数据包。您是否将它们发送到Wi-Fi网络上的其他计算机?例如,如果您将它们发送到计算机上的其他进程,它们将显示在lo
上,而不会显示在wlan0
上(如果您将它们发送到Wi-Fi上的其他计算机)网络,而不是机器上的其他进程,它们将不显示在lo
上 - 不,所有流量最终都不会通过环回接口。)pcap_findalldevs()
获取的地址列表 NOT 您可以在该界面上捕获的地址列表,它只是系统为该界面提供的网络地址列表。您无法选择要捕获的地址 - 它可以捕获所有地址。您可以在界面上捕获,而不是在地址上捕获。pcap_datalink()
后,您需要调用pcap_open_live()
来查找接口的标头类型;请参阅the list of link-layer types(pcap_datalink()
将返回DLT_
值,如下所示;不要假设给出的数字与DLT_
值相同,请与{ {1}}名称的值)。