如何在 mac80211 中使用数据包注入

mac80211 现在允许从用户空间将任意数据包注入到任何监听模式接口中。您注入的数据包需要按以下格式组成

[ radiotap header  ]
[ ieee80211 header ]
[ payload ]

radiotap 格式在 ./Documentation/networking/radiotap-headers.rst 中讨论。

尽管目前定义了许多 radiotap 参数,但大多数参数仅在接收的数据包上才有意义。以下信息从 radiotap 标头中解析,并用于控制注入

  • IEEE80211_RADIOTAP_FLAGS

    IEEE80211_RADIOTAP_F_FCS

    FCS 将被移除并重新计算

    IEEE80211_RADIOTAP_F_WEP

    如果密钥可用,则帧将被加密

    IEEE80211_RADIOTAP_F_FRAG

    如果帧长度超过当前分片阈值,则将被分片。

  • IEEE80211_RADIOTAP_TX_FLAGS

    IEEE80211_RADIOTAP_F_TX_NOACK

    即使帧是单播帧,也应发送帧而不等待 ACK

  • IEEE80211_RADIOTAP_RATE

    传输的传统速率(仅适用于没有自己速率控制的设备)

  • IEEE80211_RADIOTAP_MCS

    传输的 HT 速率(仅适用于没有自己速率控制的设备)。还会解析一些标志

    IEEE80211_RADIOTAP_MCS_SGI

    使用短保护间隔

    IEEE80211_RADIOTAP_MCS_BW_40

    以 HT40 模式发送

  • IEEE80211_RADIOTAP_DATA_RETRIES

    当使用 IEEE80211_RADIOTAP_RATE 或 IEEE80211_RADIOTAP_MCS 时的重试次数

  • IEEE80211_RADIOTAP_VHT

    VHT mcs 和传输中使用的流数(仅适用于没有自己速率控制的设备)。还会解析其他字段

    标志字段

    IEEE80211_RADIOTAP_VHT_FLAG_SGI:使用短保护间隔

    带宽字段
    • 1:使用 40MHz 通道宽度发送

    • 4:使用 80MHz 通道宽度发送

    • 11:使用 160MHz 通道宽度发送

注入代码还可以跳过所有其他当前定义的 radiotap 字段,从而方便直接重放捕获的 radiotap 标头。

这是一个有效的 radiotap 标头示例,定义了一些参数

0x00, 0x00, // <-- radiotap version
0x0b, 0x00, // <- radiotap header length
0x04, 0x0c, 0x00, 0x00, // <-- bitmap
0x6c, // <-- rate
0x0c, //<-- tx power
0x01 //<-- antenna

ieee80211 标头紧随其后,例如如下所示

0x08, 0x01, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x13, 0x22, 0x33, 0x44, 0x55, 0x66,
0x13, 0x22, 0x33, 0x44, 0x55, 0x66,
0x10, 0x86

最后是有效负载。

在组成数据包内容后,通过 send()-ing 将其发送到处于监听模式的逻辑 mac80211 接口。也可以使用 Libpcap(这比完成将套接字绑定到正确接口的工作更容易),如下所示:

ppcap = pcap_open_live(szInterfaceName, 800, 1, 20, szErrbuf);
...
r = pcap_inject(ppcap, u8aSendBuffer, nLength);

您还可以在此处找到指向完整注入应用程序的链接

https://wireless.wiki.kernel.org/en/users/Documentation/packetspammer

Andy Green <andy@warmcat.com>