wifit3 Driver ABC抽象基类:扩展新芯片必须实现的6个方法
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
wifit3 是一款仅依赖 USB 无线网卡、跨平台的 Wi-Fi 审计工具。它的硬件适配层由一个名为Driver的 ABC 抽象基类统一约束——想为 wifit3 扩展新芯片,核心工作就是继承这个基类并实现 6 个抽象方法。本文带你完整看懂这张“驱动契约”。
为什么 Driver 是 wifit3 的硬件核心
传统 Wi-Fi 工具依赖系统内核驱动,而 wifit3 选择了一条不同的路:用纯 Python 直接通过 USB 总线对话无线芯片,绕开各系统的驱动版本问题。因此每个受支持的芯片(Realtek RTL8187、MediaTek MT7610U、Ralink RT3070 等 20 多款)都在src/wifit3/chips/下有一个独立目录,目录里的driver.py全部继承同一个抽象基类:
- 基类定义:driver.py
- 目录约定(每个芯片的
transport.py、rx.py、tx.py等分层模块):AGENTS.md - 已支持的 USB 网卡清单:SUPPORTED-HARDWARE.md
这个设计的直接好处是:UI 扫描器、战役模块(WPA 握手捕获、WPS、EvilTwin)只需面向Driver这一张接口编程,芯片差异被完全封装在各自目录内。
先认识“免费部分”:类属性与具体方法
抽象基类不只要求你实现方法,还自带一批开箱即用的能力:
| 类别 | 成员 | 说明 |
|---|---|---|
| 必选类属性 | SUPPORTED_CHANNELS | 芯片可调谐的所有信道(2.4G 为 1..14,5G 为 36..165),缺失会在子类定义时直接报TypeError |
| 可选类属性 | FAKE_MAC | 芯片硬件自动 ACK 能力(NONE/FIXED_MAC/SPOOFABLE) |
| 可选类属性 | CONFLICTING_LINUX_MODULES | Linux 下需禁用的内核模块名 |
| 免费具体方法 | inject_frame()/inject_frame_slow_retry() | 发送原始 802.11 帧,带 ACK 探测与软件重传 |
| 免费具体方法 | enable_rx_acks()/record_ack()/acks_seen() | ACK 计数台账,供慢速重传判定送达 |
也就是说,子类只负责“把芯片点亮并收发帧”,重传策略、ACK 统计这些通用逻辑基类已经写好。
必须实现的 6 个抽象方法
Python 会在实例化时强制校验:少实现一个都无法创建驱动对象。以下 6 个方法是每张网卡的“上岗证”:
1️⃣from_usb_device(dev, id_entry)—— 从 USB 设备构造驱动
类方法。发现模块通过 VID:PID 匹配到芯片后调用它,完成传输层包装与实例初始化。参考 rtl8187/driver.py 中的实现。
2️⃣register_rx_callback(cb)—— 注册收包回调
注册一个接收“每帧解析后 Packet”的回调,扫描器看到的每条信标都来自这里。
3️⃣register_disconnect_callback(cb)—— 注册掉线回调
RX 读取线程遇到致命错误(拔卡、USB 断开)时触发,供 UI 即时刷新。
4️⃣connect(progress_cb)—— 启动硬件(bring-up)
最重的一个方法:占用 USB 接口、读 EEPROM/EFUSE、冷启动或温启动、进入监听模式、启动 RX 循环,并沿途通过progress_cb报告 0..1 的进度。失败时应抛出BringUpError(stage, detail),而不是静默返回。
5️⃣set_channel(channel, scan)—— 调谐信道
切到指定信道;scan=True表示这是扫描中的临时跳频,允许走更轻量的路径。信道列表必须与SUPPORTED_CHANNELS保持一致。
6️⃣close()—— 停止并释放资源
停止 RX 循环、释放 USB 接口,让系统可以安全地重新接管设备。
私有钩子:把“收发”拆开实现
除了 6 个公开抽象方法,基类还预留了 4 个私有钩子供你填充具体行为,公共方法会替你编排好流程:
_inject_frame(frame_bytes):构建芯片 TX 描述符,经 bulk-OUT 发送一次;_stamp_tx_seq(frame_bytes):打 802.11 序列号(芯片硬件自己编号的芯片可原样返回);_enable_rx_acks()/_disable_rx_acks():让芯片把 ACK 控制帧放进 RX 流(有些芯片默认就放行,写一个“有文档说明的空操作”即可)。
这种“公共方法编排 + 私有钩子填充”的模式,是理解 wifit3 芯片移植风格的关键。
扩展新芯片的落地步骤
按 AGENTS.md 的“Adding a New Chipset”一节,完整流程只有五步:
- 新建
src/wifit3/chips/<name>/包,至少包含__init__.py、driver.py、transport.py、constants.py(需上传固件的芯片再加firmware.py); - 在
__init__.py中声明SUPPORTED_IDS(VID:PID 列表)与延迟加载的import_driver(),且不要在模块顶层导入driver.py; driver.py继承Driver,定义SUPPORTED_CHANNELS,实现上文 6 个方法 + 4 个私有钩子;- 仅在 setup key 与目录名不一致、或两个包共享 VID:PID(如 Realtek 主线/DKMS 对)时,才需在 device/manager.py 的
_FAMILIES中加一行,其余注册全自动; - 在驱动旁放一份芯片移植参考文档(模板见 CHIP-DOC.md)。
配套的方法论文档强烈建议精读:METHODOLOGY.md 讲如何以“内核 C 源码 + 录制的 USB 抓包”双基准做移植,CODE-STYLE.md 与 GOTCHAS.md 分别约定代码风格与历史踩坑。每款芯片的tests/chips/<芯片>/test_ack_detect.py等测试也是很好的行为参照。
小结
DriverABC(driver.py)是 wifit3 硬件层的统一契约:1 个必选类属性SUPPORTED_CHANNELS+ 6 个抽象方法 + 4 个私有钩子;- 基类免费提供了帧注入、ACK 台账、慢速重传等通用能力,子类专注芯片细节;
- 发现机制基于
pkgutil扫描 + 轻量__init__.py,新增芯片无需改注册表,真正做到“放一个目录即插即用”。
理解了这张契约,你既可以快速判断一张 USB 网卡能否被支持,也能动手为 wifit3 移植下一款芯片。
【免费下载链接】wifit3Wifite but USB-only & cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考