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