【问题标题】:Confused by libcap (pcap) and wireless对 libcap (pcap) 和无线感到困惑
【发布时间】:2011-11-13 10:26:48
【问题描述】:

背景:我正在自学数据包嗅探。我在一个 shell 中运行一个非常简单的服务器,从另一个 shell 远程登录到它,然后尝试不同的方法来嗅探流量。当我使用原始套接字(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 时,我还从打印出的字节中捕获必须是 Internet 标头的内容。我对此完全陌生。如果有人可以详细说明我在这里捕获的我没有在原始套接字上捕获的内容,我将不胜感激。是那些 UDP 或 ICMP 数据包,根据定义,我的 IPPPROTO_TCP 套接字不会捕获,这就是为什么我没有看到使用原始套接字的那些?

非常感谢。

编辑:我在东芝上网本上的 Ubuntu 10.04 下工作,使用 gcc/gdb 组合。

【问题讨论】:

  • 抱歉,设备 p/o 的格式混乱。提交时看起来不错。
  • 那你为什么不编辑和修复它呢?

标签: c wireless pcap


【解决方案1】:
  1. 有点令人惊讶的是,在wlan0 上捕获时,如果它们实际上是通过您的 Wi-Fi 设备发送的,那么您看不到您发送的数据包。您是否将它们发送到您的 Wi-Fi 网络上的其他机器?例如,如果您将它们发送到计算机上的其他进程,它们将显示在 lo,而不是 wlan0(如果您将它们发送到 Wi-Fi 网络上的其他计算机,而不是到您机器上的其他进程,它们将不会显示在 lo - 不,所有流量最终都不会通过环回接口)。
  2. 您从pcap_findalldevs() 获得的地址列表不是您可以在该接口上捕获的地址列表,它只是系统为该接口提供的网络地址列表。您无法选择要捕获的地址 - 它会捕获所有地址。您在接口上捕获,而不是在地址上。
  3. Libpcap 与原始套接字不同;它为您提供比正在发送或接收的数据以及该数据的低层标头。对于以太网设备,您会看到以太网标头;对于 Wi-Fi 设备,您看到的内容取决于您所在的操作系统和您选择的标头(在您使用的 Linux 上,您可能会看到以太网标头,除非您在“监控模式”中捕获,在这种情况下,您将看到 Wi-Fi 标头或某些“无线电”标头,例如 radiotap 标头,然后是 Wi-Fi 标头);对于“任何”设备,您会看到“Linux 熟头”;等等。您需要在调用pcap_open_live() 后调用pcap_datalink() 以找出接口的标头类型;请参阅the list of link-layer typespcap_datalink() 将返回 DLT_ 值,如列表所示;不要假设给定的数字与 DLT_ 值相同,请按名称与 DLT_ 值进行比较)。

【讨论】:

  • 我转到了其他项目,但非常感谢。我在同一台机器上使用服务器和客户端,所以从你写的内容来看,我看到的是预期的,因此至少回答了我的一半问题。您显然对 pcap 有点或非常熟悉:您可以添加任何在线书籍资源来阅读这些重要细节吗?我很难用谷歌搜索它。我可能会暂时保持开放状态,但应该尽快接受您的回答。再次感谢。
  • 我所知道的没有 libpcap 书籍;唯一的东西是 pcap 手册页,在较新版本的 libpcap 中,各个函数的手册页,以及 the tcpdump.org home page's documentation section 指向的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2014-11-02
  • 1970-01-01
  • 2014-03-18
相关资源
最近更新 更多