免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

从磁贴到桌面:FaceWinUnlock-Tauri 人脸识别解锁与LSA登录流程源码解析

从磁贴到桌面:FaceWinUnlock-Tauri 人脸识别解锁与LSA登录流程源码解析 从磁贴到桌面FaceWinUnlock-Tauri 人脸识别解锁与LSA登录流程源码解析【免费下载链接】FaceWinUnlock-Tauri一款基于 Tauri 框架开发的现代化 Windows 面容识别解锁增强软件。它通过自定义 Credential Provider (DLL) 注入 Windows 登录界面结合前端 Vue 3 和后端 OpenCV 人脸识别算法为用户提供类似 Windows Hello 的解锁体验。项目地址: https://gitcode.com/gh_mirrors/fa/FaceWinUnlock-TauriFaceWinUnlock-Tauri是一款基于 Tauri 框架开发的 Windows 面容识别解锁软件。它的核心思路很“硬核”通过自定义凭据提供程序Credential ProviderDLL 注入 Windows 登录界面让普通摄像头也能实现“看一眼就进桌面”的自动解锁体验。本文将带你读懂它的凭据序列化与 LSA 登录流程源码。一图看懂 Windows 面容解锁全流程在动手读源码前先建立全局视角。整个自动解锁过程分为四个阶段DLL 加载初始化 → 管道监听 → 凭据数据接收 → 凭据序列化并登录最终由 LSA本地安全机构校验密码成功则进入桌面这张图就是 Server/README.md 中的实现流程建议对照后文的四个阶段逐个拆解。核心架构四个角色各司其职DLL 工程位于 Server/src/ 目录由四个核心部分组成模块职责源码文件lib.rsCOM DLL 出口管理注册与引用计数lib.rsCSampleProvider实现ICredentialProvider管理磁贴生命周期CSampleProvider.rsCSampleCredential实现ICredentialProviderCredential将密码打包为系统序列化缓冲区CSampleCredential.rsCPipeListener独立后台监听线程负责与主程序的管道通信CPipeListener.rs 简单理解Provider 是房东管理登录界面上的磁贴Credential 是租户真正提交凭据的那个磁贴PipeListener 是快递员把面容识别到的用户名密码送进来。COM 出口系统如何找到这个 DLLWindows 登录界面通过 COM 机制加载凭据提供程序。lib.rs 中导出了两个关键函数DllGetClassObjectWinLogon 按 CLSID 请求创建凭据提供程序实例DLL 返回SampleClassFactory类工厂完成实例化见 lib.rs#L138-L176DllCanUnloadNow基于全局原子计数器G_REF_COUNT判断 DLL 是否可安全卸载避免登录界面崩溃见 lib.rs#L233-L245。配套的 exports.def 声明了这组导出符号确保 DLL 对外暴露标准的 COM 接口LIBRARY winlogon EXPORTS DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE DllMain PRIVATE另外DllMain在DLL_PROCESS_ATTACH时从注册表SOFTWARE\facewinunlock-tauri读取日志路径并初始化日志系统lib.rs#L251-L300这是后面排查问题的关键入口。阶段一DLL 加载与磁贴显示登录界面启动后WinLogon 加载 DLL 并创建SampleProvider实例。此时系统会调用SetUsageScenario告知当前场景登录、解锁、切换用户等SampleProvider会把场景存入内部状态CSampleProvider.rs#L69-L74。磁贴是否显示由注册表SHOW_TILE控制。GetCredentialCount会读取该配置CSampleProvider.rs#L181-L187决定登录界面上是否出现那个请勿点击此磁贴的提示图标——这也是软件支持隐藏磁贴功能的原理。如上图初始化向导的最后一步需要选择账户类型本地账户 / 联机账户并填写 Windows 用户名和账户密码注意不是 PIN 码。这一步会在注册表中写入 DLL 所需的配置为后续 WinLogon 层认证做准备。阶段二命名管道——面容数据与登录界面的暗道关键点来了面容识别由桌面端的 Tauri 程序UI/src/完成而 DLL 运行在 WinLogon 的登录界面进程中两者属于不同的安全层级无法直接对话。CPipeListener就是打通两者的暗道。在系统调用Advise注册事件通知时CSampleProvider.rs#L86-L98DLL 会启动管道监听线程监听线程创建命名管道等待用户名和密码传入主程序完成 OpenCV 人脸比对 活体检测后通过管道把凭据投递进来DLL 将收到的凭据写入共享结构SharedCredentials含 username、password、domain、is_ready 四字段定义于 lib.rs#L126-L131并把is_unlocked标志置为 true。还有一个容易被忽略的细节锁屏界面黑屏后Windows 会调用UnAdviseCSampleProvider.rs#L101-L117。如果此时不停止管道监听线程就会发生内存泄漏——这是作者在 v0.2.0 修复过的真实 Bug。上图中的锁屏后面容识别延迟正是控制主程序何时开始调摄像头的参数识别通过后才会触发阶段二的管道投递。阶段三凭据序列化与 LSA 登录流程这是整篇文章最精华的部分。管道数据到达后登录流程被接力触发第 1 步宣布我准备好了。系统重新调用GetCredentialCountDLL 发现is_unlocked为 true就返回*pbautologonwithdefault true等于告诉 Windows请用默认凭据自动登录CSampleProvider.rs#L193-L203。第 2 步取出磁贴实例。系统调用GetCredentialAt(0)DLL 创建并复用SampleCredential实例此时会把管道传来的用户名密码一并传入CSampleProvider.rs#L211-L230。第 3 步凭据序列化核心。系统调用GetSerializationDLL 用 Win32 APICredPackAuthenticationBufferW把明文用户名 密码打包成 Windows 能识别的认证缓冲区填入CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION结构并指定认证包 IDCSampleCredential.rs#L181-L191。第 4 步交给 LSA 校验。序列化数据和认证包 ID 被提交给 LSALocal Security Authority本地安全机构完成登录验证。认证包 ID 从哪来SampleProvider::new中会调用retrieve_negotiate_auth_package()先通过LsaConnectUntrusted建立与 LSA 的连接再用LsaLookupAuthenticationPackage查找名为Negotiate的认证包 ID最后释放连接CSampleProvider.rs#L234-L269。Negotiate 是 Kerberos/NTLM 的协商封装器本地账户和微软账户都能走通这也是软件能同时支持双账户解锁的底层原因。密码正确 → 登录成功进入桌面认证失败 →ReportResult回调CSampleCredential.rs#L194-L204上报错误状态界面上会显示失败提示并进入重试逻辑。软件界面与源码的对应关系界面功能源码/配置位置系统初始化写入注册表、部署 DLLUI/src-tauri/src/modules/init.rs磁贴显示开关SHOW_TILECSampleProvider.rs面容录入与账户关联UI/src/views/Faces/解锁日志查看UI/src/hook/useUnlockLog.jsDLL 通过 lib.rs 的read_facewinunlock_registry读取注册表配置如SHOW_TILE、DLL_LOG_PATH而主程序通过 UI/src-tauri/src/modules/options.rs 写入这些配置——两端由此保持同步。⚠️ 安全与局限性提醒管道未加密当前管道通信传输明文凭据本地恶意软件理论上可能嗅探到密码见 Server/README.md 的安全警告2D 识别风险相比 Windows Hello 的 3D 结构光2D 面容识别存在被照片、视频绕过的风险建议仅用于安全性要求不高的个人家用电脑系统级风险本项目涉及注册表修改与 Winlogon 进程操作建议先在虚拟机中调试并在初始化第 2 步拍照留档以便恢复。总结回顾整条链路WinLogon 加载 DLL → Advise 启动管道监听 → 面容识别结果经管道投递 →GetCredentialCount宣布自动登录 →GetSerialization完成凭据序列化 → LSA 校验凭据 → 进入桌面。FaceWinUnlock-Tauri 的巧妙之处在于它没有绕过Windows 的安全体系而是用标准 COM 凭据提供程序 标准 LSA 认证流程让自动投递密码这件事在系统认可的框架内完成。理解这套源码你也就掌握了 Windows 登录界面扩展开发的完整知识图谱。 项目源码说明核心 Rust 代码自 v0.3.2 后已闭源Server/src/ 下保留的 Provider / Credential 骨架代码已足够理解整体架构。【免费下载链接】FaceWinUnlock-Tauri一款基于 Tauri 框架开发的现代化 Windows 面容识别解锁增强软件。它通过自定义 Credential Provider (DLL) 注入 Windows 登录界面结合前端 Vue 3 和后端 OpenCV 人脸识别算法为用户提供类似 Windows Hello 的解锁体验。项目地址: https://gitcode.com/gh_mirrors/fa/FaceWinUnlock-Tauri创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表