📄 深入研究windows内部原理.htm
字号:
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:本以为BitLocker会把加密后的VMK和FVEK存放在不加密的引导卷中,而不会存放在加密卷中(否则相当于把钥匙忘在房间里)。但实际上确实保存在加密卷的元数据区域。</P>
<P>当系统启动时,会把自己的散列值和PCR加载代码进行比较,并把该散列值写入到TPM芯片的第一个PCR寄存器中。然后会计算BIOS的散列值(度量值),并将该度量值存放在合适的PCR寄存器中。接下来BIOS会给启动序列中的下一个组件(引导扇区的主引导记录)计算散列值,然后该过程会一直持续,直到操作系统加载程序也已经计算出度量值并进行比较。其后运行的每段代码都需要负责对其加载的代码计算度量值,并负责把度量值存储到TPM芯片里相应的PCR寄存器中。最后,当用户选择引导的操作系统,引导管理器(bootmgr)会从该卷中读取加密的VMK,并请求TPM对其进行解密。只有当所有的度量值都和VMK封装时的结果一样,包括可选的PIN,TPM才能成功解密VMK。</P>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:由于引导卷上的文件,包括bootmgr和bcd都不能被加密,所以TPM芯片可以提供一个比较好的方法,通过计算其散列值来确保这些文件没有被篡改。</P>
<P>我们可以把这种机制想象为信任链,在这个信任链中,启动序列里的每一个组件都要向TPM描述其后的组件。只有全部的描述都和原始的组件相匹配,TPM才能成功进行解密。这样的话,就算把磁盘拆卸下来,放在另外一个系统上,并用另外一个操作系统引导该系统,或者引导卷上的未加密文件已经受到攻击时,BitLocker依然可以对加密数据提供保护。</P>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:BitLocker可以很好地保证系统的启动安全,就算TPM芯片和整个磁盘都被攻击者获取,虽然系统已经释放出VMK,但是由于帐户密码的存在,攻击者还是无法获取加密数据,因为攻击者无法采用常规方法破解帐户密码。</P>
<DIV class=postfoot>发表于 作者 <A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl03_AuthorLink
href="http://blogs.itecn.net/user/Profile.aspx?UserID=2131">ahpeng</A> | <A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl03_CommentsLink
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/22/insidevistakernel2.aspx#comments">4
评论</A> <SPAN id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl03_Ratings
title="票数 优秀 [5 out of 5 / rated 1 time(s)]."></SPAN><INPUT
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl03_Ratings_Value
type=hidden value=5>
<DIV><SPAN
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl03_InlineTagEditorPanel>归档在:<A
href="http://blogs.itecn.net/blogs/winternals/archive/tags/Mark+Russinovich_80622F678765E07AFB7FD18B_/default.aspx"
rel=tag>Mark Russinovich技术文章翻译</A></SPAN><INPUT
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl03_InlineTagEditorPanel_State
type=hidden value=nochange
name=bp$_$ctl00$_$RecentPosts$_$postlist$_$EntryItems$ctl03$InlineTagEditorPanel></DIV></DIV></DIV></DIV>
<DIV class=post>
<DIV class=postsubhead><A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl04_PermaLink
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/22/InsideVistaKernel1.aspx">2007年3月22日
13:01</A></DIV>
<DIV class=postsub>
<H2><A id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl04_PostTitle
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/22/InsideVistaKernel1.aspx">深入理解Windows
Vista内核三:内核事务管理</A></H2>
<P><STRONG>说在前面:</STRONG>Mark Russinovich共为《TechNet Magazine》写了三篇有关《深入了解Windows
Vista内核》的系列文章,这是本系列中的最后一篇。尽管在微软网站上,前两篇文章有汉语的译文,但是有些地方似乎并不到位。乘第三篇英文原稿刚刚发布,盆盆抢先一步翻译,先让ITECN的读者朋友尝尝鲜,翻译得也不能说好,但是盆盆已经用心了。以下就是正文部分。
</P>
<P>到目前为止,这个系列文章涵盖了Windows
Vista内核的增强,包括进程、I/O、内存管理、系统启动、关机和电源管理。在第三、也是最后一个部分里,我们将讨论有关可靠性、恢复和安全方面的增强特性。
<P>在这个系列文章中,并没有讲述有关用户帐户控制(UAC)的原理,UAC实际上由一系列不同的技术组成,包括为旧版应用程序而准备的文件系统和注册表虚拟重定向、访问管理特权的提升权限提示、还有Windows完整性级别(用于将高特权进程和同一帐户下运行的低特权进程隔离开)。还将会在《TechNet
Magazine》上发表一篇有关UAC内部原理的文章,届时大家可以阅读。
<P>Windows
Vista提供许多最新特性和改进,帮助提升系统的稳定性,并且方便我们对系统和应用程序的问题进行排错。例如,Windows内核事件跟踪记录程序(ETW)会持续工作,以便把文件、注册表、中断和其他类型的活动事件记录到一个循环缓存中。如果出现问题,新的Windows诊断基础结构(WDI)特性就会从该循环缓存里捕获一个快照,并在本地进行分析,或者上传到微软的相关故障诊断站点。
<P>新的可靠性和性能监视器可以帮助我们进行故障排错,例如系统崩溃或者挂起,还有对系统配置所进行的修改。如果要对无法启动的系统进行离线排错,我们现在可以使用强大的系统恢复工具(SRT),而不再需要借助故障恢复控制台。
<P>有三大部分和系统内核级别的改变有关,所以应该深入了解一下文章里以下三大部分:内核事务管理器(KTM)、更好的故障处理,以及“以前的版本”特性。
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:“以前的版本”特性,基于系统的卷影副本和系统还原的功能。可以方便地把文件或者目录恢复到先前所备份的版本。
<P><STRONG>内核事务管理器</STRONG>
<P>对软件开发来说,其中一个最让人头痛的地方就是错误处理的条件判断。在以下情况中,显得尤其正确:例如在执行高级操作的过程中,应用程序已经完成了一个或者多个子任务,可能导致文件系统或者注册表的修改。举个例子,应用程序的软件更新服务可能会修改某些注册表键值、替换应用程序的其中一个可执行文件,但是当试图替换第二个可执行文件时拒绝访问。为了确保该应用程序的一致性,软件更新服务必须能够跟踪所有的修改,以便可以撤销这些修改。对错误恢复代码进行测试,是非常困难的,而且通常会忽略,所以恢复代码里的错误会抹杀其功效。
<P>在内核事务管理器的帮助下,Windows
Vista应用程序只需要付出很小的努力,就可以使用NTFS文件系统和注册表的最新事务支持特性,获得自动错误恢复的能力。当应用程序要进行大量相关修改时,它既可以创建DTC事务和KTM事务句柄,也可以直接创建KTM句柄,然后把文件和注册表键值的修改和该事务相关联。如果所有的修改能够顺利完成,应用程序就会递交该事务,这样修改就能最终生效,但是只要还没有达到这一点,应用程序都可以撤销该事务,从而丢弃所做的任何修改,以确保应用程序的一致性。
<P>还有一个好处是,除非已经递交某个事务,否则其他应用程序无法看到该事务中所作的修改。在Windows Vista和今后发布的Windows Server
Longhorn中,如果应用程序使用DTC,则可以把它们的事务和SQL
Server、MSMQ等数据库进行交互协调。因此,使用KTM事务的更新服务可以确保应用程序始终处于一致的状态。这就是为什么Windows
Update和系统还原使用KTM事务的原因。
<P>作为事务支持的核心,KTM允许NTFS和注册表这样的事务资源管理器,与应用程序所做的一组特定修改之间进行协调。在Windows
Vista中,NTFS使用一个称作TxF的扩展功能来支持事务。注册表则使用一个名为TxR的类似扩展功能。这些内核模式的资源管理器和KTM一起工作,以协调事务状态;就好像用户模式下的资源管理器使用DTC,在多个用户模式资源管理器之间协调事务状态。第三方也可以使用KTM来实现自己的事务资源管理器。
<P>TxF和TxR都定义了一组新的文件系统和注册表API,和已有的API类似,只是增加了事务相关的参数。如果应用程序需要用事务来创建文件,则它首先需要使用KTM创建事务,然后把所得的事务句柄传递给新的文件创建API。
<P>TxF和TxR都依赖于通用日志文件系统(CLFS)(%Sys­tem­Root%\System32\Clfs.sys)所提供的高速文件系统日志功能,CLFS最初是在Windows
Server 2003
R2中引入的。使用CLFS,TxF和TxR就可以在递交事务之前,持续保存事务状态的改变。这样就可以提供事务恢复能力,甚至在掉电时也可以确保。除了CLFS日志,TxR还在%Systemroot%\System32\Config\Txr目录下创建一组相关日志文件,以跟踪系统注册表文件的事务改变,如图1所示,同时还为每个用户的注册表配置单元文件创建一组不同的日志文件。<BR><A
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_8685/1[4].png"><IMG
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
height=347 src="深入研究Windows内部原理_files/1_thumb%5B2%5D.png" width=640
border=0></A>
在每个NTFS卷,TxF把事务数据存储在该NTFS卷下的\$Ex­tend\$RmMetadata目录下,该目录是隐藏的。</P>
<P><A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:\$Ex­tend\$RmMetadata目录是隐藏的,我们无法在Shell中直接查看,但是可以借助第三方工具进行查看,如图2所示。<BR><A
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_8685/2[2].png"><IMG
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
height=330 src="深入研究Windows内部原理_files/2_thumb.png" width=728 border=0></A></P>
<DIV class=postfoot>发表于 作者 <A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl04_AuthorLink
href="http://blogs.itecn.net/user/Profile.aspx?UserID=2131">ahpeng</A> | <A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl04_CommentsLink
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/22/InsideVistaKernel1.aspx#comments">4
评论</A>
<DIV><SPAN
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl04_InlineTagEditorPanel>归档在:<A
href="http://blogs.itecn.net/blogs/winternals/archive/tags/Mark+Russinovich_80622F678765E07AFB7FD18B_/default.aspx"
rel=tag>Mark Russinovich技术文章翻译</A></SPAN><INPUT
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl04_InlineTagEditorPanel_State
type=hidden value=nochange
name=bp$_$ctl00$_$RecentPosts$_$postlist$_$EntryItems$ctl04$InlineTagEditorPanel></DIV></DIV></DIV></DIV>
<DIV class=post>
<DIV class=postsubhead><A
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl05_PermaLink
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/02/insideuac.aspx">2007年3月2日
19:41</A></DIV>
<DIV class=postsub>
<H2><A id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl05_PostTitle
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/02/insideuac.aspx">Windows
Vista安全原理深入探索</A></H2>
<P> </P>
<P>本文是对<A class=""
href="http://blogs.itecn.net/blogs/ahpeng/about.aspx"><STRONG>盆盆</STRONG></A>以前发表过的文章《<A
href="http://blogs.itecn.net/blogs/ahpeng/archive/2005/11/20/Uap_5F00_TimeDate.aspx"><STRONG>UAC功能浅析</STRONG></A>》一文的改写和扩充。一方面老的那篇文章是根据Build
5231而写,内容比较陈旧,所以这次根据Windows Vista正式版本进行改写;另一方面,本文绝非简单的改写,<A
href="http://blogs.itecn.net/blogs/ahpeng/"><STRONG>盆盆</STRONG></A>还特地加入了自己最新探索和学习到的一些知识,希望能够让读者朋友满意。
<P><A class=""
href="http://blogs.itecn.net/blogs/ahpeng/about.aspx"><STRONG>盆盆</STRONG></A><FONT
color=#0080ff>评注 笔者在探索和学习Windows Vista安全理论的过程,深受《Windows Internals》一书的启发。该书由Mark
Russinovich和David Solomon所著,堪称IT Pro和Dev的圣经。</FONT>
<P><B>参考</B><B></B>
<P>用户帐户控制(UAC),是Windows
Vista新引入的安全机制。管理员登录Windows时,系统会同时创建两个访问令牌,其中一个是完全的管理员访问令牌(Full
Token),另一个是经过“过滤”的访问令牌,叫做标准用户访问令牌,如附图所示。当Windows系统启动Shell进程(Explorer.exe)时,LSA会把标准用户访问令牌连接到Shell进程,所以Windows
Vista启动的用户进程,默认都只具有标准用户权限。如果某个进程需要管理员权限,则系统会提示权限提升,得到用户亲自确认后,系统会把完全的管理员访问令牌连接到该进程上。<BR><A
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image1[6].png"><IMG
height=109 src="深入研究Windows内部原理_files/image1_thumb%5B4%5D.png"
width=240></A> 单击看大图<BR><B>准备知识</B><B></B>
<P>在《Windows Internals》的第八章“安全”部分,介绍了一个实例:当我们在Windows
XP里启动“日期和时间”控制面板组件时,实际上启动的是“rundll32”进程,由该进程加载“Timedate.cpl”控制面板组件。用Process
Explorer检查该“rundll32”进程的访问令牌,可以发现“SeSystemTimePrivilege”特权处于启用状态,如附图所示。<BR><A
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image2[1].png"><IMG
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -