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

Scapy构造Dot11帧报错Layer [Dot11] not found如何解决

问题原因
  • 触发Layer [Dot11] not found报错的核心原因是:你捕获到携带HTTPRequest的报文并非802.11无线帧,不存在Dot11层。默认状态下,有线网卡、工作在managed模式的无线网卡抓取到的链路层报文为Ether以太网帧,只有将无线网卡切换为monitor模式,且指定监听该monitor模式网卡时,才能抓到带RadioTap、Dot11层的无线报文。
  • 你贴出的代码还存在基础语法问题:for循环行有多余缩进,运行时会直接抛出缩进错误。
修复方案
  1. 提前配置无线监听环境
    将用于抓包的无线网卡切换到monitor模式,并切换到目标HTTP请求所在的工作信道,否则无法捕获到对应的802.11格式HTTP报文。可以使用airmon-ng工具快速切换:
    airmon-ng check kill
    airmon-ng start wlan0
    
    执行完成后会生成名为wlan0mon的monitor模式网卡。
  2. 修正抓包逻辑,增加层合法性校验
    调用sniff时指定监听的monitor模式网卡,在判断HTTPRequest层之后,额外校验报文是否携带Dot11层,过滤掉非802.11格式的报文后再提取MAC地址构造响应帧。
  3. 修正代码缩进错误,对齐代码层级。

修复后的可运行参考代码:

import scapy.all as scapy
from scapy.layers.http import HTTPRequest
from scapy.layers.dot11 import RadioTap, Dot11

# 替换为你自己的monitor模式网卡名
IFACE = "wlan0mon"
packets = scapy.sniff(iface=IFACE, count=30)
for i in range(len(packets)):
    pkt = packets[i]
    # 同时校验HTTP层和Dot11层存在,再执行后续逻辑
    if pkt.haslayer(HTTPRequest) and pkt.haslayer(Dot11):
        dot11_frame = RadioTap()/Dot11(
            type = "Data",
            FCfield = "from-DS",
            addr1 = pkt[Dot11].addr2,
            addr2 = pkt[Dot11].addr1,
            addr3 = pkt[Dot11].addr1,
        )
        # 后续补充IP/TCP/HTTP响应层逻辑即可

补充说明:如果你的使用场景不是伪造无线环境下的HTTP响应,而是有线网络场景,不需要构造Dot11帧,直接基于Ether层构造以太网响应报文即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:48:28