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

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

📁 深入研究Windows内部原理及内核调试相关介绍文档
💻 HTM
📖 第 1 页 / 共 5 页
字号:
height=189 src="深入研究Windows内部原理_files/image2.png" width=240 border=0></A>单击看大图 
<BR>“SeSystemTimePrivilege”是“更改系统时间”特权的内部名称,所有特权都保存在LSA的策略数据库中,该数据库会加载到HKLM\SECURITY注册表分支,用户登录系统时,LSA会读取这些特权值。</P>
<P>对于Windows XP专业版,我们可以通过“本地安全策略”管理单元查看用户所具有的特权。可以看到,“更改系统时间”特权仅授予管理员组和Power 
Users组用户,如附图所示,这就是为什么在Windows XP下,标准用户无法修改系统时间和时区的原因。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image3[1].png"><IMG 
style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" 
height=158 src="深入研究Windows内部原理_files/image3.png" width=240 border=0></A>单击看大图 
<BR><A class="" 
href="http://blogs.itecn.net/blogs/ahpeng/about.aspx"><STRONG><FONT 
color=#0080ff>盆盆</FONT></STRONG></A><FONT color=#0080ff>评注 笔者曾经写过一个<A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2005/06/27/346.aspx"><STRONG>连载</STRONG></A>,介绍帐户的登录权利所对应的HKLM\SECURITY注册表键值。可以用同样方法得出特权所对应的注册表键值。</FONT></P>
<P><B>实验准备</B><B></B> 
<P>现在我们已经知道,要修改系统时间,当前帐户必须具备“更改系统时间”特权。但是在Windows 
Vista下,默认不是只有标准用户权限吗,这时候应该没有“更改系统时间”特权!那么系统是如何获得“更改系统时间”特权的呢?我们用实验来进行验证。<BR><BR>1. 
实验工具<BR><BR>本实验在Windows 
Vista中文旗舰版上进行,测试帐户为Admin,是管理员组成员。为了查看进程的访问令牌,需要采用先前提到的Process Explorer工具,下载地址如下: 

<P><A 
href="http://www.microsoft.com/technet/sysinternals/utilities/ProcessExplorer.mspx">http://www.microsoft.com/technet/sysinternals/utilities/ProcessExplorer.mspx</A> 

<P>还有一个Process Monitor工具,下载地址如下: 
<P><A 
href="http://www.microsoft.com/technet/sysinternals/utilities/processmonitor.mspx">http://www.microsoft.com/technet/sysinternals/utilities/processmonitor.mspx</A><BR><BR>2. 
禁用安全桌面<BR><BR>由于“用户帐户控制”对话框默认运行在“安全桌面”上,这里的安全桌面就是我们按“Ctrl+Alt+Del”组合键所进入的桌面。但是为了改善用户体验,UAC的安全桌面并不是蓝绿色的背景,而是当前用户桌面桌面背景的截图快照(呈暗色显示)。 

<P><A class="" 
href="http://blogs.itecn.net/blogs/ahpeng/about.aspx"><STRONG><FONT 
color=#0080ff>盆盆</FONT></STRONG></A><FONT color=#0080ff>评注 参考盆盆<A 
href="http://blogs.itecn.net/blogs/ahpeng/archive/2007/02/25/psexec.aspx"><STRONG>翻译自Mark 
Russinovich的文章</STRONG></A>,了解如何强制用户必须按“Ctrl+Alt+Del”组合键,才能打开UAC的凭据输入对话框,这样可以确保凭据的安全。</FONT> 

<P>之所以启用“安全桌面”,主要是因为考虑到安全因素,以防其他进程可以对“用户帐户控制”对话框进行操作。但是由于本实验需要用工具对UAC的过程进行全程监控,所以需要临时禁用“安全桌面”功能,方法如下。 

<P>运行“secpol.msc”并回车,打开“本地安全策略”对话框,然后在左侧的控制台树里定位到本地策略→安全选项,在右侧详细窗格里双击“用户帐户控制:提示提升时切换到安全桌面”策略项,并选中“已禁用”选项,如附图所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image4[2].png"><IMG 
height=240 src="深入研究Windows内部原理_files/image4_thumb.png" width=217></A> 单击看大图 
<P><B>实验记录</B><B></B> 
<P>1.查看rundll32进程访问令牌 
<P>单击任务栏通知区域的时钟图标,然后单击底部的“更改日期和时间设置”链接,即可打开“日期和时间”窗口。正如您所预料的,这时候还不能对系统时间进行任何修改。同时可以在Process 
Explorer窗口中看到新增一个进程rundll32(呈绿色显示)。 
<P>双击该rundll32进程,即可打开其属性对话框。在“Image”标签页的“Command 
Line”文本框里可以看到“timedate.cpl”(“时间和日期”的控制面板扩展文件),如附图所示。这说明该rundll32.exe就是“时间和日期”控制面板组件的宿主进程。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image5[2].png"><IMG 
height=220 src="深入研究Windows内部原理_files/image5_thumb.png" width=240></A> 单击看大图 
<P>切换到“Security”标签页里,就可以看到该rundll32进程的访问令牌,可以看到在下方的特权列表里,只有少得可怜的五个个特权,而其中并没有SeSystemTimePrivilege特权!这就是为什么在默认情况下,无法在管理员环境下修改系统时间的原因。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image6[2].png"><IMG 
height=240 src="深入研究Windows内部原理_files/image6_thumb.png" 
width=214></A>&nbsp;单击看大图<BR><BR>2.提升权限 
<P>要能够修改系统时间,只需单击“日期和时间”窗口右下侧的“更改日期和时间”按钮,即可打开 
“用户帐户控制”对话框,单击“继续”按钮,如附图所示。现在应该可以修改系统时间了。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image7[2].png"><IMG 
height=211 src="深入研究Windows内部原理_files/image7_thumb.png" 
width=240></A>&nbsp;单击看大图<BR>看来这个“用户帐户控制”对话框负责向系统传递消息,以便系统确认用户同意提升操作权限。其本质似乎应该是修改相关进程的访问令牌,就本例来说,应该是在rundll32进程的访问令牌里添加SeSystemTimePrivilege特权。那么果真是这样吗? 

<P>结果很让人沮丧,重新打开rundll32进程的属性对话框,并切换到“Security”标签页,发现其访问令牌没有任何改变(并没有新增SeSystemTimePrivilege特权)! 

<P>这是为什么呢? 
<P>3.查看dllhost进程的访问令牌 
<P>反复重新做实验后,终于发现在“用户帐户控制”对话框上单击“继续”按钮后,系统会新增一个dllhost进程,在其进程属性对话框的“Image”标签页的“Command 
Line”文本框里可以看到“/Processid: {9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}”参数,如附图所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image8[2].png"><IMG 
height=240 src="深入研究Windows内部原理_files/image8_thumb.png" width=214></A> 单击看大图 
<P>搜索注册表得知,{9DF523B0-A6C0-4EA9-B5F1-F4565C3AC8B8}就是timedate.cpl的AppID,如附图所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image9[5].png"><IMG 
height=142 src="深入研究Windows内部原理_files/image9_thumb%5B3%5D.png" width=240></A> 
单击看大图 
<P>在dllhost进程的属性对话框上,切换到“Security”标签页,不出所料,dllhost进程的访问令牌里果然有SeSystemTimePrivilege特权,而且是启用状态,如附图所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image10[2].png"><IMG 
height=240 src="深入研究Windows内部原理_files/image10_thumb.png" width=214></A> 单击看大图 
<P>现在真相大白了,原来Windows 
Vista表面上让rundll32进程“明修栈道”,背地里却让dllhost进程“暗渡陈仓”,把完全的管理员令牌赋予该dllhost进程,真正让我们可以修改系统时间的是dllhost进程! 

<P>4.系统背后的动作 
<P>为了更好地对系统背后的动作进行监测,我们再启动Process Monitor,然后再重复上述的操作。 
<P>结果在Process 
Monitor里监测发现,单击“日期和时间”窗口右下侧的“更改日期和时间”按钮,发现由svchost进程(进程ID为1924)启动consent.exe进程,这个consent.exe进程就是“用户帐户控制”对话框,如附图所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image11[13].png"><IMG 
height=21 src="深入研究Windows内部原理_files/image11_thumb%5B11%5D.png" width=240></A> 
单击看大图<BR><BR><A class="" 
href="http://blogs.itecn.net/blogs/ahpeng/about.aspx"><STRONG><FONT 
color=#0080ff>盆盆</FONT></STRONG></A><FONT color=#0080ff>评注 在Windows 
Vista下,应该用Process Monitor代替Filemon和Regmon,Process 
Monitor除了可以监控注册表和文件活动外,还可以监控进程的活动,包括其堆栈信息。</FONT></P>
<P>双击这条记录,在打开的属性对话框上切换到“stack”标签页。在其堆栈信息中发现一个“appinfo.dll”模块,其描述为“应用程序信息服务”,如附图所示。原来这就是Windows 
Vista系统的“Application Information”服务,当系统确认进程需要管理员权限时,就会由“Application 
Information”服务负责启动consent进程,以便打开“用户帐户控制”对话框。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image12[2].png"><IMG 
height=240 src="深入研究Windows内部原理_files/image12_thumb.png" width=222></A> 
单击看大图<BR>在Process 
Explorer中打开consent进程的属性对话框,在“Image”标签页也可以发现consent的父进程的进程ID为“1924”(svchost进程),如附图所示。</P>
<P><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image13[2].png"><IMG 
height=170 src="深入研究Windows内部原理_files/image13_thumb.png" width=240></A>单击看大图 
<P>打开进程ID为1924的svchost进程的属性对话框,并切换到“Services”标签页,可以看到其下有“Application 
Information”服务,该服务以“appinfo.dll”的形式运行在svchost进程中,如附图所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image14[2].png"><IMG 
height=188 src="深入研究Windows内部原理_files/image14_thumb.png" width=240></A> 单击看大图 
<P>在“用户帐户控制”对话框上单击“继续”按钮后,系统获得来自用户的确认信息,接下来我们可以通过Process 
Monitor监测到由另一个svchost进程(进程ID为1376)加载dllhost的进程映像文件,如附图所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image15[2].png"><IMG 
height=62 src="深入研究Windows内部原理_files/image15_thumb.png" width=240></A> 单击看大图</P>
<P>双击这条记录,在打开的属性对话框上切换到“stack”标签页,在堆栈信息中发现一个“rpcss.dll”模块,其描述为“分布式COM服务”,如附图所示。原来这就是Windows 
Vista系统的“DCOM Server Process Launcher”服务,由该服务负责启动dllhost进程。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image16[2].png"><IMG 
height=240 src="深入研究Windows内部原理_files/image16_thumb.png" width=213></A> 单击看大图 
<P>在Process 
Explorer中双击打开进程ID为1376的svchost进程的属性对话框,并切换到“Services”标签页,可以看到其下有“DCOM Server 
Process Launcher”服务,该服务以“rpcss.dll”的形式运行在svchost进程中,如附图所示。<BR><A 
href="http://blogs.itecn.net/blogs/winternals/WindowsLiveWriter/WindowsVista_10C4B/image17[5].png"><IMG 
height=212 src="深入研究Windows内部原理_files/image17_thumb%5B3%5D.png" width=240></A> 
单击看大图 
<P><A class="" 
href="http://blogs.itecn.net/blogs/ahpeng/about.aspx"><STRONG><FONT 
color=#0080ff>盆盆</FONT></STRONG></A><FONT color=#0080ff>评注 “Remote Procedure 
Call 
(RPC)”服务也是以“rpcss.dll”的形式运行在另外一个svchost进程中。但是两个并没有服务共享同一个svchost进程,这是因为这两个服务的启动帐户不同。“Remote 
Procedure Call (RPC)”服务的启动帐户是NETWORK SERVICE,而“DCOM Server Process 
Launcher”服务的启动帐户是SYSTEM。</FONT></P>
<P>接下来在Process 
Monitor中,我们可以看到dllhost进程检查HKCR\AppID\{9DF523B0-A6C0-4EA9-

⌨️ 快捷键说明

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