WPAForge **在手机上,排好字典顺序,自动一本接一本试出你自己路由器的 WPA 密码。** 多字典计划与自动接力 · 同一网络只试一次 · 现场生成候选 · 逐条真实关联验证 · 内置精选字典,也能用你自己的 [![Release](https://img.shields.io/github/v/release/wlmosv-png/wpaforge?style=flat-square&color=FFB800&labelColor=1C1C24)](https://github.com/wlmosv-png/wpaforge/releases/latest) [![Downloads](https://img.shields.io/github/downloads/wlmosv-png/wpaforge/total?style=flat-square&color=FFD54F&labelColor=1C1C24&cacheSeconds=60)](https://github.com/wlmosv-png/wpaforge/releases/latest/download/WPAForge.apk) [![Stars](https://img.shields.io/github/stars/wlmosv-png/wpaforge?style=flat-square&color=E39A28&labelColor=1C1C24)](https://github.com/wlmosv-png/wpaforge/stargazers)
[![官网](https://img.shields.io/badge/%E5%AE%98%E7%BD%91-wlmosv.dpdns.org-C68A00?style=flat-square&labelColor=1C1C24&logo=cloudflare&logoColor=FFD54F)](https://wlmosv.dpdns.org/wpaforge/) [English](README_EN.md)
--- > ### 开始之前 > > - **需要 Root**(Android 8.0 及以上):判定依赖 `su + cmd wifi`,没有它就动不了。 > - **只用在你自己拥有、或已获得授权的网络上。** 对别人的网络发起关联尝试是违法行为, > 路由器那边会记下你的 MAC 和时间。 > - 全程在本机完成,不联网上传任何东西;命中的口令在本机只以密文保存。 ## 目录 - [它能做什么](#它能做什么) - [两种执行方式](#两种执行方式) - [多字典计划:排好顺序,自动一本接一本](#多字典计划排好顺序自动一本接一本) - [同一网络只试一次:跨字典候选过滤](#同一网络只试一次跨字典候选过滤) - [它怎么找密码](#它怎么找密码) - [字典:用哪本都行,跑过就看得出好坏](#字典用哪本都行跑过就看得出好坏) - [判定:宁可说「不确定」,也不报假成功](#判定宁可说不确定也不报假成功) - [常见疑问](#常见疑问) - [字典管理](#字典管理) - [观测:一眼看出该用哪条信道](#观测一眼看出该用哪条信道) - [快速开始](#快速开始) - [界面预览](#界面预览) - [和别的做法比](#和别的做法比) - [已知限制](#已知限制) - [安装](#安装) - [构建](#构建) - [License](#license) ## 它能做什么 - **按目标现场生成候选**:SSID、厂商、门牌、姓名、生日、手机号都能当依据 - **用内置字典,或用你自己导入 / 下载的字典** —— 两种都支持,跑法完全一样 - 每条候选真实发起一次关联,逐条给结论:**成功 / 密码错 / 不确定** - 结果按**本机战绩**排序:字典页直接写出「这本在你这里命中几次、平均几条中一次」 - 多目标队列:排好的一串目标依次执行,每个可单独暂停 / 继续 - **不动你原来的网络配置**:动手前把目标原配置加密记下,收尾写回并回读确认; 没还原成功的记录留在「审计」页的恢复状态区,可重试 / 清理 - 观测页:频谱雷达 + 信道占用与建议,该换哪条信道一眼看得出 - 局域网侦察:扫同网段存活主机与常见端口,按厂商归类,报告可导出 - WPS 四层候选(厂商算法 / 内置弱 PIN 表 / 自定义列表 / 完整枚举),含拆半攻击与断点续跑 - 离线校验 `.cap` / `.hc22000`:EAPOL 与 PMKID 两条路径,1 万条约 37 秒 - 字典能搜能合并能编辑(包含 / 前缀 / 后缀 / 正则),大字典编辑不再丢数据 - 锁屏继续跑;被系统杀掉也能续上(进度节流落盘) ## 两种执行方式 | 方式 | 适合场景 | 行为 | |---|---|---| | **单本字典** | 只跑一本,或先试小而精的表 | 选一本 → 跑完即停 | | **多字典计划** | 手上好几本,想一次跑完 | 排好顺序 → 自动一本接一本,命中即停,没命中自动换下一本 | 两种方式共用同一套判定、同一份「这个网络试过什么」的记录。 ## 多字典计划:排好顺序,自动一本接一本 以前一次只能跑一本字典,跑完要么没结果、要么手动再选下一本。现在可以把几本字典排成一个计划: - 按顺序执行,**命中立即停止**,没命中自动换下一本; - 「自动跑下一本」可以开(连跑到底)也可以关(每本跑完停下等你决定); - 破解页直接管理计划(上移 / 下移 / 移出本计划),不用来回切页面; - 支持暂停、继续、停止;**已经跑完的字典不会被重新跑一遍**; - 页面实时显示「第几本 / 当前字典 / 下一本 / 整体进度」; - 计划跑完、暂停、被阻塞时,页面提示与真实状态一致,不会拿单本字典的完成文案顶替。 > **计划与目标网络绑定**:A 网络和 B 网络各有一份计划与进度,互不干扰;切换网络不会串台, > 切回原网络时原计划与进度原样恢复。 > > **运行中不能调整顺序**(避免任务与进度错位):计划执行期间「管理计划顺序」会明确提示 > 先暂停或停止;暂停或停止之后即可自由调整。 ## 同一网络只试一次:跨字典候选过滤 同一个 Wi-Fi 下,**已经确认试错的密码,在其它字典里不会再试第二遍**。 - 换字典、换顺序、重新选择字典,都不会重复劳动; - 界面如实拆开显示:**已证实错误 / 没跑出结果 / 本次将跳过 / 实际待执行**; - 这个「跳过多少条」按**当前计划里真实存在的候选**算出来,不是拿历史记录总数充数。 **两档策略,边界说清楚:** | 档位 | 会跳过什么 | 不跳过什么 | |---|---|---| | **保守(默认)** | 只跳过**已证实错误**的候选 | 所有「没跑出结果」的候选都会重试 | | **省时** | 额外跳过「上次跑过、连接已确认结束、但没跑出结果」的候选 | 当时还连在目标上(无法判断)的候选,两档都不跳 | 开启「省时」之前会明确提示:**会跳过多少条、其中多少条是没跑出结果的**, 并说明「如果上次是因为信号差、路由器退避或中途中断,正确密码可能就在里面」。 不确定的结果(超时、信号差、中途停止)**不会被当成密码错误**,下次仍会重试。 ## 它怎么找密码 三条路,你挑: **① 按目标现场生成。** SSID 叫 `FAST_E972`,它就造 `fast_e972`、`faste972`、`fast2026` 这类;线索里填了姓名、生日、手机号,才会造 `zhangwei1990`、`138xxxxxxxx` 这种。 厂商名从 BSSID 查 IEEE 的 OUI 表(打进包里;查不到就留空,不编一个出来)。 **② 用内置字典。** 7 份精选表:通用弱口令、纯数字、WPA 高频榜、中文高频、年度口令…… 每一份都写清它为什么值得留着,点开就看得到。 **③ 用你自己的字典。** 导入 txt,或从在线来源直接下载,都行 —— 跟内置表一样跑, 一样记战绩。 **每条候选都要真发一次关联请求。** 快的 1 秒给结论,慢的 5 秒以上;手机一次只能连 一个网络,这是 Android 的限制,绕不过去 —— 所以「先试哪条」比「有多少条」重要得多: 十万条盲试是按天算的,几百条排好序的通常几分钟就完。 ## 不去动你原来的网络 破解必须反复删掉目标配置再重连,所以收尾这一步决定「你自己的网会不会被搞坏」: - 动手之前先把目标的原配置(含加密后的原口令)写进本地记录; - 结束时按状态处理:命中就保留那条正确配置,其余情况先删掉候选残留、再用原口令 把配置写回,并**回读确认**; - 目标不在覆盖范围内、此刻连着别的网、观察窗口内没连上 —— 都**不算恢复失败**, 判据只看配置有没有写回; - 读不到已保存网络列表时不下结论:记录保留、可重试、按存在残留风险处理; - 没处理完的记录会列在「审计」页的**恢复状态**里,可以重试、查看详情或清理 (清理只删本地记录,不会改动系统里的网络配置)。 自动重试有间隔(10 分钟)与上限(3 次),到上限写入归档状态,不会一直重试; **同一目标**存在未解决的记录时,新任务会先被挡下并说明原因。 ## 字典:用哪本都行,跑过就看得出好坏 内置只留精选,不再往里塞几万条的大表(那种表的实际贡献,本机 107 次命中里一次都没验出来过)。 你自己导入的字典和解密主体完全一样:能跑、能合并、也会记战绩。跑过之后, 字典页会写成这样: ```text 01 内置弱口令常用 核心 · 历史命中 57/73 · 平均 2 条中一次 xato 千万库 TOP 10000 历史命中 14/14 · 平均 23 条中一次 ``` 默认就按「命中率」排序 —— 先跑在你自己的网络里证明有效的那本。这份战绩只读本机 历史的前几列,不解密任何口令。 字典的管理、排序、多选、回收站与编辑器见上面「[字典管理](#字典管理)」一节。 ## 判定:宁可说「不确定」,也不报假成功 每条候选跑完只有三种结论,而且都给得出依据: | 结论 | 依据 | |---|---| | **成功** | 4-Way Handshake 完成,且 SSID / supplicant 状态 / IP **同源于同一行输出** | | **密码错** | 有可观察的失败证据(例如 AP 重发握手第一帧) | | **不确定** | 等满时限却什么都没观察到 —— 单独一栏,不混进「密码错」,也不算「已试过」 | netId 只当**归属证据**:只有本条尝试与状态两侧都拿到非零 netId 且不一致时,才降级为 不确定;取不到或为 0 时一律不否决。 这条是踩过坑之后改的:早期版本出现过系统弹「无法连接到 BTWIFL_0923」、应用却报 「已连上」。现在宁可少报一个成功,也不多报一个假成功。 ## 常见疑问 ### 「软件不能保证 100% 判定正确,那我为什么还要用它?」 因为**判定本来就做不到 100% 确定** —— 这不是 WPAForge 的短板,而是这件事本身的边界: 1. **客观限制**:Android 的网络栈、厂商驱动、路由器固件行为,以及无线事件的反馈方式, 都不在应用的控制范围内。同一台路由器在不同时刻对同一件事的反馈也可能不同。 2. **发出连接请求 ≠ 系统按预期执行**;**连接失败也不必然等于密码错误** —— 可能是驱动超时、路由器退避、信道切换或干扰。 3. WPAForge 的设计原则是:**有归属证据才下确定结论,证据不足就保留「不确定」**。 4. 「不确定」既不会被冒充成「确认失败」,也不会因此把候选永久排除 —— 下次仍会再试。 确定失败的结论必须能归属于**本次**尝试,而不是沿用上一轮的残留证据。 所以你用它换到的不是「百分百判定」,而是: - **少做错误归因**:不会因为一次环境噪声就把正确密码划掉; - **少做错误排除**:不确定的候选不会被永久跳过; - **少做重复劳动**:同一网络下已确认试错的候选,在其它字典里不会重复出现。 **宁可承认无法确定,也不把没有证据的失败当成事实。** ## 字典管理 - 列表直接显示每本字典的**条数、执行状态、是否已在计划中**; - 多选后可批量**加入 / 移出计划**;计划卡片默认折叠,不再占满首屏; - **删除走回收站**:先移入回收站,可以恢复,也可以在里面彻底删除,不会一删就没; - 编辑器带**行号栏**、光标行列、定位行与查找 —— 两千多行的字典也能精确定位到某一行; - **字典续命**:字典改名、移动或重新导入之后,按**内容**识别 —— 内容相同可以接着上次 的位置继续跑,不必从头再来;内容确实变了会明确提示「不继承旧进度」, 不会拿旧位置去跑一份新内容。 ## 观测:一眼看出该用哪条信道 圆盘就是频谱:上半圆是 2.4G 的 14 条信道,下半圆是 5G 的 4 个频段;半径=信号强度, 越靠里越强。**同一格里的点越多,那条信道就越挤。** 盘下面直接给结论,不用自己数: ```text 2.4G 25 台 5G 4 台 最挤 ch 5 · 7 未加密 0 台 最强 -20 dBm ``` 头部只有一句 `刚刚更新` / `最后更新 N 秒前`;扫到新设备或有人离开时, 会写成 `新增 2 台 · 消失 1 台`。 ## 快速开始 ```text 1. 打开「观测」页,扫一下附近,选中你的目标 2. 打开「破解」页:让它现场派生,或加载内置 / 自己的字典 3. 点开始,锁屏等结果 —— 命中的口令会直接标出来,可一键复制 ``` ## 界面预览 WPAForge 界面速览 界面速览 —— 观测 → 破解 → 命中 → 字典管理,四步(每张停 2 秒) > **说明**:下列截图为 v1.9.22 时的界面。字典管理页、多字典计划卡片与回收站是之后的 > 新增能力,截图尚未重拍 —— 这里不放置示意或合成图。

① 观测(频谱雷达)· ② 破解(进度与速率)· ③ 命中(口令 + 一键复制)· ④ 字典管理(按命中率排序 + 历史战绩)
⑤ 网络侦察(设备与开放端口)· ⑥ 信号分布与信道推荐 · ⑦ 审计(恢复状态 / 字典 / 强度 / 离线校验)· ⑧ 设置(权限与保活)

## 和别的做法比 | 做法 | 要什么 | 快不快 | 门槛 | |---|---|---|---| | **WPAForge** | 一台 Root 的手机 | 现场派生候选,几百条一般几分钟 | 会点开始就行 | | 电脑 aircrack-ng + 抓包 | 笔记本 + 支持 monitor 的网卡 + 已抓到的握手包 | 取决于字典,大字典按天算 | 会命令行、会抓包 | | 手机 Termux 脚本 | 手机上的 Linux 环境 + 外置网卡 | 多数只是替你跑 aircrack | 会折腾环境 | | 在线字典站 | 把握手包传给别人 | 排队 | 你的包离开了本机 | 它擅长的是「路由器主人自己设的那种密码」;随机 12 位强密码不在它的范围内 —— 那种密码本来就该用 WPA3。 ## 已知限制 | 现象 | 原因 | 怎么办 | |---|---|---| | 一直在试但拿不到 | 密码不在候选集合里 | 导入自己的字典,或调高候选上限 | | 一开始就全失败 | 目标开了 WPA3 / PMF,或 WPA2-WPA3 过渡模式 | 单靠关联尝试打不动,别硬啃 | | 部分 AP 扫不到 | 手机不支持 6GHz,或本机开了随机 MAC | 关掉本机随机 MAC 再扫 | | 报权限错误 | Root 没给,或 ROM 禁了 `cmd wifi` | 看设置页那 6 步自检 | | 中途被系统杀掉 | 后台省电策略 | 加白名单;进度会落盘,重开续跑 | | 收尾提示「原口令不可用」 | 原配置密文丢失(Keystore 不可用、换机、清数据) | 只能手动重连该网络;记录在「审计」页的恢复状态里可查看原因 | | 多字典计划只有当前网络那几本 | 计划**与目标网络绑定**,每个网络各有一份 | 换网络后要重新安排该网络的计划 | | 计划跑起来后改不了顺序 | 运行中调整会让任务与进度错位 | 先暂停或停止,再调整;改完继续即可 | | 开了「省时」档后有些密码不再重试 | 省时档会跳过「上次跑过但没跑出结果」的候选 | 网络不稳定时不要开;需要重试可关掉该档,或用「本次强制重跑」 | | WPS 目标的「能力」全是未知、没有设备名 | 系统 SELinux 不允许 supplicant 向 root 域回包 | 加一条放行规则,见下一节 | ### WPS 通道(需要 Root) WPS 页要显示「WPS 设备名 / 能力 / 配对窗口」,只能通过 wpa_supplicant 的控制通道去问它。 部分系统(实测 ColorOS 15 / Android 15)的 SELinux 策略不允许 supplicant 向 root 域回包, 症状是:AP 列表扫得出来,但每个目标的「能力」都是未知、也没有设备名。 WPAForge 会在 WPS 页直接说明这一点,不会静默显示成「没问题」。 放行办法:在 `/data/adb/service.d/` 下放一个可执行脚本,开机时注入这条规则: ```sh #!/system/bin/sh /data/adb/magisk/magiskpolicy --live \ "allow hal_wifi_supplicant_default magisk unix_dgram_socket sendto" ``` 删掉该脚本即撤销。 > **注意**:Magisk 模块目录里的 `sepolicy.rule` 这条路在这种环境下**实测不生效**—— > 重启后活策略里查不到那条规则,`BSS_ENUM` 又回到 0(原因未确认)。 > 核对办法:`magiskpolicy --print-rules | grep "hal_wifi_supplicant_default magisk"`。 ## 安装 > **需要 Root** · Android 8.0+ [**⬇️ 下载最新版 APK**](https://github.com/wlmosv-png/wpaforge/releases/latest) 为什么必须是 Root:判定依赖 `su + cmd wifi`。Shizuku 与免 Root 通道已在 1.9.24 彻底移除 (含代码依赖)—— Shizuku 要在每次连接时借 binder,免 Root 走 `WifiNetworkSpecifier` 则每条候选都会弹一次系统确认框,两者都撑不起逐条遍历。 ## 构建 不依赖 Gradle,两段式手工链: ```sh WP_VERSION_CODE=155 WP_VERSION_NAME=1.9.59 sh 1-aapt2.sh # 设备侧:aapt2 编译资源(版本号在这一步写入) sh 2-build-dex.sh # 桌面侧:javac + d8 + 签名(需 WP_FORGE_KS* 变量) ``` 产物 `build/out/wpaforge-signed.apk`。`1-aapt2.sh` 里的版本号默认值只作兜底, 发布时必须显式传入,否则会打出与线上倒挂的版本号。 ## 想反馈 机型兼容、失败的 AP 特征、功能建议 → [Discussions](https://github.com/wlmosv-png/wpaforge/discussions); 确认是 bug → [Issue 模板](https://github.com/wlmosv-png/wpaforge/issues/new/choose)。 --- ## 使用边界 **仅对自己拥有授权的网络使用**(自有路由器、实验室、授权渗透测试)。对未授权网络发起关联尝试是违法行为,且路由器侧会记录你的 MAC 与时间。 ## License Apache License 2.0 — 见 [LICENSE](LICENSE) 设计取舍与踩过的坑(配置复用假阳性、判定时序、`finally` 覆盖结果等)见 [`doc/TECHNICAL-NOTES.md`](doc/TECHNICAL-NOTES.md)。 --- **如果它帮到你了,回仓库点个 ⭐ —— 这是这个项目唯一的需求清单。** ## Star History

Star History

## 我的其它项目 | 项目 | 简介 | |---|---| | **[TGAutoSign](https://github.com/wlmosv-png/TGAutoSign)** | Telegram 自动签到的 Xposed 模块 —— 多账号槽位、群签到判定、定时计划、多主题界面。任意聊天发 `/jmb` 管理全部目标。 | | **[apk-index](https://github.com/wlmosv-png/apk-index)** | APK 静态索引与逆向检索工具 —— 解 AXML、逐 dex 建索引,按字符串 / 签名 / 结构反查 hook 点,MCP 接入。 |