2016-08-30 2 views
0

Возможно ли запустить процесс в системном контексте из родительского процесса, который выполняется под учетной записью администратора с увеличением (например, командной строки). Проблема похожа на то, что psexec делает, но больше того, как она на самом деле реализует это.Выполнение процесса в системном контексте

Я думал, открывая процесс crss.exe/winlogon.exe, дублируя токен и запуская новый процесс, используя этот токен процесса. Но я даже не могу открыть дескриптор процесса (Getlasterror return 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, но публикуется отдельно, поскольку были детали о том, как это должно было быть достигнуто.

+3

См. [Как работает psexec] (http://forum.sysinternals.com/topic9674_post41829.html#41829). В двух словах, psexec регистрируется администратором и устанавливает и запускает временную службу для получения доступа к системе, затем эта служба запускает команду, а затем psexec останавливает и удаляет службу. psexec использует каналы для обмена ввода/вывода между собой и службой, а служба использует каналы для обмена ввода/вывода с помощью текущей команды. –

+0

Спасибо @RemyLebeau, я вижу, что psexec создает сервис, чтобы достичь этого. Но я получил dll и не хочу вводить в него новый exe. Можно ли добиться этого программно. Поскольку мой текущий процесс уже запущен с правами администратора. – user3279954

+2

Только служба может получить Системные привилегии, и только Администратор может установить службу. Вы не можете запускать DLL напрямую в качестве службы (если только это не драйвер), но вам также не нужно писать отдельный EXE. Вы можете: 1) спроектировать DLL для вызова из ['Rundll32'] (https://support.microsoft.com/en-us/kb/164787), а затем использовать этот EXE в качестве службы или 2) иметь main EXE устанавливает себя как службу с параметром командной строки, а затем добавляет соответствующие вызовы API-сервиса к вашей функции 'WinMain()', когда EXE запускается с этим параметром, и при необходимости ваша «служба» использует DLL. –

ответ

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), который вы можете получить 2-мя способами:

  • открыть нить из системного процесса незащищенной и олицетворять его, а затем открыть свой собственный маркер потока и настройте на него привилегии.

  • открыть токен из любого системного процесса (это работает даже для защищенных процессов), дублировать токен, изменять права на него, а затем выдавать себя за этот токен.

Чтобы «запустить процесс в контексте системы», если вы хотите, чтобы запустить процесс:

  • с маркером LocalSystem.

  • в системе терминальной сессии (0)

И, как я говорю, возможно. И все, что вам нужно, это SE_DEBUG_PRIVILEGE.

  1. более просто - открыть какой-либо системный процесс с помощью PROCESS_CREATE_PROCESS доступ справа. Используйте эту ручку с UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS). В результате ваш начальный процесс наследует токен от системного процесса. Это не будет работать на XP, но там можно подключить NtCreateProcess/Ex(), чтобы заменить HANDLE ParentProcess вашим открытым ручкой.

  2. Другой способ - использовать CreateProcessAsUser().Перед созданием процесса вам понадобятся SE_ASSIGNPRIMARYTOKEN_PRIVILEGE и SE_TCB_PRIVILEGE привилегии для установки токена TokenSessionId (если вы хотите запустить сеанс 0).

+0

Спасибо большое @RbMm, Решение работает! Я могу создать дочерний процесс с системной учетной записью. Я продублировал токен процесса, включил SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, SE_TCB_PRIVILEGE, а после олицетворения запуск процесса создает дочерний процесс как системный процесс – user3279954

Смежные вопросы