revjmoney/simian_tactical_wifi_sniffer

GitHub: revjmoney/simian_tactical_wifi_sniffer

该项目通过直接调用 Broadcom 私有 ioctl,解决了老旧 fullMAC WiFi 芯片在监听模式下无法切换信道的问题。

Stars: 0 | Forks: 0

# Simian Tactical WiFi Sniffer 🐒📡 **在老旧的 Broadcom fullMAC(`bcmdhd`)Android 手机上实现监听模式的 WiFi 捕获,_并支持有效的信道控制_** —— 包括那些所有人都说“无法开启监听模式”的设备。 基于 **Samsung Epic 4G (SPH-D700)** —— Broadcom **BCM4329**,CyanogenMod 11 (**Android 4.4.4**) —— 构建并测试完成,但其核心技巧同样适用于一大批发售于 2011–2015 年间、运行 `bcmdhd` 驱动的 BCM43xx 设备。 ## TL;DR - 老旧的 Broadcom WiFi 芯片是 **fullMAC**:芯片的 _固件_ 控制着无线电,因此标准的 Linux 工具(`iw`、`iwconfig`)虽然能将接口切换到 **监听模式**,却**无法设置信道** —— 你会得到 `Operation not permitted` 的错误提示。 - 本仓库的头条主打工具是 **[`setchan`](setchan/setchan.c)**,这是一个大约 60 行的 C 语言工具,直接向驱动发送原始的 Broadcom **`WLC_SET_CHANNEL` ioctl**(与专有命令 `wl channel` 使用的路径相同)。在 `iw` 无能为力的地方,它**真正实现了无线电的重新调谐**。 - 除此之外:还有两个微型的 Android 应用,**无需 Android Studio / 无需 Gradle 构建**(仅使用 `aapt`/`javac`/`d8`/`apksigner`): - **Simian Tactical WiFi Sniffer** —— 可选择单一信道 _或_ 扫描 1–11 信道,并按信道导出 `.pcap` 文件。 - **Simian WiFi Server** —— 一键启动针对 `/sdcard` 的 HTTP 文件服务器(附赠工具)。 如果你曾在 Broadcom 手机上遇到过*“监听模式可用,但我无法更改信道”*的问题并因此放弃 —— 这就是你缺失的那块拼图。 ## 为什么监听模式在这些芯片上“无法使用” WiFi 芯片组分为两种类型: | | **softMAC** (例如 Atheros `ath9k`) | **fullMAC** (Broadcom `bcmdhd`) | |---|---|---| | MAC 层运行于 | 宿主内核 (`mac80211`) | **芯片固件** | | 信道控制 | 宿主通过 nl80211 直接设置 | 由固件掌控;宿主无操作路径 | | 监听模式下的 `iw set channel` | 有效 | **`Operation not permitted`** | 在 BCM4329(以及大多数 `bcmdhd` 部件)上,执行 `iw dev wlan0 set type monitor` 会成功 —— 这只是一个标志位 —— 但 `iw dev wlan0 set channel N` 会被拒绝,因为 nl80211 没有通往真正掌控无线电的固件的路径。`iwconfig wlan0 channel N` 则会静默失效。`dhdutil` 是一个总线/SDIO 层工具,不支持 WLC 命令。而 `bcmon` —— 那款经典的旧版监听模式应用 —— 在 KitKat 上会直接崩溃(抛出 Java NPE)。 因此,无线电只能停留在固件最后一次调谐的信道上,你永远只能捕获到那一个信道的数据。这就是所有人止步的地方。 ## 解决方案:`WLC_SET_CHANNEL` ioctl Broadcom 固件 _确实_ 接受信道更改 —— 通过其 **私有 ioctl 接口**(`SIOCDEVPRIVATE` + 一个 `wl_ioctl_t` 结构体),这正是专有 `wl` 二进制文件所使用的机制。只是我们没有 `wl`。因此,[`setchan.c`](setchan/setchan.c) 重新实现了我们需要的这一个调用: ``` #define WLC_SET_CHANNEL 30 typedef struct wl_ioctl { unsigned int cmd; void *buf; unsigned int len; unsigned char set; unsigned int used, needed; } wl_ioctl_t; /* ifr.ifr_data -> &wl_ioctl{cmd=WLC_SET_CHANNEL, buf=&chan, len=4, set=1}; ioctl(sock, SIOCDEVPRIVATE, &ifr); */ ``` ``` $ setchan 6 SET_CHANNEL 6 -> ret=0 errno=0 (OK) GET_CHANNEL -> ret=0 errno=0 hw=7 target=6 scan=7 ``` **这确实有效。** 验证不仅基于返回的 `ret=0`,还通过在不同信道上进行捕获,并确认流量有所不同来证实(信道 1 与 AP 通信繁忙,而信道 6/11 逐渐安静) —— 这种现象只有在无线电真正重新调谐时才会发生。 ## 包含内容 ``` setchan/setchan.c # the channel-control ioctl tool (the important part) sniffer/ # "Simian Tactical WiFi Sniffer" Android app (channel pick + sweep) server/ # "Simian WiFi Server" Android app (HTTP file server for /sdcard) build_apk.bat # command-line APK build (no Android Studio / Gradle) ``` ## 环境要求 - 一台 **已获取 root 权限** 的 Broadcom `bcmdhd` Android 设备,且其驱动接受 `iw ... set type monitor` 命令。 - 设备上需具备一个小型 Linux 用户环境(本项目使用 **Linux Deploy** chroot —— Debian/Kali),以便使用 `iw` 并利用 `gcc` 编译一次 `setchan`。编译后的二进制文件位于 chroot 内的 `/root/setchan`。 - 设备上需有一个静态的 **`tcpdump`** 二进制文件(`/system/xbin/tcpdump`)。 - 这些应用通过 `su` 执行 shell 命令,因此需要 SuperSU/Magisk root 权限。 ## 构建(无需 Android Studio) 这两个应用都是基于纯框架(无 AndroidX)开发的,`minSdk`/`targetSdk` 均为 19,并且直接通过命令行构建。`build_apk.bat` 的运行流程为:`aapt package` → `javac -source 8 -target 8` → `d8 --min-api 19` → `aapt add classes.dex` → `zipalign` → `apksigner` → `adb install`。 编辑顶部的 SDK/JDK 路径,然后运行它。(具体流程请参阅脚本 —— 对于任何想要在脱离整个 IDE 的情况下构建 APK 的人来说,这是一份实用的参考。) ## 用法 **Sniffer:** 启动 → 输入一个信道 + 点击 **CAPTURE THIS CHANNEL**,或点击 **SWEEP ALL (1-11)** 来在每个信道上停留并生成 `sweep_
标签:Android, DSL, 域名枚举, 无线网络, 网卡驱动, 网络抓包, 防御绕过