ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

wifit3 RX回调机制解析:WEP/WPS状态机如何绕开UI轮询实现低延迟抓包

2026/10/2 0:07:52 拓冰建站 浏览量
wifit3 RX回调机制解析:WEP/WPS状态机如何绕开UI轮询实现低延迟抓包 wifit3 RX回调机制解析WEP/WPS状态机如何绕开UI轮询实现低延迟抓包【免费下载链接】wifit3Wifite but USB-only cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3wifit3 是一款跨平台的纯 PythonWi-Fi 安全审计工具Wifite 的 USB 专用、跨平台重写版内置完整的 802.11 无线协议栈支持多网卡同时抓包、WPA 握手/PMKID 捕获、WPS 恢复与 WEP 破解。它的 WEP/WPS 攻击状态机之所以能在毫秒级内响应空口事件关键不在 UI而在一条推式的 RX 回调链路——网卡收到帧的瞬间事件直接推给等待它的状态机完全绕开 Textual 界面的轮询节奏。本文带你从回调注册一路追到状态机消费看懂这套低延迟设计的三层结构。为什么不用 UI 轮询做主数据通路很多终端工具的常见写法是主循环里每隔 50~100ms 调一次取包/取状态界面刷新和逻辑推进绑在同一个节拍上。问题在于延迟被刷新周期放大WPS 物理按钮按下后 AP 会立刻广播 M1 帧WEP 的 ChopChop 则需要伪造帧被 AP 接收并重播这一瞬间的响应轮询会把最敏感的几毫秒窗口磨平忙等浪费事件循环轮询期间事件循环被占用多网卡跳频、热插拔等并发任务都会被拖慢。wifit3 的做法是把收包和显示彻底解耦收包走 asyncio 回调pushUI 只读共享状态pull。界面快慢不影响攻击路径的延迟。第一层网卡驱动的 RX 回调注册每张 USB 网卡对应一个 WlanInterface它是纯单卡无线电。初始化时做了一次关键的注册self.driver.register_rx_callback(self._on_frame_parsed)芯片驱动chips/driver.py 定义基类从 USB 端点收到原始字节流、解析成结构化Packet后直接调用_on_frame_parsed后者再依次触发挂在接口上的所有业务回调interface.py 的_fire_rx_callbacks。也就是说驱动层不关心谁在等这个帧它只负责在帧到达的第一时间触发回调链。第二层WlanArray 的汇聚、去重与分发多网卡场景下同一帧会被多张卡听到。会话级的 WlanArray 在attach()时给每张卡挂上统一的入口回调array.py L82iface.register_rx_callback(lambda pkt, iiface: self._ingest(i, pkt))_ingest()array.py L182-L201在推式链路里完成三件事丢弃自己发出的帧以发信地址TA比对own_macs避免注入帧被当成空口流量跨卡去重StreamMerger在 0.3s 窗口内合并多卡收到的同一帧只有全局首见的副本才进入共享状态折叠进共享画面 分发等待者先sink.update()更新 AP/客户端/WEP 账本紧接着sink.dispatch_rx()唤醒所有匹配的等待者。注意这里的巧妙之处去重副本仍会让每张卡贡献自己的 RSSIrecord_signal所以Power读数能选出最强天线而不牺牲任何延迟。第三层WlanSink 的推送式等待 API —— next_frame核心低延迟设施在 WlanSink。它为下一帧匹配提供了两个配合的方法next_frame(match, timeout)调用方传入一个匹配函数match(pkt)挂一个 Future 到_waiters列表然后await不消耗任何 CPU 去轮询dispatch_rx(pkt)每个去重后的新帧到达时遍历等待者命中则用loop.call_soon_threadsafe(_set_result, fut, pkt)跨线程安全地立即兑现 Future。WlanArray再把这两个 API 原样透出array.py L236-L240于是所有 Campaign 状态机都拿到了同一把事件驱动的钥匙。对比一下同文件里还保留了wait_until()这个 50ms 步进的轮询版 API——它只用于等待一个模糊条件稳定如去授权后的沉降计时 campaigns/deauth.py L87精确帧匹配一律走 next_frame 推式等待。WEP 状态机IV 样本在到达瞬间入账WEP 攻击ARP Replay / ChopChop / Fake Authcampaigns/wep/对延迟最敏感。其数据通路_on_wepdata_frame()在sink.update()内部被同步调用每收到一个 WEP Data 帧就立刻把 3 字节 IV 记入 WepCaptureStoreIV 位于 MAC 头后第 24 字节见 wep/README.mdCampaign 侧要确认伪造帧已被 AP 接收时用next_frame挂一个匹配器广播 Data 帧、FromDS 且源地址为自己的 MACarp_replay.py 与 chopchop 用同一关联方式判断AP 重播帧被网卡听到 → 驱动回调 →_ingest→dispatch_rx命中 → 状态机在同一事件循环周期内被唤醒继续制造下一批 IV。整条链路没有任何睡 100ms 再看一眼的环节IV 速率因此可以顶满 AP 的重播速度——这正是 ChopChop 这类时序攻击能成立的前提。WPS PBC按钮按下到取出明文 PSK 的推送路径WPS PushButton 恢复campaigns/pbc.py的状态机同样是推而非拉用户按下路由器 WPS 按钮后AP 会在信标与 WSC M1 帧中翻转配置方法标志。Sink 在_on_wps_m1_frame()中解析 M1 并即时刷新 AP 的 WSC 身份状态机侧则用next_frame精确挂住 M1 帧命中后立刻进入注册者会话、取回明文 WPA PSK。下面这段演示 GIF 展示的就是该路径的端到端效果——从扫描到 PBC 握手捕获一气呵成低延迟设计的四个关键点设计点位置作用回调注册制收包wlan/interface.py L75帧到达即触发零轮询0.3s 窗口跨卡去重wlan/dedupe.py多卡不重复处理同一帧Future call_soon_threadsafewlan/sink.py L442-L470匹配帧跨线程即时唤醒等待者UI 只读共享 Sink 状态ui/app.py界面刷新节拍不影响攻击路径最后一个点容易被忽略Textual UI 的屏幕ui/screens/只是WlanSink的观众——它读access_points、packet_stats等字段做展示从不参与帧到达 → 状态迁移这条关键路径。所以哪怕界面正在重绘一个大表格WEP 的 IV 入账和 WPS 的 M1 命中都分毫不差。延伸阅读网卡接口与回调链src/wifit3/wlan/interface.py汇聚与去重src/wifit3/wlan/array.py、src/wifit3/wlan/dedupe.py共享 802.11 状态与 next_frame APIsrc/wifit3/wlan/sink.pyWEP 攻击套件说明src/wifit3/campaigns/wep/README.mdWPS PBC 状态机src/wifit3/campaigns/pbc.py硬件支持清单docs/SUPPORTED-HARDWARE.md【免费下载链接】wifit3Wifite but USB-only cross-platform.项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考