⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 深入研究windows内部原理.htm

📁 深入研究Windows内部原理及内核调试相关介绍文档
💻 HTM
📖 第 1 页 / 共 5 页
字号:
Service帐户可以访问,则服务进程并没有什么必要对这些对象进行访问。例如,在进程的访问令牌中,“NT 
AUTHORITY\SERVICE”帐户并没有Restricted的标志,如果某个对象仅给“NT 
AUTHORITY\SERVICE”帐户授予访问权限,而没有给其他带Restricted标志的帐户分配权限(例如服务SID、登录会话SID或者Everyone),则服务进程无法对该对象进行写入操作。</P>
<P>该进程中的服务只拥有受限的特权,因为图片底部所列出的特权只是Local Service帐户特权的一个子集。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_122E0/image{0}[2].png"><IMG 
height=240 src="深入研究Windows内部原理_files/image%7B0%7D_thumb.png" width=215></A></P>
<P><A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A><FONT 
color=#0080ff>译注:在Mark的文章里,提到会话(Session)隔离和登录会话SID(Logon 
Session)。一个是会话,还一个是登录会话,应该属于不同的概念。但是盆盆目前还不能很好地理解这两个概念各自的使用场景。<BR></FONT><FONT 
color=#0080ff>用Process 
Explorer很容易看出,在用户登录后,系统中存在两个会话,服务和一些系统级的进程运行在会话0,而用户进程运行在会话1。<BR>同样用Process 
Explorer很容易看出,系统中同时存在多个登录会话,多个用户进程共享一个登录会话(runas启动的进程也一样),但是每个服务进程都有独立的登录会话。每个登录会话都有一个相应的SID,可以在进程的访问令牌里看到Logon 
Session SID。<BR>盆盆最近在看Keith Brown所著的《Programming Windows 
Security》,觉得这本书很好,可以帮助理解很多原来不知道的底层安全原理,虽然是为Dev所写,但是不懂开发的盆盆照样觉得这书很好。</FONT></P>
<DIV class=postfoot>发表于 作者 <A 
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl01_AuthorLink 
href="http://blogs.itecn.net/user/Profile.aspx?UserID=2131">ahpeng</A> | <A 
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl01_CommentsLink 
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/25/windows-vista.aspx#comments">6 
评论</A> 
<DIV><SPAN 
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl01_InlineTagEditorPanel>归档在:<A 
href="http://blogs.itecn.net/blogs/winternals/archive/tags/Windows_895B6851_/default.aspx" 
rel=tag>Windows安全</A>, <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_ctl01_InlineTagEditorPanel_State 
type=hidden value=nochange 
name=bp$_$ctl00$_$RecentPosts$_$postlist$_$EntryItems$ctl01$InlineTagEditorPanel></DIV></DIV></DIV></DIV>
<DIV class=post>
<DIV class=postsubhead><A 
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl02_PermaLink 
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/25/insidevistakernel3.aspx">2007年3月25日 
18:06</A></DIV>
<DIV class=postsub>
<H2><A id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl02_PostTitle 
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/25/insidevistakernel3.aspx">深入理解Windows 
Vista内核三:改进的故障处理</A></H2>
<P>由于设备驱动存在错误、或者硬件存在问题,抑或是操作系统本身的原因,当系统遇到无法恢复的内核模式错误时,Windows会显示臭名卓著的“蓝屏死机”,随后强行中止系统,以防止磁盘出现数据冲突,同时根据系统配置的情况,还会把部分或者全部的物理内存写入到一个故障转储文件(crash 
dump 
file)。内存转储文件很有用,因为当我们死机后重启系统时,微软的在线故障分析服务(OCA)可以对其进行分析,以便找到问题的根源。如果我们愿意,还可以自己用<A 
href="http://microsoft.com/whdc/devtools/debugging"><U>Microsoft Debugging Tools 
for Windows</U></A>自己进行故障分析。</P>
<P><A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:有关如何用Debug工具分析系统故障的知识,可以参考张银魁老师的<A 
href="http://www.microsoft.com/china/technet/webcasts/live/episode.aspx?newsID=msft021207vxpm"><U>Webcast</U></A>。</P>
<P>然而旧版本的Windows,直到会话管理器进程(%Systemroot%\Sys&shy;tem32\Smss.exe)对页面文件进行初始化以后,才可以启用故障转储文件的支持。也就是说,在这以前,如果发生了严重的系统故障而导致系统蓝屏,并不会生成转储文件。而大量设备驱动程序是在Smss.exe进程启动之前进行初始化,所以早期的系统故障并不会触发转储文件的创建,所以对这些故障进行排错就非常困难。</P>
<P><A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:有关Windows 
2000/XP启动过程的介绍,可以参考张银魁老师的<A 
href="http://www.microsoft.com/china/technet/webcasts/live/episode.aspx?newsID=msft020207vxpm"><U>Webcast</U></A>。</P>
<P>而Windows 
Vista则大大提前了可以创建转储文件的时间。现在,在所有启动类型为“boot”的驱动程序启动以后,而在所有启动类型为“system”的驱动程序启动以前,就可以初始化转储文件的支持。有了这个改进,当我们在系统引导阶段遇到死机崩溃的故障,微软OCA服务就可以帮助诊断这个问题。而且,Windows 
Vista以64KB的块级别往转储文件里填充数据,而老版本的Windows则是以4KB为单位。这样大容量的内存转储文件,就能够以十倍的速度生成。</P>
<P><A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:启动类型为“boot”,是指由ntldr或者引导管理器加载的驱动程序。这些驱动程序比较重要,如果没有启动的话,Windows将无法继续引导。启动类型为“system”,是指内核初始化过程中启动的驱动程序。</P>
<P>在Windows 
Vista中,应用程序的故障处理也得到了很好的改进。在旧版本的Windows中,当应用程序发生故障时,会执行一个专门的处理程序(unhandled 
exception 
handler),以对这种无法正常处理的例外进行处理。例外处理程序会加载微软的应用程序错误报告(AER)进程(%Systemroot%\System32\Dwwin.exe),并且显示对话框,提示该程序出错,并询问是否需要把错误报告发送给微软。然而,如果该进程在崩溃时,主线程的堆栈被破坏,例外处理程序会在执行时崩溃,导致其进程被内核终止,结果是程序窗口一闪而过,根本没有显示任何错误报告对话框。</P>
<P>Windows Vista则将错误处理从崩溃进程的上下文中移走,而交由一个新的服务来处理,就是Windows Error 
Reporting(WER)服务。该服务运行在<STRONG>服务宿主进程</STRONG>中,是以DLL文件的形式实现的(%Sys&shy;temroot%\System32\Wersvc.dll)。当应用程序发生故障时,它还是会执行例外处理程序,但是例外处理程序会给WER服务发送一个消息,而由WER服务加载WER错误报告进程(%Systemroot%\System32\Werfault.exe),以显示错误报告对话框。如果因为主线程的堆栈被破坏而导致例外处理程序崩溃,例外处理程序就会反复地执行崩溃、崩溃执行,最终把线程所有堆栈空间消耗干净,当内核处于这个状态的时候,就会给WER服务发送故障通知消息。</P>
<P><A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:服务宿主进程,就是指svchost进程。</P>
<P>我们可以在以下四张图片中看到两种实现方法的对比。这些图片显示Accvio.exe进程和错误报告进程之间的关系,Accvio.exe进程是一个故障测试程序,可以触发一个应用程序崩溃。Windows 
Vista中新的错误处理机制意味着应用程序不再会悄无声息地中止,而妨碍我们向微软发送错误报告,以便帮助软件开发商改进他们的产品。<A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_FE46/image{0}[3].png"><BR><IMG 
height=164 src="深入研究Windows内部原理_files/image%7B0%7D_thumb%5B1%5D.png" 
width=404></A><BR>Windows XP的应用程序错误处理<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_FE46/image{0}[7].png"><IMG 
height=256 src="深入研究Windows内部原理_files/image%7B0%7D_thumb%5B3%5D.png" 
width=404></A><BR>Windows XP的错误报告对话框</P>
<P><BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_FE46/image{0}[11].png"><IMG 
height=296 src="深入研究Windows内部原理_files/image%7B0%7D_thumb%5B5%5D.png" 
width=404></A> <BR>Windows Vista的应用程序错误处理<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_FE46/image{0}[15].png"><IMG 
height=187 src="深入研究Windows内部原理_files/image%7B0%7D_thumb%5B7%5D.png" 
width=370></A> <BR>Windows Vista的错误报告对话框</P>
<P><A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:从图1中可以看出,Windows 
XP的错误报告进程dwwin是由发生错误的应用程序所启动,如果该应用程序的主线程堆栈被破坏,会导致无法弹出错误报告。而图3显示Windows 
Vista的错误报告进程WerFault是由svchost进程启动的(实际上是由svchost进程里的WER服务所加载),这样的相对独立机制,可以确保应用程序的错误都能被系统所捕获。</P>
<DIV class=postfoot>发表于 作者 <A 
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl02_AuthorLink 
href="http://blogs.itecn.net/user/Profile.aspx?UserID=2131">ahpeng</A> | <A 
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl02_CommentsLink 
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/25/insidevistakernel3.aspx#comments">4 
评论</A> 
<DIV><SPAN 
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl02_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_ctl02_InlineTagEditorPanel_State 
type=hidden value=nochange 
name=bp$_$ctl00$_$RecentPosts$_$postlist$_$EntryItems$ctl02$InlineTagEditorPanel></DIV></DIV></DIV></DIV>
<DIV class=post>
<DIV class=postsubhead><A 
id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl03_PermaLink 
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/22/insidevistakernel2.aspx">2007年3月22日 
23:08</A></DIV>
<DIV class=postsub>
<H2><A id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl03_PostTitle 
href="http://blogs.itecn.net/blogs/winternals/archive/2007/03/22/insidevistakernel2.aspx">深入理解Windows 
Vista内核三:BitLocker</A></H2>
<P>Windows Vista是目前最安全的Windows操作系统。除了包含Windows Defender防间谍软件引擎,Windows 
Vista还引入了很多安全和深度防御特性,包括BitLocker全卷加密特性,内核模式代码的代码签名,受保护的进程、地址空间随机加载(ASLR),还有Windows服务的安全改进和用户帐户控制(UAC)。</P>
<P>只有在运行的时候,操作系统才能强制执行其安全策略,所以为了防止系统的物理安全受到攻击,防止绕过操作系统访问数据,我们必须采用额外的方法来保护数据。BIOS密码和加密这样的基于硬件的机制,是我们常用的两种方法,可以阻止未经授权的访问,尤其是笔记本电脑(更容易被窃或者丢失)。</P>
<P>Windows 2000引入了EFS加密,而在Windows 
Vista中,EFS具有许多新的改进,包括性能的提升、支持页面文件加密、可以在智能卡里存储用户的EFS密钥。但是我们无法借助EFS来保护系统的某些敏感区域,例如注册表配置单元文件。举个例子,如果组策略允许我们不在域环境时登录到笔记本电脑,验证所用的域凭据就会缓存在注册表中,这样攻击者就可以使用工具获取域帐户密码的散列值,然后借助密码破解工具来破解域帐户的密码。然后攻击者就可以访问我们的帐户,并且偷获我们的EFS加密文件(假设我们没有把EFS加密密钥保存在智能卡里)。</P>
<P>为了方便加密整个启动卷(包含Windows安装目录的卷),包括所有系统文件和数据,Windows 
Vista引入了一个称为BitLocker的全卷加密特性。EFS通过NTFS文件系统驱动程序来实现,并在文件的级别上进行操作;而BitLocker则有所不同,它使用全卷加密驱动程序(FVE)(%Systemroot%\Sys&shy;tem32\Drivers\Fve&shy;vol.sys),在整个卷的级别上进行加密,如图1所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVistaBitLocker_10F4F/12.gif"><IMG 
height=416 src="深入研究Windows内部原理_files/1_thumb.gif" width=270></A></P>
<P>FVE是一个筛选级驱动程序,所以它能看到NTFS文件系统发送给卷的所有的I/O请求,写入的时候自动进行加密,而读取的时候自动进行解密,加密和解密过程是通过全卷加密密钥(FVEK)而进行的,初始化配置使用BitLocker时,会给Windows卷分配FVEK。默认情况下,会用一个128位的AES密钥和一个128位的Diffuser密钥对卷进行加密。因为加密和解密过程发生在NTFS 
I/O系统的下方,所以对NTFS来说,卷好像没有加密过,NTFS甚至根本不知道BitLocker的存在。但是如果在Windows系统的外面访问卷中的数据,则看上去像没有格式化过。</P>
<P>卷主密钥(VMK)对FVEK进行加密,并将其存放在卷的特殊元数据区域。根据系统硬件配置的不同,设置BitLocker时,我们有多个选项用来保护VMK。如果系统具有符合V1.2规范的TPM芯片,并且具有相应的BIOS支持,我们可以用TPM来加密VMK,既可以用TPM芯片里存储的密钥和USB闪盘里的密钥联合对VMK进行加密,也可以用TPM芯片里的密钥和开机时输入的PIN联合对VMK进行加密。如果系统没有TPM芯片,我们还可以用USB闪盘里的密钥对VMK进行加密。无论采用什么加密选项,我们都必须要准备一个至少1.5GB大小的NTFS卷作为引导扇区(不能进行加密),以便存放引导管理器(bootmgr)和引导配置数据库(BCD)。</P>
<P><A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/03/12/vistabook.aspx"><U>盆盆</U></A>评注:由此可见,VMK是所有加密选项的中转站,可以用不同的加密方法对VMK进行加密,这样如果一种加密方法失败(例如TPM芯片损坏),还可以通过另外一种方法(例如恢复模式)重新生成密钥链。</P>
<P>使用TPM的好处是,BitLocker可以借助TPM芯片来确保只有BIOS或者系统启动文件发生变动,系统就不会解密VMK,从而不会解锁Windows卷。第一次加密Windows卷,或者要更新前面提到的组件时,BitLocker会为每个组件自动计算出一个SHA-1散列值,并且在TPM设备驱动程序(%Systemroot%\Sys&shy;tem32\Drivers\Tpm.sys)的帮助下,把每个散列值(称作<STRONG>度量值</STRONG>,measurement)存放在TPM芯片里相应的PCR寄存器中。然后TPM对VMK进行封装,封装的操作需要用到存放在TPM芯片里的私钥(对VMK进行加密),还有存放在PCR寄存器里的值和BitLocker传递给TPM的其他数据。然后BitLocker会把封装后的VMK,还有加密后的FVEK,保存在加密卷的元数据区域。</P>
<P><A 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -