NetRoc's Blog

N-Tech

 

Vista下创建Admin权限进程初探

NetRoc/cc682

Vista Explorer创建进程时默认不会用管理员权限创建。但是从Explorer创建的进程可以是管理员权限,也可以是非管理员权限的。想了解一下创建时具体的区别在哪里,所以这两天稍微跟了一下。不过由于时间有限,也没办法很好的解决这个问题。

首先我写了个叫XXXInstaller.exe的测试程序,vista通过名字自动监测为需要Admin权限启动的程序(这一点在MSDN里面有描述),这里抄一点吧J

Installer Detection

Installation programs are applications designed to deploy software, and most write to system directories and registry keys. These protected system locations are typically writeable only by administrator users; this restriction means that standard users do not have sufficient access to install most programs. Windows Vista heuristically detects installation programs and requests administrator credentials or administrator approval in order to run with access privileges. Windows Vista also heuristically detects updater and un-installation programs. A design goal of UAC is to prevent installations from being executed without the user's knowledge and explicit consent since installations write to protected areas of the file system and registry.

 

总之,不管Vista怎么识别的,这个程序被自动识别成需要管理员权限启动。然后写了个程序测试了几个创建进程的函数。CreateProcess用以前的办法创建,会返回FALSE,用ShellExecute这样的shell函数会正常弹出创建管理员权限进程的对话框。所以,关键就在于ShellExecute里面那个CreateProcess的调用和通常调用有什么区别了。

逆了一下shell32.dll,发现ShellExecute函数最终调用到了int __stdcall _SHCreateProcess(int,HANDLE hToken,wchar_t *lpApplicationName,int lpCommandLine,DWORD dwCreationFlags,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,int,char,int);这个shell32的内部函数。并由_SHCreateProcess调用CreateProcess创建进程。

在调用CreateProcess的时候,STARTUPINFO结构不太一样了,vista下面新添加了STARTUPINFOEX结构,当dwCreationFlags参数包含EXTENDED_STARTUPINFO_PRESENT

0x00080000标志时,表示使用STARTUPINFOEX结构。这个结构的定义如下:

typedef struct _STARTUPINFOEX { 

STARTUPINFO StartupInfo; 

PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;

} STARTUPINFOEX,  *LPSTARTUPINFOEX;

前面部分还是STARTUPINFO,后面有一个PPROC_THREAD_ATTRIBUTE_LIST。这个结构就比较奇怪了,vista sdk里面只有一句typedef struct _PROC_THREAD_ATTRIBUTE_LIST *PPROC_THREAD_ATTRIBUTE_LIST, *LPPROC_THREAD_ATTRIBUTE_LIST;,而对struct _PROC_THREAD_ATTRIBUTE_LIST的定义却找不到了,文档里面也没有,google上面也搜不到,连到MSSymbol server也找不到……由于shell32的代码优化得比较厉害,所以也没能跟出来这个结构的具体定义。MSDN上描述了三个访问该结构的函数,不过由于都是通过指针传递参数的,MSDN上文档又很简略,所以也不太清楚。

BOOL WINAPI UpdateProcThreadAttribute(

  LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,

  DWORD dwFlags,

  DWORD_PTR Attribute,

  PVOID lpValue,

  SIZE_T cbSize,

  PVOID lpPreviousValue,

  PSIZE_T lpReturnSize

);

BOOL WINAPI InitializeProcThreadAttributeList(

  LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,

  DWORD dwAttributeCount,

  DWORD dwFlags,

  PSIZE_T lpSize

);

VOID WINAPI DeleteProcThreadAttributeList(

  LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList

);

一个用于创建,一个用于修改属性,一个用于删除。但是具体的属性就不清楚有哪些了。通过对shell32的分析,创建不同权限的进程应该和某个属性有关系。不过现在就无法验证。

最终还是采用了调用ShellExecute的方式来启动自己的进程,并通过一个命名的Event来传递消息,使得父进程在创建好子进程之后能够等待子进程的执行完成。

顺便说一下,通过ShellExecuteEx本来以前是可以拿到hProcess的,vista下面如果创建需要Admin权限的进程,我得机器上面拿到的始终是444,不知道是什么东西了,呵呵。

看来关于UAC的相关东西还需要继续了解一段时间才能达到应用的程度。

这里贴一下MS文档中关于UAC的架构图。关于AIS服务的东西目前还没找到文档,看来也是需要再关注的,呵呵。

再贴一下Windows Vista Developer Story的下载地址,呵呵。东西比较全,不过短时间之内是不能仔细看的了。~~

http://download.microsoft.com/download/D/9/B/D9BEB875-BC1D-4338-A655-251F4F353B2E/Top10Wave.exe

posted on 2008-05-04 14:56 NetRoc 阅读(1583) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜