最近经常有学生询问Win2008的启动相关问题以及早期Windows版本与vista或win2008并存时的启动问题,现在可以说正是处于操作系统新旧版本的过滤时期,这类问题会在一定时间内越来越多,所以本人就写了这篇文章来谈论一下新版操作系统的启动原理以及如何解决新旧两种操作系统并存时的故障。
我们还是先来看一下WinXP/2003的启动过程,这个启动过程其实还是挺复杂的,我在此画了一个草图:
当然这个图并没有把整个启动过程中所涉及到的细节都描述出来,但主要部分已经有了,我们在此不进行详细描述,例如:系统自检成功后读取MBR中的前446个字节的引导信息等,这些不是咱们今天讨论的重点,我们只说说较为重要的几点:
其中最为重要一步就是NTLDR:这个程序位于C盘根目录下如图所示:
NTLDR:全称为NTOS Loader,操作系统加载程序。它的主要作用是解析Boot.ini文件,通过读取Boot.ini文件,使系统在启动过程中出现选择菜单,由用户选择希望启动的操作系统。除了NTLDR我们可以看到在C盘根目录下还有一个boot.ini文件,这个文件在xp/2003中也是相当有分量的一个家伙!
BOOT.INI:简称为启动菜单文件,这个文件中存放了我们当前机器中操作的配置信息,安装了几个操作系统?分别位于哪个分区?给用户的选择提示是什么?默认选择时间是多长?等等。
NTLDR除了读取BOOT.INI文件中的启动配置信息之外还会加载并执行C盘根目录下的NTDETECT.COM文件,收集系统的硬件信息,NTDETECT.COM文件会调用BIOS中的内容来得到基本的硬件信息返回NTLDR以供操作系统使用,并将此信息保存到注册表中。
如果上述操作没有问题就会再现我们比较熟悉的进度条了!
然后就是加载Windows的内核文件:NTOS,全称为:NTOSKRNL.EXE文件以及它所依赖的模板文件,如图所示:
再往下就会将程序的执行权交给NTOSKRNL.EXE,下面的工作就由NTOSKRNL.EXE负责了!NTOSKRNL.EXE程序会通过调用一系统的函数,这也是整个启动过程中最复杂的地方,也是最容易出现问题的地方,如果这一部分没有问题,那么就会生成系统的第一个进程:SMSS
SMSS:会话管理子系统 Session Manager SubSystem 这是第一个用户态的进程。会执行一些注册表中某些表键中所定义的操作:如bootexecute、pendingfilerenameoperations、paging file等创建会创建出 CSRSS系统服务器进程和Winlogon登录进程。
CSRSS:Client/Server Runtime Server Subsystem作用:客户端服务子系统,用以控制Windows图形相关子系统,是用户模式Win32子系统的一部分。csrss代表客户/服务器运行子系统而且是一个基本的子系统必须一直运行。csrss用于维持Windows的控制。
Winlogon:Windows登录进程,主要作用是启动LSASS进程(Local Security Authority Subsystem Service);如果是XP还会启动Logonui进程,如果是Win2003就不会生成logonui;出现登录提示框,提示用户输入用户名和密码,然后将些信息交给LSASS进行验证,如果通过就会创建一个访问令牌,最后由userinit程序执行用户登录和初始化脚本,至此,出现桌面后,我们的启动工作就完成了。但在winlogon对用户进行验证的同时还会启动services相关系统服务。
Winlogon的过程其实还是很复杂的,因为中间涉及到用户的认证和授权的问题,在此还是想简单说一说,我们登录系统的方式主要交互式登录、系统登录、网络登录、服务登录和批处理登录。用到最多的有交互式登录、系统登录、网络登录和服务服务,当然用户最熟悉的肯定是交互式登录,也就是人坐在电脑前,与你的爱机直接面对面的“交流”!那么咱们就把交互式登录的过程大体说一下:
首先Winlogon作为登录进程首先出现,准备一个用户登录的环境。然后开始加载一个DLL文件:MSGINA.DLL,此文件作用是在屏幕上出现一个“Ctrl+Alt+Del”的界面,提示用户输入用户名和口令, 然后将收到的信息交给下一个进程:LSASS进程,进行用户身份的认证,当然这里又会有很多问题:工作组用户的认证、单域用户的认证、不同域用户的认证等等,但不论是哪一种情况,都必须由LSASS进程负责认证。其中会涉及到一个服务:Netlogon,此服务主要是验证NTLM的登录、认证。如果是域的环境会帮助客户机更新主机的DNS记录以及定位域控制器,这也就是我们在联系域控制器不成功时为什么重新启动netlogon这个服务的原因!我们抛开过旧的操作系统不谈,那么工作组环境一般使用的认证协议为:NTLM协议,如果是域环境使用的认证协议为:Kerberos V5协议。
NTLM:使用的是挑战/响应模式,过程如下:
首先是客户端发出一个连接请求,请求对方对自己的身份进行认证。但没有传具体口令。
服务器端会给随机发送一个8字节的挑战信息,如:1234567812345678,然后将这个挑战信息和当前session关连起来。
客户端收到挑战信息后进行如下工作:a.根据自己的明文口令经过md4哈希后得到一个16字节的口令散列值;b.然后利用刚才得到的散列值将准备登录的服务器名或者是域名等信息再次进行md5加密得到第二次的hash散列值;c.然后再利用第二次的散列值把8个字节的挑战信息再次进行md5加密,又得到一个16字节散列值;d.最后将这个值作为响应传给服务器。
最后服务器端怎么做,才知道你是不是一个合法用户呢?因为服务器是有你的口令明文的,利用你的口令明文也做相同的操作,如果结果匹配,就认为对方是一个合法的用户!
Kerberos V5主要是对用户的身份进行验证并为用户颁发用于访问网络服务的票证,适合于域等开放环境。认证过程是一个很复杂的过程,在此我只能是简单说说而已。
首先:客户端通过DNS定位KDC服务器
其次:客户端用户使用密码或者是其他方式如智能卡向KDC请求票证授予票证(Ticket-Granting Ticket, TGT),这个请求在登录时会自动完成。要获取特定服务的其他票证,需要票证授予票证。票证授予票证类似于护照。与护照一样,票证授予票证可标识您的身份并允许您获取多个“签证”,此处的“签证”(票证)不是用于出国,而是用于远程计算机或网络服务。
然后:KDC对用户的身份进行验证,如果没有问题可创建票证授予票证,并采用加密形式将其发送回客户机。
再次:客户机使用其口令来解密票证授予票证(TGT),得到有效的TGT后,客户端使用该TGT票证访问授票服务(TGS)。
再次:TGS接着向客户端颁发服务票证。
最后:客户端向所请求的网络服务出示服务票证。服务票证向此服务证明用户的身份。同时也向该用户证明服务的身份。
Winlogon进程
Msgina.dll文件
Netlogon服务
以上只是用草草几句话把Winxp/2003的启动过程作了一个大体的介绍,从其中我可以看到NTLDR和boot.ini起了重要的作用,这也是和Vista/Win2008的不同之处。下面咱们就来看看Vista/2008的启动过程。
我们知道在XP/2003中进行操作系统加载的文件是NTLDR,然后再读取boot.ini文件但这两个文件已经到了寿终正寝的时候了!在VISTA以后的操作系统中我们再也见不到亲爱的NTLDR和Boot.ini了!呜。。。。。。
Vista/2008的启动流程,如图所示:
在这个图中,大家可以看到从系统启动到BIOS到MBR这一部分内容基本上和早期版本操作系统是一样的,不用多说,那么这个PBR是什么东西呢?
PBR:分区引导记录 Partition Boot Record
由Vista