Airgorah 厂商识别揭秘:编译期生成 OUI 表,MAC 地址秒变设备品牌
【免费下载链接】airgorahA WiFi security auditing software项目地址: https://gitcode.com/gh_mirrors/ai/airgorah
在 Airgorah 这款 WiFi 安全审计软件中,「厂商识别」是一个不起眼却非常实用的细节:扫描到附近无线客户端时,界面会直接把每个 MAC 地址翻译成设备品牌,比如Apple、HUAWEI、TP-Link。这套能力来自一张在编译期生成的 OUI 厂商表,全程不联网、零延迟。本文带你揭秘它的完整实现原理。
什么是 OUI?为什么 Airgorah 需要它
MAC 地址的前 3 个字节(48 位中的前 24 位)叫做OUI(Organizationally Unique Identifier),由 IEEE 统一分配给各个硬件厂商。也就是说,只要知道一张设备的 OUI,就能反查它出自哪家厂商。
对做 WiFi 安全审计的 Airgorah 来说,这个能力很关键:
- 📡 扫描到某个 SSID 下的客户端时,一眼看出是手机、电脑还是路由器;
- 🔍 排查未知设备时,品牌信息比裸 MAC 地址更有判断价值;
- ⚡ 识别发生在抓包线程内联完成,界面数据「开箱即完整」,GUI 无需二次补全。
编译期生成 OUI 表:vendors.csv 如何变成 HashMap
Airgorah 的厂商数据存放在一份 5 万多行的 CSV 文件里,格式为Mac Prefix,Vendor Name:
vendors.csv
00:00:0C,"Cisco Systems, Inc"/00:00:0E,FUJITSU LIMITED/00:00:1B,"Novell, Inc."…
真正的「魔法」发生在编译阶段。build.rs 作为 Cargo 构建脚本:
- 用
csv库逐行解析vendors.csv; - 把每行转写成
map.insert("前缀", "厂商名")形式的 Rust 代码; - 拼进一个
lazy_static宏模板,写出到构建输出目录OUT_DIR/vendors.rs; - 声明
cargo:rerun-if-changed=vendors.csv,数据更新后自动重跑构建。
这样运行时得到的就是一张HashMap<&'static str, &'static str>,字符串全部编译进二进制,查询时没有任何 I/O 和解析开销。
find_vendor:从最长前缀逐级匹配
核心的查询逻辑只有二十多行,实现在 vendors.rs 的find_vendor函数中:
- 先查缓存:每张 MAC 的解析结果会存入全局缓存
VENDORS_CACHE(定义于 globals.rs),重复轮询零成本; - 逐级缩短前缀:从 13 字符的 MAC 前缀开始匹配,未命中就缩短一位再试。这既能覆盖标准的 24 位 OUI,也能匹配更长的 MA-M / MA-S 厂商注册;
- 兜底返回:全部未命中则返回
Unknown,并同样写入缓存。
整个查找只是几次哈希表探测,官方注释特意强调:不需要任何后台线程。
识别结果如何流入扫描界面
Agent 进程在嗅探线程中解析到客户端 MAC 时,就地调用find_vendor拿到品牌名,随后随快照一起上送 GUI。关键调用点在 sniffer.rs:
let vendor = find_vendor(station); upsert_client(&mut ap.clients, station, &power, &vendor, &now, probe);于是你在扫描界面看到的客户端列表里,Vendor一列天然就有值——厂商识别模块对上层完全透明。
小结
Airgorah 的厂商识别是一套教科书式的「编译期预处理」设计:
| 环节 | 做法 | 收益 |
|---|---|---|
| 数据存储 | 5 万+ 行 vendors.csv | 人类可读、易更新 |
| 编译期 | build.rs 生成静态 HashMap | 零运行时解析开销 |
| 运行时 | find_vendor 前缀匹配 + 缓存 | 几次哈希探测即出结果 |
| 消费端 | sniffer.rs 内联解析 | GUI 快照开箱即完整 |
如果你正在为自己的 Rust 网络工具添加 OUI 反查能力,这套「CSV → build.rs → lazy_static → 前缀匹配 + 缓存」的方案值得直接借鉴。
【免费下载链接】airgorahA WiFi security auditing software项目地址: https://gitcode.com/gh_mirrors/ai/airgorah
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考