使用 libpcap 进行无线数据包注入

Wireless packet injection using libpcap

我已经尝试通过 libpcap 将数据包注入我的无线接口已有一段时间了。当我检查来自同一接口的数据包时,我能够看到相同的数据包,但没有其他接口或机器能够获取数据包。

为了证明我的意思,这里是我使用的一小段代码:

u_char RADIOTAP_WRAPPER[] = {
    0x00,                   // it_version
    0x00,                   // padding
    0x0a, 0x00,             // length
    0x00, 0x00, 0x80, 0x00, // IEEE80211_RADIOTAP_TX_FLAGS
    0x00, 0x08,             // no-ack required
};

u_char my_packet[] = {
    // Some custom data of mine that I want to send (and no, I don't want to use IEEE 802.11
};

u_char *complete_packet; // Concatenate the header and the my_packet data and place it here (skipping that code for brevity)

pcap_sendpacket(handle,complete_packet,complete_packet_size);

数据包创建正确,如果我 运行 在同一设备上使用 pcap_next 的接收器(在我的例子中是 wlan0),它工作得很好。但是,如果我在附近的设备上使用 wlan0,或者在我自己的设备上使用 wlan1,则数据包丢失。问题不在于无线 space 中的其他数据包,而是这些数据包似乎根本没有进入 space 的事实。他们似乎卡在同一个界面中。

我可能在 radiotap header 中遗漏了一些特定的标志吗?还有别的吗?

PS:我做自定义数据格式只是出于教育原因。我宁愿没有 IEEE 802.11 header 因为它似乎违背了我计划构建的东西(一种从任何地方发送和接收数据包的方式 w/o 需要知道你是谁发送至)。因此,我宁愿 "You should not be making your own packet header types etc" 这样的答案不存在。谢谢:)

如果您希望 802.11 网络接口读取您的数据包,则不能省略 802.11 header。当一个接收网络接口试图读取你的数据包时,它会检查它是否是一个接收者(直接,或广播,或者是否设置为混杂模式)。此外,802.11 具有循环冗余校验 (CRC) 来验证没有发生传输错误。如果它期望读取 CRS 的地方不是正确的哈希值,接收方将丢弃你的数据包。

我不确定您是否真的在空中发送数据包。您应该能够通过 运行 接收器上的嗅探器来检查这一点,您要为其设置监控模式、混杂模式以及读取未通过 CRC 的数据包。