UAC提升权限的细节

UAC提升权限的细节

一,桌面运行一个程序时

桌面运行一个程序时,Explorer调用ShellExecuteEx(),ShellExecuteEx()进一步调用CreateProcess()创建进程,由于这个进程需要管理员权限才能运行,于是CreateProcess返回ERROR_ELEVATION_REQUIRED (740);

二,ShellExecuteEx接到这个返回值后

ShellExecuteEx接到这个返回值后和一个运行appinfo服务的svchost通讯,要求它来进行权限提升,于是这个svchost创建consent.exe,consent正是UAC对话框的UI进程。

三,如果用户在UAC对话框上选择

如果用户在UAC对话框上选择允许,consent将这个结果返回给appinfo(svchost)后便退出,appinfo依据返回结果进行一系列的函数调用创建高权限进程:

1.appinfo首先获取到当前登录用户的高权限令牌;

2.appinfo初始化一个STARTUPINFOEX结构体:

typedef struct _STARTUPINFOEX {
  STARTUPINFO                StartupInfo;
  PPROC_THREAD_ATTRIBUTE_LIST lpAttributeList;
}STARTUPINFOEX, *LPSTARTUPINFOEX;

其中:
A. 初始化Startupinfo的时候将其成员lpDesktop设置为winsta0\default,使得将来创建的提升进程处于当前用户桌面上(否则就会在appinfo服务的这个不可见桌面上);
B. 初始化lpAttributeList的时候会用OpenProcess()取得原始调用进程的进程句柄,然后调用UpdateProcThreadAttribute(),指定参数分别为:这个句柄和PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,这一步后,将来创建的被提升进程的父进程就被还原为原始的调用进程的(否则他的父进程就会是Svchost(appinfo))

3. 接下来svchost(appinfo服务)调用CreateProcessAsUser()创建提升权限的进程:

期中的参数设置是:
A.dwCreationFlags使用EXTENDED_STARTUPINFO_PRESENT(这个仅vista才有,用于指定倒数第二个参数lpStartupInfo指向的是STARTUPINFOEX而不是STARTUPINFO)
B.倒数第二个参数lpStartupInfo使用上述几步中初始化完成的结构体STARTUPINFOEX

4. 最后appinfo将相关函数调用返回给Explorer

最后appinfo将相关函数调用返回给Explorer,一个提升权限的的进程被创建了,上述几步的设置使得这个由服务创建的进程运行在当前用户桌面、并且我们看到的它的父进程“依然是”Explorer。

参考资料:
转自
参考2
参考3
参考4

你可能感兴趣的:(权限,uac)