在系统上下文中运行进程

时间:2016-08-30 22:31:33

标签: c++ windows winapi win32gui

是否可以从具有提升的管理员帐户(例如命令提示符)下运行的父进程启动系统上下文中的进程。这个问题类似于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,但是单独发布,因为有详细说明必须如何实现。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的(没有任何服务帮助)。

  

但我甚至无法打开进程句柄

您的流程是否启用了SE_DEBUG_PRIVILEGE权限?

使用此权限,您可以打开一个具有所有访问权限的系统进程(如果它不受保护(smss.exe,csrss.exe,services.exe)),并在CreateProcessAsUser()中使用该句柄,或者使用该权限UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS)如果您还启用了SE_ASSIGNPRIMARYTOKEN_PRIVILEGESE_TCB_PRIVILEGE权限(用于将令牌的SessionId设置为0),您可以通过以下两种方式获得:

  • 从未受保护的系统进程中打开一个线程并模拟它,然后打开自己的线程令牌并调整其权限。

  • 从任何系统进程打开令牌(这对于受保护的进程都有效),复制令牌,调整其权限,然后使用此令牌进行模拟。

要“在系统上下文中启动进程”,如果要运行该进程:

  • 使用LocalSystem令牌。

  • 系统终端会话(0)

    中的

正如我所说,两者都是可能的。您所需要的只是SE_DEBUG_PRIVILEGE

  1. 更简单 - 使用PROCESS_CREATE_PROCESS访问权限打开一些系统进程。将此句柄与UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS)一起使用。因此,您启动的进程会从系统进程继承一个令牌。这在XP上不起作用,但可以用NtCreateProcess/Ex()挂钩以用打开的句柄替换HANDLE ParentProcess

  2. 另一种方法是使用CreateProcessAsUser()。在创建流程之前,您需要SE_ASSIGNPRIMARYTOKEN_PRIVILEGESE_TCB_PRIVILEGE权限才能设置令牌TokenSessionId(如果您想在会话0中运行)。