wifit3 WlanFrameParser解析器:纯Python解析802.11帧的完整实现
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
wifit3 是一款纯 Python 实现的跨平台无线网络扫描工具(可理解为"USB 版 Wifite"),它的核心组件WlanFrameParser 解析器位于 src/wifit3/dot11/parser.py,负责把 USB 网卡收到的原始 802.11 字节流(MPDU)解析成带类型的结构化数据包,是整条"抓包 → 解析 → 攻击面识别"数据链路的起点。这篇文章带你完整拆解它的实现思路。
为什么需要 WlanFrameParser 解析器
多数无线安全工具依赖 Scapy 等第三方库来解析 802.11 帧。wifit3 走的是另一条路:不引入任何外部解析依赖,仅用 Python 标准库(struct+ 字节切片)就完成了 802.11 帧的完整解析。好处很直接:
- 🚀 零依赖、跨平台(Windows / Linux / macOS 同一套代码)
- 📦 体积小,随芯片驱动一起打包不臃肿
- 🔍 解析规则完全可控,注释里逐条对应 IEEE 802.11 规范
解析产物是 src/wifit3/dot11/packet.py 中定义的数据类族:Packet(基类)→BeaconPacket、EapolPacket、WepDataPacket、AssocRequestPacket、AuthPacket、DeauthPacket、ProbeReqPacket等,每种帧类型一个类,字段即属性,上游模块直接取用。
解析全流程:四步流水线
对外只有一个入口方法 parse_80211_frame:输入原始帧字节 + RSSI,输出对应的Packet子对象(解析不了就返回None)。内部按四步走:
第一步:结构预检,先过滤"噪音"
USB 监控模式下收到的数据流里混着大量 DMA 填充、损坏字节。_is_valid_frame 在正式解析前做廉价检查:
| 检查项 | 目的 |
|---|---|
| 帧长 ≥ 24 字节 | 802.11 最小头长度 |
| 协议版本必须为 0 | 拒绝垃圾字节 |
| 管理帧:IE 区首标签必须是 Tag 0(SSID)、Tag 1(速率) | 严格标签序校验,挡掉错位数据 |
| 数据帧:地址 2 不得为全零/广播 | 发信地址噪声过滤 |
第二步:提取帧类型与 MAC 地址
从 2 字节 Frame Control 字段解出帧类型(管理/控制/数据)与子类型,再按 ToDS/FromDS 位组合把三个 MAC 地址(addr1/2/3)映射成dest / source / bssid语义——这是 802.11 帧解析里最容易写错的一步,四种方向组合(客户端→AP、AP→客户端、Ad-hoc、WDS)各有归属,其中四地址 WDS 帧直接拒绝解析。
第三步:管理帧细解析——扫出 AP 的全部"底牌"
_parse_mgmt 按子类型分发:
- Beacon / Probe Response→ 调用 _parse_tags 遍历信息元素(IE),产出
ssid、channel、encryption、WPA3/过渡模式标志、PMF、WPS 厂商与型号信息,以及供后续复用的原始 RSN IE(rsn_ie_raw) - Probe Request→ 提取客户端探测的 SSID
- (Re)Assoc Request→ 提取客户端选中的 AKM 套件(从 RSN IE 第一个套件读出)
- Auth / Assoc Resp / Deauth→ 解出状态码与离开原因码
其中 RSN IE 的解析 _parse_rsn_ie 逐字段对应 802.11-2020 §9.4.2.24:组密码、成对密码列表、AKM 套件列表、MFPC/MFPR 位,最终拼出 airodump 风格的加密标签,如WPA2-PSK-CCMP、WPA3-SAE-CCMP、WPA2/WPA3-PSK+SAE-CCMP(过渡模式)。
第四步:数据帧细解析——握手帧与 WEP 数据帧
_parse_data 先按 QoS Control / HT Control 位修正头部长度(24/26/28 字节),再判断两类高价值帧:
- EAPOL 四路握手:_parse_eapol 用滑动窗口在头后 16 字节内搜索 LLC/SNAP/EAPOL 特征签名(容忍 4 字节对齐填充),然后按 Key Descriptor 的固定偏移提取
key_info、replay_counter、nonce、mic、Key Data,并由 _classify_eapol_msg 依据 ACK/MIC/INSTALL 三位组合把帧归类为M1/M2/M3/M4;M1 帧还会从 Key Data 里提取PMKID KDE(16 字节 PMKID),供 PMKID 收割任务直接使用 - WEP 数据帧:通过 Key ID 字节的 ExtIV 位区分 WEP 与 TKIP/CCMP,提取 IV、KeyID 和前 16 字节密文,供 WEP 破解流程消费
快速上手:一个调用看全貌
from wifit3.dot11.parser import WlanFrameParser packet = WlanFrameParser.parse_80211_frame(raw_mpdu, rssi=-55) if packet is not None: print(packet.type, packet.ssid, packet.encryption, packet.rssi)解析器是纯函数式的类方法集合:无状态、不碰硬件,任何拿得到原始 MPDU 字节的场景(网卡驱动、pcap 回放脚本)都能直接复用。项目里的 scripts/porting/verify_pcap.py 等芯片验证脚本就是这样用它来离线回放并校验抓包的。
它如何融入整体架构
WlanFrameParser被全部 20+ 个 USB 芯片驱动的接收端统一调用,是各芯片 RX 路径汇聚后的"公共解析层",例如:
- Atheros AR9271:src/wifit3/chips/ar9271_v2/driver.py
- MediaTek MT7610U:src/wifit3/chips/mt76x0u/rx.py
- MediaTek MT7921AU(Panda PA09):src/wifit3/chips/mt7921au/driver.py
驱动只负责"把原始帧 + RSSI 拿出来",帧语义全部交给解析器——这也意味着新增芯片支持时无需重写任何解析逻辑,只需保证交付原始 MPDU 即可。解析结果随后流入 src/wifit3/wlan/sink.py 的汇聚层,驱动 AP 表、客户端表、EAPOL 聚合与各类攻击战役(WPA 握手、WPS PIN、WEP、PMKID 收割)。
用测试用例学习解析器
项目为解析器提供了高覆盖的单元测试,是最好的"可执行文档":
- 📄 tests/wlan/test_parser.py:内置 Beacon 构造器,逐字段测试 RSN IE、WPA 厂商 IE、WPS IE、加密标签与严格标签序校验(注意 _build_beacon 如何保证 Tag 0/Tag 1 顺序)
- 📄 tests/wlan/test_eapol.py:四路握手各消息编号的边界与字段提取
- 📄 tests/dot11/test_ie_walkers.py:IE 遍历器 iter_information_elements 的各类畸形输入
想深入某个芯片的解析细节,还可以结合 docs/porting/METHODOLOGY.md 与 docs/SUPPORTED-HARDWARE.md 一起阅读。
小结
wifit3 的 WlanFrameParser 用不到 800 行纯 Python 代码,覆盖了 802.11 帧解析的完整闭环:噪声过滤 → 帧头解析 → 管理帧 IE 遍历 → EAPOL/WEP 数据帧深挖,并通过类型化的Packet数据类向整个工具链输出结构化语义。如果你想给自己的无线项目加一个轻量解析器,这套"结构预检 + 分帧细解析 + 数据类输出"的实现思路非常值得借鉴。
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考