【问题标题】:Libpcap radio tap packetsLibpcap 无线电分路数据包
【发布时间】:2015-09-07 17:39:17
【问题描述】:

我正在尝试在监控模式下捕获和处理 802.11 流量。我可以用 tcpdump 捕获它,但我无法用 libpcap 处理它。然后我需要将所有数据包传递给深度数据包检测方法,该方法对以太网数据包非常有效。所以我的问题是我可以打开转储文件,读取无线电分接头头并检查它是否与wireshark显示的长度相同。之后,我尝试读取以太类型并得到一些未知值。我找不到有关返回的 0x4500 的任何信息,所以我假设我应该将指针移动到其他地方,但我不熟悉这种类型的编程,我问是否有人可以检查我的 cap 文件和代码以便告诉我怎么了?我的观点是要知道数据和标头在数据包中的位置,以便将数据发送到 DPI。

附:我今天在这个问题上坐了 10 个小时,昨天坐了大约 14 个小时。我已经做了很多谷歌搜索。请帮帮我。

我服务器上的文件:

上限: click

代码: click

【问题讨论】:

  • 您检查过所有其他结构吗?例如您的 wifi_header 与wireshark 解码的IEE802.11 协议完全不匹配,它直接位于radiotap 标头之后。 0x4500 也可能来自 IP 标头(直接在 ethertype 字段之后),因此您可能在某处偏离了 2 个字节。
  • 谢谢您的回复 :) 都是因为“size_80211 += 2;”。现在我可以看到IP了。明天早上我会检查这段代码是否适用于 DPI。再来一次谢谢;)
  • 因为size_80211 += 2;,你没有偏离 2 个字节,因为结构填充,你偏离了。看我的回答;删除 size_80211 += 2; 只会补偿 QoS 帧的错误 LLC 标头长度,而不是非 QoS 帧,因为您首先没有添加额外的 2 个字节。

标签: c wireless pcap libpcap packet-capture


【解决方案1】:

LLC 标头:

struct snap_llc_header           
{
    u_int8_t    dsap; 
    u_int8_t    ssap;
    u_int8_t    ctl;
    u_int16_t   org; 
    u_int8_t    org2;
    u_int16_t   ether_type; /* ethernet type */              
};

错了。默认情况下,C 编译器会尝试在适当的边界上正确对齐超过 1 个字节的整数和浮点值;这意味着u_int16_t 值将在 2 字节边界上对齐,并添加填充。

因此,结构实际上看起来像:

struct snap_llc_header           
{
    u_int8_t    dsap; 
    u_int8_t    ssap;
    u_int8_t    ctl;
    u_int8_t    pad1;
    u_int16_t   org; 
    u_int8_t    org2;
    u_int8_t    pad2;
    u_int16_t   ether_type; /* ethernet type */              
};

它将比实际的 802.2 LLC+SNAP 标头长 2 个字节。

只适用于 GCC 和兼容 GCC 的编译器的快速而简单的解决方法是将结构标记为“已打包”,这样值就不会对齐:

struct snap_llc_header           
{
    u_int8_t    dsap; 
    u_int8_t    ssap;
    u_int8_t    ctl;
    u_int8_t    pad1;
    u_int16_t   org; 
    u_int8_t    org2;
    u_int8_t    pad2;
    u_int16_t   ether_type; /* ethernet type */              
} __attribute__((packed));

如果您想在支持 GCC __attribute__((packed)) 扩展的编译器上进行这项工作,则需要做更多的工作。

(另请注意,您的代码假设它在 little-endian 机器上运行 - 如果您在个人计算机上运行它,它可能是,但如果您在非 x86 和非 x86 上运行它-ARM 服务器,可能不是。它还假设它可以安全地引用未对齐的数据 - 如果您在 SPARC 机器以外的其他设备上运行它,它可能可以,但如果您在 SPARC 机器上运行它机器,它不能。修复这需要更多的工作。)

(另一个潜在问题是,如果 802.11 帧是从 Atheros 网络设备捕获的,则 802.11 标头和有效负载之间可能会有一些填充;请参阅“帧在 802.11 标头和有效负载之间有填充(到 32 位边界)”标志在the radiotap flags field。不幸的是,这将需要你解析radiotap头。)

(如果您想处理其他的数据包而不是带有 SNAP 标头的数据帧,则需要检查 DSAP 和 SSAP,如果它们都不是 0xAA,则处理它们没有SNAP头的3字节OUI和2字节协议ID。如果它们都是都是0xAA,注意2字节协议ID是以太网类型仅当 OUI 的所有三个字节都为零时。)

【讨论】:

  • 谢谢@Guy Harris!我终于可以监控我的整个网络了 :) pcap 社区对每个问题的响应速度非常棒;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2011-02-05
  • 2013-05-23
  • 2015-01-27
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多