是否可以从具有提升的管理员帐户(例如命令提示符)下运行的父进程启动系统上下文中的进程。这个问题类似于psexec所做的,但更多的是它实际上如何实现它。
我在考虑打开crss.exe / winlogon.exe进程复制令牌并使用该进程令牌启动新进程。但我甚至无法打开进程句柄(Getlasterror返回5)。如果这是正确的方法或者应该以不同的方式启动流程,有人可以告诉我吗?
HANDLE hWinLogonProcess;
for(const auto& ps : running_processes)
{
if(ps.id == GetCurrentProcessId() ||
0 != ps.short_name.CompareNoCase(L"winlogon.exe"))
{
continue;
}
DWORD dwWinLogonSessionId(0);
if(FALSE == ProcessIdToSessionId(GetCurrentProcessId(), &dwWinLogonSessionId))
{
std::wcerr<<"Could not get Winlogon process session id"<<std::endl;
continue;
}
if(dwWinLogonSessionId != dwCurSessionId)
{
continue;
}
hWinLogonProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ps.id);
if(FALSE == hWinLogonProcess)
{
std::wcerr<<"Failed to get winlogon process handle"<<std::endl;
return;
}
else
{
std::wcout<<"Able to open process "<<ps.short_name.GetString()<<" handle"<<std::endl;
break;
}
}
我确信它有可能,因为有一个工作工具(psexec),但我无法在网上找到任何参考资料。
这也类似于question,但是单独发布,因为有详细说明必须如何实现。
答案 0 :(得分:1)
是的,这是可能的(没有任何服务帮助)。
但我甚至无法打开进程句柄
您的流程是否启用了SE_DEBUG_PRIVILEGE
权限?
使用此权限,您可以打开一个具有所有访问权限的系统进程(如果它不受保护(smss.exe,csrss.exe,services.exe)),并在CreateProcessAsUser
()中使用该句柄,或者使用该权限UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS)
如果您还启用了SE_ASSIGNPRIMARYTOKEN_PRIVILEGE
和SE_TCB_PRIVILEGE
权限(用于将令牌的SessionId
设置为0),您可以通过以下两种方式获得:
从未受保护的系统进程中打开一个线程并模拟它,然后打开自己的线程令牌并调整其权限。
从任何系统进程打开令牌(这对于受保护的进程都有效),复制令牌,调整其权限,然后使用此令牌进行模拟。
要“在系统上下文中启动进程”,如果要运行该进程:
使用LocalSystem令牌。
正如我所说,两者都是可能的。您所需要的只是SE_DEBUG_PRIVILEGE
。
更简单 - 使用PROCESS_CREATE_PROCESS
访问权限打开一些系统进程。将此句柄与UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS)
一起使用。因此,您启动的进程会从系统进程继承一个令牌。这在XP上不起作用,但可以用NtCreateProcess/Ex()
挂钩以用打开的句柄替换HANDLE ParentProcess
。
另一种方法是使用CreateProcessAsUser()
。在创建流程之前,您需要SE_ASSIGNPRIMARYTOKEN_PRIVILEGE
和SE_TCB_PRIVILEGE
权限才能设置令牌TokenSessionId
(如果您想在会话0中运行)。