欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

如何将自身进程运行为admin模式

张康宗
http://www.KZTechs.COM

Level:300

在Windows Vista里面,进程是分权限级别的。Windows会根据manifest内容、Windows Installer detection、兼容性数据库等方法判断一个进程是否需要一开始就运行在完整admin模式下。

但是不是所有的程序一开始就需要运行在完整admin模式下的,例如任务管理器TaskMgr.EXE。在Windows Vista里面,启动任务管理器以后,默认只能显示当前账户相关的进程信息,只有当点击下面这个按钮并回应UAC提示以后才能显示所有用户的进程信息:

Capture

请注意上面这张图片,Show processes from all users 按钮前面有一个Windows 安全中心的图标。这个表示这个操作需要触发UAC。这个倒是没有什么特别的。问题的关键在于:TaskMgr是怎么触发UAC的?

我们知道,一个没有完全admin权限的进程是没法直接创建更高权限进程的,也就是说一般权限下的进程是没法直接创建完全Admin权限进程的。因此CreateProcess API函数肯定是不能使用的。如果使用CreateProcessAsUser函数,那么需要提供一个比较高的令牌才能完成,这个需要有额外的来源,而TaskMgr显然不具备这种能力。那TaskMgr是怎么完成这个神秘的动作呢?

上述问题我思考了数个月,上网搜索也没有搜索到有价值的内容。直到昨天晚上才有空去调试一把,看看到底是怎么玩的。

我用windbg attach到 taskmgr 进程上,然后把所有的进程创建相关函数全部设置了断点,然后点击Show processes from all users 按钮,结果ShellExecuteExW函数被断下了,难道ShellExecuteExW有什么特殊的地方吗?查阅最新的MSDN关于ShellExecuteExW的说明文档,什么介绍都没有。是断点有问题吗?

继续使用windbg单步调试,当程序执行到下图的时候,有一个看起来很关键的函数调用:

Capture2

call    SHELL32!ShellExecuteNormal (7656e6ce),看到这个名字我的第一个直觉是这个是真正的执行函数,前面还有很多操作仅仅是一些检查步骤。当执行完call    SHELL32!ShellExecuteNormal (7656e6ce)指令以后,UAC框弹出了。看到UAC框的弹出,我已经可以确认任务管理器是使用ShellExecuteExW某个在MSDN上面没有公开的操作触发UAC的。根据前面的描述,call    SHELL32!ShellExecuteNormal (7656e6ce)指令是一个关键指令,因此需要检查call    SHELL32!ShellExecuteNormal (7656e6ce)指令之前的参数操作。

呵呵,这回我盯上了push esi指令了。

Capture3

windbg里面查看esi对应的内存内容以后发现可能是一个结构体,由于是ShellExecuteExW函数里面执行的,因此我猜测这个结构体是 SHELLEXECUTEINFO,对照SHELLEXECUTEINFO结构体的定义,果然和esi内容相符。最后一步就是检查结构体里面各个参数的情况了。当我发现LPCTSTR lpVerb指向的参数内容(db 0xe5d93c命令)是“runas”这个字符串的时候,Taskmgr 将自身提示为完全admin权限的方法也就揭晓了:

在Windows Vista里面,ShellExecuteExW lpVerb的参数可以传入runas命令,使得系统调用 ShellExecuteExW  的时候,会强制将目标文件以完全admin模式启动,即使目标文件的manifest没有申明需要完全admin权限。

效果等同于在目标程序上右键点击,然后选择 run as administrator 菜单内容。

幕后:当全部搞定以后,我上网google了一下,发现这个方法早有人提及了,而且还是在 Vista Compatibility Team Blog 上面,我花的1个多小时全部白费了,为啥先前都没有搜索到呢??郁闷。

已发表 2007年12月7日 8:02 作者 smallfrogs

评论

# re: 如何将自身进程运行为admin模式

2007年12月7日 9:46 by Shrek

# Windows Vista UAC 和 可信任安全

2007年12月31日 17:29 by KZTechs.COM - Smallfrogs' Technical BLOG

Smallfrogs[张康宗] http://www.KZTechs.COM Level 200 UAC,Windows Vista 里面重要构成部分。对 Windows 安全保护起着绝对重要用途。 但是,UAC

# RTX 2008 Beta 1 导致 Windows Vista 无法使用 Run as administrator 命令

2008年10月31日 10:42 by KZTechs.COM - Smallfrogs' Technical BLOG

张康宗(Smallfrogs) http://www.KZTechs.com 昨天晚上的时候发现,当右键点击Windows Vista的开始里面的快捷方式,选择 Run as administrator

该帖子已禁止评论