KareemAksh/android-gki-wifi-injection

GitHub: KareemAksh/android-gki-wifi-injection

在未经刷写的 Android 13 GKI 原生内核上,通过可加载模块与 OTG 适配器实现 WiFi 监控模式与数据包注入的安全研究项目。

Stars: 0 | Forks: 0

# Android GKI WiFi 注入 — 原生内核上的 OTG 监控模式与解除认证

platform kernel toolchain flutter adapter license

为一个**原生、锁定的 Android 13 GKI 内核**构建一个可用的 **监控模式 + 数据包注入** WiFi 协议栈 —— 完全以**可加载内核模块**的形式实现(无需重新刷入内核)—— 以驱动 **OTG USB WiFi 适配器**,并由 **Flutter 应用** 提供前端支持。 目标设备:**Redmi Note 13 4G (`sapphire`,Qualcomm `khaje`/SM6225)**,内核 `5.15.178-android13-8`,已使用 Magisk 获取 root 权限。 ## TL;DR - Android GKI 搭载了一个具有**冻结 KMI** 的内核,**没有 `mac80211`**,仅有一个 **Qualcomm 树外 `cfg80211`**。开箱即用时,任何 USB WiFi 适配器都无法执行监控模式或注入。 - 本项目针对**精确的 GKI 源码/`vmlinux.symvers`** 交叉编译了 **`cfg80211.ko` + `mac80211.ko` + `rtl8xxxu.ko`**,使它们能在原生内核上加载(匹配 vermagic + 完整的 **LTO/CFI/SCS** 以及 Clang 14),然后在运行时**替换**厂商的 WiFi 协议栈,从而启用 OTG 适配器。 - `rtl8xxxu` 的 8188F 支持(上游 Linux 6.5 中添加)被**回移到了 5.15 驱动程序中**,并且固件被**直接嵌入到模块中**,以规避 Android 的 SELinux firmware-loader 限制。 - 一个 **Flutter 应用** 以 root 权限统筹这一切:替换协议栈 → 检测适配器 → 扫描 → 注入测试 (`aireplay-ng -9`) → 解除认证。 - **发现:** **内部 Qualcomm WiFi 可以被强制进入监控模式** (`con_mode=4`) 进行*嗅探*,但其固件**不支持注入** —— 因此在内部芯片上无法进行解除认证。OTG 适配器是唯一支持注入的路径。 ## 为什么这很困难(GKI 问题) 现代 Android 手机运行的是**通用内核映像 (GKI)**:一个由 Google 构建的、具有**稳定、冻结的内核模块接口 (KMI)** 的内核二进制文件。厂商功能以独立模块提供。这对于 WiFi 渗透测试来说非常不利: | 障碍 | 详情 | |---|---| | **没有 `mac80211`** | GKI 内核根本不构建 `mac80211`;Qualcomm WiFi 驱动是 FullMAC 的并使用其自己的 `cfg80211`。 | | **厂商 `cfg80211`** | 加载的 `cfg80211` 是一个 Qualcomm 树外模块 (vermagic `5.15.94`),其模块↔模块的符号 CRC **不匹配**原生的 ACK (`mac80211` 的 92 个导入符号中有 69 个不同)。 | | **`MODVERSIONS` + 精确的 vermagic** | 任何模块都必须匹配 `5.15.178-android13-8-00021-g6f2f96be86b9-ab13729987` 和 GKI 符号 CRC,否则会被拒绝。 | | **Full LTO + CFI + SCS** | `CONFIG_LTO_CLANG_FULL`、`CONFIG_CFI_CLANG`(非宽松模式)、`CONFIG_SHADOW_CALL_STACK` —— 在不匹配 Clang CFI 的情况下构建的模块会在第一次间接调用时导致内核 **panic**。需要 Clang 14 + 匹配的编译标志。 | | **`nl80211` 是单例** | 你无法在厂商模块旁边加载*第二个* `cfg80211`(`nl80211` genl family 会冲突)—— 因此必须**替换**协议栈,而不是新增。 | | **SELinux firmware loader** | 内核无法从 `/data/local/tmp` 读取固件 (`-13 EACCES`);标准的固件路径是只读的。 | | **5.15 中没有 `rtl8xxxu` 8188F** | 上游的 8188F 支持大约是在 Linux 6.5 中引入的。 | 关键的促成因素:这种替换是作为**可加载模块**完成的 —— 完全可逆(`rmmod`/重启),并且它从不修改任何分区。 ## 工作原理 ``` ┌─────────────────────────── Flutter app (root via su) ───────────────────────────┐ │ Prepare ──▶ Detect ──▶ Test inject ──▶ Scan ──▶ Deauth ──▶ Restore(reboot) │ └───────────────────────────────────┬─────────────────────────────────────────────┘ │ runs engine.sh as root vendor stack (internal WiFi) ▼ our stack (OTG adapter) ┌───────────────────────────┐ rmmod wlan; rmmod cfg80211 ┌───────────────────────────────────┐ │ qca_cld3_wlan + cfg80211 │ ───────────────────────────────▶ │ cfg80211.ko + mac80211.ko + │ │ (FullMAC, 5.15.94) │ insmod cfg80211/mac80211/rtl │ rtl8xxxu.ko (5.15.178, +8188F, │ │ wlan0/p2p0/wifi-aware0 │ │ embedded fw) ── binds 0bda:f179 │ └───────────────────────────┘ └───────────────────────────────────┘ │ wlan0 (monitor) ▼ iw + aireplay-ng (static aarch64) ``` ### 1. 构建 WiFi 协议栈(精确匹配 GKI 内核) - 从 `ci.android.com` 获取构建 `ab13729987` 的确切 **GKI 构建**产物(`vmlinux.symvers`,构建信息)。 - 下载匹配的 **ACK `kernel/common`** 源码(`android13-5.15`,commit `6f2f96be…`)。 - 使用**上游 Clang 14.0.0**(内核是使用 AOSP clang r450784e / 14.0.7 构建的 —— 具有相同的 CFI/LTO/SCS ABI)。 - 通过 `.scmversion` 强制指定确切的 vermagic,种入 `vmlinux.symvers`,并使用 `LLVM=1`(完整 LTO + CFI)将 `cfg80211`/`mac80211`/`rtl8xxxu` 构建为模块。 ### 2. 将 RTL8188F 回移到 `rtl8xxxu` - 采用内部一致的 **6.6 `rtl8xxxu`**(其中包含 `rtl8xxxu_8188f.c`),并针对 **5.15** 头文件进行编译。 - 只有 **~20 个错误**,全部集中在两处众所周知的 mac80211 API 变更上: - `ieee80211_sta.deflink.*` → `ieee80211_sta.*`(MLO 之前), - `ieee80211_vif.cfg.*` → `ieee80211_vif.bss_conf.*`, - 加上一些 `ieee80211_ops` 签名垫片(`bss_info_changed` `u64`→`u32`,`start_ap`/`conf_tx` 丢弃了 link 参数,`ieee80211_beacon_get` 参数数量变动,丢弃 `wake_tx_queue`)。 ### 3. 嵌入固件 - 在 SELinux 环境下,从 `/data/local/tmp` 执行 `request_firmware("rtlwifi/rtl8188fufw.bin")` 会失败。驱动程序被修改为使用一个编译进模块的 **21 KB 固件的 C 数组** —— 无需进行文件系统查找。 ### 4. 用户空间工具(静态 aarch64) - `iw`(+ 静态 `libnl`),`aireplay-ng` / `airodump-ng`(+ 静态 `OpenSSL`/`libnl`),`iwpriv`(wireless-tools)—— 全部进行完全静态的交叉编译,以便它们能在没有共享库的情况下在 Android 上运行。 ### 5. 应用程序 - 打包模块 + 固件 + 静态工具,以 root 权限提取它们,并为每个步骤运行 `engine.sh`。在替换期间会断开内部 WiFi/ADB(单 USB-C 端口 → 独立运行,或通过 Bluetooth PAN ADB 运行)。 ## 仓库布局 ``` . ├── app/ (otgdeauth/) Flutter app — UI + root orchestration │ ├── lib/main.dart │ └── assets/payload/engine.sh the root engine (setup/detect/scan/test/deauth/restore) ├── driver/ (rtl8xxxu_build/) Modified rtl8xxxu (6.6 backported to 5.15) + embedded firmware ├── tools/ │ ├── deauth.c minimal raw-socket 802.11 deauth injector (fallback) │ └── build_tools.sh cross-build iw / aireplay-ng / iwpriv (static aarch64) ├── scripts/ │ └── build_modules.sh fetch GKI source + Clang 14, build cfg80211/mac80211/rtl8xxxu └── docs/ deep-dive notes ``` ## 构建 前置条件(Debian/Kali 主机):`git make clang lld bc bison flex python3 curl unzip aarch64-linux-gnu-gcc`,Flutter + Android SDK/NDK。 ``` # 1. 为你确切的 GKI build 编译 kernel modules(如果你的 kernel 不同,请编辑内部的 build/SHA 变量) ./scripts/build_modules.sh # -> cfg80211.ko, mac80211.ko, rtl8xxxu.ko # 2. 编译静态 userspace 工具 ./tools/build_tools.sh # -> iw, aireplay-ng, airodump-ng, iwpriv # 3. 将它们暂存到应用中并编译 APK cp *.ko rtl8188fufw.bin iw deauth aireplay-ng airodump-ng app/assets/payload/ cd app && flutter build apk # release APK is debug-signed and installable ``` 匹配你的设备的提示:这些模块被固定到一个 GKI 构建(`vermagic` + `vmlinux.symvers`)。如果内核不同,请在 `scripts/build_modules.sh` 中设置 GKI **构建号**和 **`kernel/common` commit**(可以在 `uname -r` / `/proc/version` 中找到)。 ## 使用方法(应用程序) 1. **准备** —— 在 Magisk 提示中授予 root 权限;替换入模块协议栈。 2. 插入 OTG 适配器 → **检测** (`wlan0`)。 3. **测试注入** —— 运行 `aireplay-ng -9`;预期结果为 *"Injection is working!"*。 4. **扫描** → 在**你拥有**的网络上点击 **Deauth**。 5. **恢复** —— 重启会使内部 WiFi 恢复正常。 ## 主要发现 - ✅ **原生 GKI 内核可以作为模块运行完整的树外 WiFi 协议栈**(`cfg80211`+`mac80211`+驱动程序),包括在完整的 LTO/CFI/SCS 下,前提是你必须匹配工具链和 `vmlinux.symvers`。 - ✅ **RTL8188FU 可以通过主线 `rtl8xxxu`(已回移)进行注入**,已通过 `aireplay-ng -9` 确认。 - ✅ **嵌入固件**是绕过 Android SELinux firmware-loader 沙盒的绝佳方法。 - ❌ **内部 Qualcomm WiFi 无法注入。** `con_mode=4` 会生成一个真实的监控接口(嗅探工作正常,通道通过专有的 `setMonChan` ioctl 设置),但固件的监控路径是**只读捕获**的 —— `aireplay` 注入失败。这与记录详尽的 Qualcomm 限制相吻合。 ## 法律与道德声明 本仓库记录了作者在**自己的设备和网络**上进行的网络安全研究。发送解除认证帧会中断服务,在**未经书面授权**(例如,美国《计算机欺诈和滥用法》、英国《计算机滥用法》及相关法律)对你不拥有或没有书面测试权限的网络进行此操作是**违法的**。请仅用于授权测试、教育和防御性研究。作者对滥用行为不承担任何责任。 ## 许可证与致谢 - 基于 **GPL-2.0** 许可 —— 它包含来自 Linux 内核 (GPL-2.0) 的已修改 `rtl8xxxu`、`mac80211` 和 `cfg80211` 代码。 - `rtl8xxxu` 的 8188F 支持由 Bitterblue Smith 和 Linux 无线社区提供。`aircrack-ng`、`iw`/`libnl`、`wireless-tools` 和 `linux-firmware` 版权归其各自的作者所有。 - 本项目作为一个学习/研究计划构建。 ### 建议的 GitHub Topics 将这些添加到仓库的 ⚙️ *About → Topics* 下以提高可发现性: `android` · `gki` · `kernel-module` · `wifi` · `monitor-mode` · `packet-injection` · `802-11` · `rtl8xxxu` · `rtl8188fu` · `mac80211` · `cfg80211` · `aircrack-ng` · `deauth` · `wifi-security` · `penetration-testing` · `magisk` · `root` · `flutter` · `cross-compilation` · `reverse-engineering` · `qualcomm` · `nethunter` · `wireless-security`
关键字(搜索相关性) Android WiFi 监控模式,Android 上的数据包注入,RTL8188FU 监控模式,rtl8xxxu Android,GKI 内核模块构建,树外 mac80211 cfg80211 Android,aireplay-ng Android arm64 静态,OTG WiFi 适配器 Android deauth,Magisk WiFi 注入,Redmi Note 13 sapphire 内核,Qualcomm con_mode 监控,NetHunter 替代方案,Android 13 内核 5.15 模块签名 vermagic CFI LTO,Flutter root 应用程序。
标签:Android, DSL, Flutter, WiFi渗透, 内核模块, 安全资源, 客户端加密, 数据包注入, 网络安全, 隐私保护