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, 域名枚举, 无线网络, 网卡驱动, 网络抓包, 防御绕过