FlyingPig

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Vista 之前的系统,当用户使用管理员账户登录时,一个安全令牌会被创建,之后操作系统访问一些安全资源时会用到它,由 Windows Explorer 开始,这个安全令牌会同新创建的进程关联,进而也影响到它们的子进程。恶意软件也会使用这个安全令牌运行,它就能访问到任意的资源。

从 Windows Vista 开始,如果一个用户作为系统管理员登录,除了相应的安全令牌创建之外,还创建了一个受限令牌(Filtered token),这个令牌仅有标准用户的权限。从 Windows Explorer 开始,受限令牌与每一个新创建的进程相关联,如果一个用户要访问高安全的资源时,必须告诉操作系统提升权限,且只是在这个进程边界中执行,也就是说必须在进程开始之前申请,这就是用户账户控制。

自动提升一个进程的权限

如果一个应用程序必须使用管理员权限运行,比如程序的安装进程,每次你的应用程序运行时操作系统会自动提示用户进行权限提升。

可执行文件中如果被发现嵌入了一个特定类型的资源(RT_MANIFEST),那么系统会查找 <trustInfo> 部分并解析它的内容,以下是一个清单文件的一部分:

...
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
	<security>
		<requestedPrivileges>
			<requestedExecutionLevel level='requireAdministrator'/>
		</requestedPrivileges>
	</security>
</trustInfo>
...

另一种方法是将这部分内容放到一个后缀为 .manifest 的文件中,并将这个文件置于可执行文件相同的目录中。

除了使用清单文件外,系统还使用一组特定的规则将一个可执行文件识别为设置程序。

手动提升进程权限

CreateProcess 函数中没有选项与提升权限有关,用户可以使用 ShellExecuteEx(LPSHELLEXECUTEINFO pExecInfo) 函数手动申请一个进程提高执行权限,如果用户拒绝权限提升,ShellExecuteEx 返回 FALSE,GetLastError 返回 ERROR_CANCELLED。SHELLEXECUTEINFO 成员 lpVerb 必须设置为 “runas”,lpFile 成员包含要求提升权限的可执行文件的路径。一旦一个进程以提升的权限运行,它随后使用 CreateProcess 创建的子进程都会以相同的权限的执行,可是如果一个使用受限令牌启动的进程试图创建一个需要提升权限的进程,CreateProcess 会失败,GetLastError 返回 ERROR_ELEVATION_REQUIRED。

posted on 2011-01-21 11:48  nrj  阅读(1377)  评论(0编辑  收藏  举报