FaceWinUnlock-Tauri注册表操作与核心组件部署原理:软件如何注入Windows登录界面
【免费下载链接】FaceWinUnlock-Tauri一款基于 Tauri 框架开发的现代化 Windows 面容识别解锁增强软件。它通过自定义 Credential Provider (DLL) 注入 Windows 登录界面,结合前端 Vue 3 和后端 OpenCV 人脸识别算法,为用户提供类似 Windows Hello 的解锁体验。项目地址: https://gitcode.com/gh_mirrors/fa/FaceWinUnlock-Tauri
FaceWinUnlock-Tauri是一款基于 Tauri 框架开发的 Windows 面容识别解锁软件,它的核心套路是:通过自定义Credential Provider(凭据提供程序)DLL注入 Windows 登录界面,配合一套精心设计的注册表操作,让普通摄像头设备获得类似 Windows Hello 的刷脸解锁体验。这篇文章带你拆解它背后的完整原理:注册表写在哪儿、DLL 怎么被 Winlogon 加载、核心组件如何一步步部署到系统里。
三大核心组件:软件由哪几部分构成
在讲注册表之前,先理清整个项目的分工,这也是阅读 Server/README.md 中"核心架构"一节的思路:
| 组件 | 位置 | 职责 |
|---|---|---|
| 管理界面(UI) | UI/ | Vue 3 + Tauri 桌面应用,负责面容录入、选项配置、核心组件部署 |
| 凭据提供程序 DLL(Server) | Server/src/ | 注入 Winlogon 进程的 COM 组件,登录界面的"驻军" |
| 解锁服务(Unlock) | Unlock/ | 后台面容识别服务,通过管道把凭据"喂"给 DLL |
管理界面通过 Tauri 命令调用 Rust 后端完成部署动作,注册表写入逻辑位于 UI/src-tauri/src/modules/options.rs;部署成功后,整个链路就能跑起来了:
注册表操作详解:软件动了哪些"系统档案"
这是全文的重点。FaceWinUnlock-Tauri 对注册表的操作分成三个层次,各自作用完全不同。
1️⃣ 应用配置区:所有用户共享的设置仓库
管理界面在保存选项时,会把设置写入:
HKEY_LOCAL_MACHINE\SOFTWARE\facewinunlock-tauri写入逻辑在 options.rs 的write_to_registry命令中:先以HKEY_LOCAL_MACHINE为根创建(或打开)SOFTWARE\facewinunlock-tauri子项,再把一组key-value字符串值逐一写入。
为什么要用 HKLM 而不是 HKCU?因为登录阶段的 DLL 运行在系统级进程 Winlogon 中,它不属于任何用户会话,只能读到"所有用户"的配置。写在 HKCU 的设置在锁屏界面是"不可见"的。
2️⃣ DLL 读取区:加载时即生效的"启动参数"
DLL 在被 Winlogon 加载的瞬间(DllMain的DLL_PROCESS_ATTACH阶段),就会主动回读这个注册表项。核心函数read_facewinunlock_registry位于 Server/src/lib.rs,它使用 Win32 APIRegOpenKeyExW/RegQueryValueExW以只读方式打开 HKLM 下的配置项。
目前已知的读取项包括(见 Server/src/lib.rs#L251-L300 的DllMain):
DLL_LOG_PATH:DLL 日志文件存放路径。DLL 加载后立即在此目录下创建facewinunlock.log,方便排查登录阶段的问题;SHOW_TILE:是否在锁屏界面显示"软件磁贴"(CSampleProvider.rs#L172-L207),设为0即可隐藏磁贴。
这里体现了一个经典设计:DLL 本身不带配置,所有可改的开关都放在注册表里,用户修改设置后无需重新部署 DLL,下一次锁屏即生效。
3️⃣ 注入的关键:Credential Provider GUID 注册项
这是整个软件能"出现在"登录界面的根本所在。Windows 的凭据提供程序机制约定:凡是在下列路径注册了 GUID 子项的 COM 组件,都会被 Winlogon 自动加载:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{8a7b9c6d-4e5f-89a0-8b7c-6d5e4f3e2d1c}这个 GUID 与 DLL 中定义的CLSID_SampleProvider严格一致(Server/src/lib.rs#L121-L123)。系统加载 DLL 后会依次调用它导出的三个标准 COM 入口(见 Server/exports.def):
DllGetClassObject:按 CLSID 匹配后返回类工厂(lib.rs#L196-L229);DllCanUnloadNow/ 引用计数:保证 DLL 可被安全卸载。
一句话总结:注册 GUID = 拿到登录界面的"入场券"。
核心组件部署流程:初始化向导做了什么
部署动作由初始化向导 UI/src/views/Init.vue 驱动,分三步执行。
第一步:环境检测
调用check_admin_privileges与check_camera_status两个 Tauri 命令(lib.rs#L170-L175),确认管理员权限(写 HKLM 和 System32 的硬前提)与摄像头可用。
第二步:系统部署
点击"执行部署"后触发deploy_core_components(Init.vue#L72-L102),核心就是两件事:
- 复制 DLL到
C:\Windows\System32\FaceWinUnlock-Tauri.dll; - 修改注册表,在 Credential Providers 路径下写入 GUID 子项,并配置
HKEY_LOCAL_MACHINE\SOFTWARE\facewinunlock-tauri各项参数。
由于直接触碰 Winlogon 配置,向导会先弹出风险提示并强烈建议拍照留档,其中给出了崩溃时的自救路径——删 DLL 或删 GUID 注册项即可恢复:
⚠️ 这也是官方 README 反复强调的风险:错误修改注册表可能导致登录界面无法显示,建议在虚拟机中先试验。
第三步:账户验证
调用test_win_logon命令做一次真实测试:锁屏 → 通过已部署的 DLL 自动回注凭据 → 5 秒内自动解锁。走通这一步,才说明"注册表 + DLL"部署真正生效(Init.vue#L104-L140)。
注入之后:Windows 自动解锁的完整链路
部署完成后,每次锁屏解锁时 DLL 内部发生了什么?下面这张流程图(源自 Server/README.md 的实现流程)完整概括了四个阶段:
- 初始化阶段(DLL 加载):Winlogon 加载 DLL 执行
DllMain,经类工厂创建SampleProvider实例,读取注册表、获取 LSA 认证包 ID(CSampleProvider.rs#L233-L269); - 管道监听(Advise):系统回调
Advise时启动CPipeListener后台线程,等待凭据数据(CSampleProvider.rs#L86-L98); - 数据接收(管道通信):解锁服务(Unlock/)完成面容识别后,把用户名/密码经命名管道写入 DLL,
is_unlocked置位,通知系统重查GetCredentialCount,从而触发pbautologonwithdefault自动登录(CSampleProvider.rs#L172-L207); - 凭据序列化(登录):系统调用
GetSerialization,DLL 用CredPackAuthenticationBufferW将凭据打包为 LSA 可识别的序列化缓冲区,发送 LSA 校验,密码正确即登录成功(CSampleCredential.rs#L181-L191)。
管理界面侧对解锁服务的健康检查,同样走管道:向\\.\pipe\MansonWindowsUnlockRustUnlock写入探测数据即可判断服务是否在跑(api.rs#L245-L264)。
自启动与卸载:部署的另一面
自启动不走注册表 Run 键,而是用计划任务实现(api.rs#L188-L224):
schtasks创建名为FaceWinUnlockAutoStart的任务(Options.vue 中的调用),可选"登录时触发"或"开机时触发"两种模式;- 通过查询任务 XML 中是否含
<LogonTrigger>/<BootTrigger>来判断当前触发方式(api.rs#L289-L305)。
卸载则必须"走回原路":先在首选项中执行"卸载核心组件"(删除 DLL 与 GUID 注册项),再运行安装目录的uninstall.exe移除主程序。NSIS 安装脚本中通过 nsis/hooks.nsh 在安装/卸载前后自动taskkill解锁服务进程,避免文件被占用;最后手动清理残留的数据库与日志,即可做到无残留卸载。
总结
FaceWinUnlock-Tauri 的"注入"并不神秘,它严格利用了 Windows 官方留出的扩展点:
- 用HKLM 下的应用注册表项承载可热更新的配置,DLL 加载时即读;
- 用Credential Provider GUID 注册项拿到 Winlogon 的加载资格;
- 用System32 中的 DLL + 命名管道完成识别结果到登录凭据的最后一公里。
理解这三处注册表操作,你就掌握了它"驻留登录界面"的全部秘密——也清楚了为什么部署前留档、卸载时走官方流程如此重要。
📌 提示:本项目基于 2D 面容识别,存在被照片/视频绕过的风险,官方建议仅用于个人家用电脑或开发机,严禁用于存储高机密数据的办公环境(详见 README.md 的安全性说明)。
【免费下载链接】FaceWinUnlock-Tauri一款基于 Tauri 框架开发的现代化 Windows 面容识别解锁增强软件。它通过自定义 Credential Provider (DLL) 注入 Windows 登录界面,结合前端 Vue 3 和后端 OpenCV 人脸识别算法,为用户提供类似 Windows Hello 的解锁体验。项目地址: https://gitcode.com/gh_mirrors/fa/FaceWinUnlock-Tauri
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考