Windows的Logon过程

交互式登陆(相反的是网络登陆)通过Winlogon,LogonUI 和credential providers,LSASS,以及authenticatin packages,还有SAM或AD等组件产生的。

Authenticatin packages是一些执行认证检查的DLL。

  • Kerberos是用于域登陆的Windows authenticatin package。
  • MSV1_0是用于交互式登陆到本地计算机的Windows authenticatin package。(默认)

Winlogon 依赖于安装在系统上的credential provders,它获取用户的账号和密码。

Credential provders是DLL中的COM对象,默认的providers是%SystemRoot%\System32\authui.dll 和 %SystemRoot%\System32\SmartcardCredentialProvider.
dll,支持密码和智能卡认证。

为了防止因为Credential provders的Bug而导致Winlogon挂掉,实际上加载Credential provders的是Logon UI。

Winlogon是唯一从键盘获取登陆请求的进程,通过消息从win32k.sys通过RPC发过来。Winlogon立即启动LogonUI程序显示界面。获取用户名和密码后,WinLogon调用LSASS验证用户的身份。如果认证通过,登陆进程代表用户激活一个登陆shell。

流程如下图:

Windows的Logon过程_第1张图片 

为了支持其他 credential provider,LogonUI 可以加载其他网络的provider DLL用于二次验证。


Winlogon的初始化

  1. 创建并打开一个交互窗口(比如对象管理器中的\Sessions\1\Windows\WindowStations\WinSta0)。
  2. 创建两个桌面:1个是应用程序桌面,也就是\Sessions\1\Windows\WinSta0\Default,也叫做交互桌面。另一个是Winlogon桌面,\Sessions\1
    \Windows\WinSta0\Winlogon,也叫做安全桌面。只有Winlogon可以访问安全桌面。应用程序桌面则用户和Winlogon都可以访问。这种安排意味着任何时候Winlogon桌面都是激活状态,且没有其他进程可以访问安全桌面。Windows用安全桌面来保护安全涉及密码的锁和解锁桌面的操作。
  3. 没有用户登陆之前,可见的桌面是Winlogon桌面。有一个用户登陆后,按下SAS的3个键把切换默认桌面到Winlogon并启动Logon UI。这也解释了为什么所有交互桌面的窗口在SAS以后看起来像消失了。SAS永远会可以启动Winlogon控制的安全桌面。
  4. 与LSASS的LsaAuthenticationPort.建立一个ALPC连接,此连接用于在登陆,登出和密码操作时交换信息,由LsaRegisterLogonProcess操作。
  5. 注册Winlogon RPC消息服务器,从Win32k 监听SAS,Logff和锁屏通知。防止SAS按下后木马控制屏幕。
当Winlogon桌面创建后,变成激活的桌面。当Winlogon桌面是激活状态时,永远都是锁状态。仅在切换到应用程序桌面或屏幕保护时Winlogon才解锁其桌面。 只有Winlogon进程可以锁或解锁桌面。

用户登陆过程

SAS之后,Winlogon启动LogonUI,然后调用credential provider获取账号和密码。winlogon还创建一个唯一的SID给用户,然后把SID传给LsaLogonUser函数。如果登陆成功,SID将被包含在登陆token中,用于保护访问桌面。例如,当另一个相同账号从其他系统登陆过来时将不能写 第一个桌面,因为第二个登陆没有第一个登陆的token。

当账号和密码输入后,winlogon通过调用LSASS的LsaLookupAuthenticationPackage函数获取一个package的handle。Authentication packages都存储在注册表的HKLM\SYSTEM\CurrentControlSet\Control\ 下。Winlogon通过LsaLogonUser函数把登陆信息传给authentication package。一旦package通过认证此用户,Winlogon继续登陆,如果没有任何一个package能够验证成功,则登陆过程中止。


你可能感兴趣的:(Windows,内核原理)