背景:我正在自学数据包嗅探.我在一个 shell中运行一个非常简单的服务器,从另一个shell中运行telnet,然后尝试不同的方法来嗅探流量.当我使用原始套接字(IPPROTO_TCP)时,我会捕获我发送的
(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下工作.
>有点令人惊讶的是,在wlan0上捕获时,如果它们实际上是通过您的Wi-Fi设备发送的,则您看不到发送的数据包.您是否将它们发送到Wi-Fi网络上的其他计算机?例如,如果您将它们发送到计算机上的其他进程,它们将显示在lo上,而不是显示在wlan0上(如果您将它们发送到Wi-Fi网络上的其他计算机,而不是其他进程)你的机器,它们不会出现在 – 不,所有流量最终都不会通过环回接口).>从pcap_findalldevs()获取的地址列表不是您可以在该接口上捕获的地址列表,它只是系统为该接口提供的网络地址列表.您无法选择要捕获的地址 – 它可以捕获所有地址.您捕获的是接口,而不是地址.
> Libpcap与原始套接字不同;它为您提供的低层报头比发送或接收的数据以及该数据更低.对于以太网设备,您将看到以太网报头;对于Wi-Fi设备,您看到的内容取决于您所使用的操作系统和您选择的标头(在Linux上,您正在使用的是,除非您在“监控模式”下捕获,否则您可能会看到以太网标头,在这种情况下,你会看到Wi-Fi标头或一些“无线电”标头,如 radiotap标头,然后是Wi-Fi标头);对于“任何”设备,你会看到“Linux cooked header”;等等.在调用pcap_open_live()之后,你需要调用pcap_datalink()来找出接口的头类型;请参阅 the list of link-layer types(pcap_datalink()将返回DLT_值,如此处所列;不要假设给定的数字与DLT_值相同,与名称的DLT_值进行比较).