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

基于Scapy的WiFi嗅探器如何获取AP的真实信道?

如何用Scapy获取AP的真实信道

好问题!这确实是WiFi嗅探中很容易踩的一个误区——很多人会误以为捕获到的Beacon帧里的信道字段和网卡当前监听信道绑定,但其实不是这样的。下面我来一步步帮你解决这个问题:

先澄清关键误区

你提到的“信道字段仅显示捕获数据包时WiFi网卡所在的信道”是错误的认知。在802.11 Beacon帧的Fixed Parameters区域,有一个Current Channel字段,这个值是AP主动广播的它正在使用的真实信道,和你的WiFi网卡当前处于哪个信道完全无关。你能在非AP信道抓到该帧,只是因为2.4GHz频段的信道重叠(比如信道1和信道4有信号重叠),但帧里的信道值始终是AP实际工作的信道。

用Scapy直接提取AP的真实信道

只要你能捕获到AP的Beacon帧,就能直接从帧里拿到真实信道。下面是一个简单的Scapy代码示例:

from scapy.all import *

def process_beacon(pkt):
    # 筛选出Beacon帧(子类型为8的Dot11帧)
    if pkt.haslayer(Dot11Beacon):
        # 获取AP的BSSID(硬件地址)
        ap_bssid = pkt[Dot11].addr2
        # 获取AP广播的SSID
        ap_ssid = pkt[Dot11Elt].info.decode()
        # 提取AP的真实信道
        real_channel = pkt[Dot11Beacon].current_channel
        print(f"AP名称: {ap_ssid} | BSSID: {ap_bssid} | 真实信道: {real_channel}")

# 启动嗅探(确保网卡已开启监听模式,替换成你的网卡名称,比如wlan0mon)
sniff(iface="wlan0mon", prn=process_beacon, monitor=True)

应对信道重叠的验证方案

虽然Beacon帧里的信道值是准确的,但如果你想彻底确认(比如排查少数异常AP),可以让网卡遍历所有信道进行扫描,收集同一AP的所有Beacon帧信道值,验证一致性:

import time
import os
from scapy.all import *

# 要扫描的信道列表(2.4GHz为1-14,5GHz可添加36、40、44等信道)
target_channels = list(range(1, 15))
# 存储AP的信道信息,key为BSSID
ap_channel_data = {}

def capture_beacon(pkt):
    if pkt.haslayer(Dot11Beacon):
        bssid = pkt[Dot11].addr2
        ssid = pkt[Dot11Elt].info.decode()
        channel = pkt[Dot11Beacon].current_channel
        
        if bssid not in ap_channel_data:
            ap_channel_data[bssid] = {"ssid": ssid, "channels": []}
        ap_channel_data[bssid]["channels"].append(channel)

# 遍历每个信道进行扫描
for chan in target_channels:
    # 设置网卡到当前信道
    os.system(f"iwconfig wlan0mon channel {chan}")
    print(f"正在扫描信道 {chan},持续5秒...")
    # 嗅探5秒
    sniff(iface="wlan0mon", prn=capture_beacon, timeout=5, monitor=True)

# 整理并输出结果
print("\n=== AP真实信道汇总 ===")
for bssid, data in ap_channel_data.items():
    # 统计出现次数最多的信道(正常情况下所有值应该一致)
    true_channel = max(set(data["channels"]), key=data["channels"].count)
    print(f"AP: {data['ssid']} ({bssid}) | 真实信道: {true_channel}")

注意事项

  • 必须确保你的WiFi网卡已经切换到监听模式(Monitor Mode),否则无法捕获Beacon帧。
  • 如果需要扫描5GHz频段,记得把target_channels列表扩展为包含5GHz的信道号(比如36、40、44、48等)。
  • 极少数AP会启用自动信道切换功能,这种情况下你需要持续监听来跟踪信道变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:13:47