本帖最后由 KillTimer 于 2023-1-16 18:51 编辑
UIAccess可用于一些特殊的程序,让它们可以忽略UIPI(UI特权隔离)。这类程序一般以普通方式运行,但它们需要访问已提权的窗口,于是就有了这么个权限。UIAccess的另一个特性是可以创建Z序最高的窗口,Z序和窗口段在这个博客https://blog.csdn.net/weixin_43820461/article/details/107610331中有介绍,其中那个最高的窗口段就是有UIAccess权限的程序可以创建的。
一般情况下获取UIAccess权限很难,因为利用这个可以绕过UIPI而提权,可以看Raymond的技术博客:https://devblogs.microsoft.com/oldnewthing/20121213-00/?p=5843
那如果我们已经具备管理员权限,而只是想创建最高Z序的窗口(如用作截图工具的形状提示器),怎么办呢?
可以通过下面的方式实现:
遍历进程列表获取一个带SeTcbPrivilege权限的令牌(用户名一般是System),下面是缩略版代码:
[C] 纯文本查看 复制代码
PRIVILEGE_SET ps;
HANDLE hFinalToken;
const DWORD dwMaxPids = 16384;
DWORD dwSize, cbSize, i;
DWORD *pids = (DWORD*)LocalAlloc(LPTR, dwMaxPids * sizeof(*pids));
ps.PrivilegeCount = 1;
ps.Control = PRIVILEGE_SET_ALL_NECESSARY;
LookupPrivilegeValue(NULL, SE_TCB_NAME, &ps.Privilege[0].Luid);
EnumProcesses(pids, dwMaxPids * sizeof (*pids), &cbSize));
dwSize = cbSize >> 2;
for (i = 0; i < dwSize; ++i)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pids[i]);
HANDLE hToken;
BOOL fTcbPrivileges;
OpenProcessToken(hProcess, TOKEN_QUERY | TOKEN_DUPLICATE, &hToken);
if (PrivilegeCheck(hToken, &ps, &fTcbPrivileges) && fTcbPrivileges)
{
DuplicateTokenEx(
hToken,
TOKEN_QUERY | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY,
NULL,
SecurityAnonymous,
TokenPrimary,
&hFinalToken
);
// 这里已经获取令牌
}
CloseHandle(hToken);
CloseHandle(hProcess);
}
LocalFree(pids);
用这个令牌启动另一个自身:
[C] 纯文本查看 复制代码
TCHAR szPath[MAX_PATH];
STARTUPINFO si = {sizeof (si)};
PROCESS_INFORMATION pi;
GetModuleFileName(NULL, szPath, MAX_PATH);
CreateProcessAsUser(hFinalToken, szPath, NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
在新进程中给另一个事先准备好的令牌设置TokenUIAccess:
[C] 纯文本查看 复制代码
BOOL fUIAccess = TRUE;
SetTokenInformation(hToken, TokenUIAccess, &fUIAccess, sizeof (fUIAccess));
然后就可以用它做你想做的事了。
完整的代码已经上传至https://github.com/killtimer0/uiaccess
也可以直接下载下面的(源码+可执行文件):
uiaccess.zip
(13.5 KB, 下载次数: 36)
下面是获得最高Z序的效果图,其中左边的窗口未获取UIAccess,右边已获取,中间是置于顶层的任务管理器(ZBID_SYSTEM_TOOLS):
注意:这种方法一定不是官方推荐的做法,所以需要承担软件可能报毒的风险
2023-01-16更新:
修改了TokenUIAccess的实现方式,解决非管理员用户无法获取权限的问题
uiaccess.zip
(11.91 KB, 下载次数: 40)
|