Windows螢幕解鎖服務原理及實現(1)

路小路的日常發表於2023-05-06

https://github.com/zk2013/windows_remote_lock_unlock_screen

 

將生成的DLL註冊至登錄檔 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers ,之後的每次鎖屏或開機登入都會載入這個DLL。

實現這個DLL有相關的微軟文件:

ICredentialProvider 介面

ICredentialProviderCredential 介面

ICredentialProviderCredential2 介面

以上操作只實現了替換解鎖Windows的登入介面功能,接下來是實現自動登入(自動解鎖)。

 

實現自動解鎖需要有通訊機制傳送接收Windows賬號密碼,接收端程式碼裡使用的是 C++的 CreateNamedPipe (命名管道)。在 ICredentialProviderCredential 介面的現實方法 GetSerialization 內建立了一個 pipe,管道名是 \\.\pipe\NoninteractiveUnlockCredentialProvider,( \\.\管道\管道名。最多可達256個字元的長度,而且不用區分大小寫 )。

 

現在實現傳送端,使用 C++ 的 CreateFile (這是一個多功能的函式,可開啟或建立檔案或者I/O裝置,並返回可訪問的控制程式碼:控制檯,通訊資源,目錄(只讀開啟),磁碟驅動器,檔案,郵槽,管道。)傳送賬號密碼至管道 ( \\.\pipe\NoninteractiveUnlockCredentialProvider ) 。

 

接收端收到賬號密碼後,在 GetSerialization 方法內 透過 KerbInteractiveUnlockLogonInit 和 KerbInteractiveUnlockLogonPack 校驗登入。正確後觸發Windows登入機制並解開螢幕鎖。

 

相關文章