使用libpcap的无线数据包注入

Wireless packet injection using libpcap

本文关键字:数据包 注入 libpcap 使用      更新时间:2023-10-16

我已经尝试通过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,则数据包丢失。问题不在于无线空间中的其他数据包,而在于这些数据包似乎根本没有进入太空。它们似乎被卡在同一个界面中。

无线电报标头中是否有我可能丢失的特定标志?还有别的吗?

附言:我做自定义数据格式只是出于教育原因。我宁愿不使用IEEE 802.11报头,因为它似乎违背了我的计划(一种从任何地方发送和接收数据包的方式,不需要知道你要发送的人)。因此,我更希望像"你不应该制作你自己的包头类型等"这样的答案不在那里。感谢:)

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

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