如何在 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() 将其发送到处于监听模式的逻辑 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>