如何在 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>