2016-08-30 5 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

[how psexec works (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) 메인 EXE는 커맨드 라인 매개 변수를 가진 서비스로서 스스로를 설치하고, 그 매개 변수로 EXE가 실행될 때 관련 서비스 API 호출을'WinMain()'함수에 추가하고 필요에 따라 "서비스"가 DLL을 사용하도록합니다. –

답변

1

예, 가능합니다 (서비스 도움 말 없음).

하지만 난 당신의 프로세스가 SE_DEBUG_PRIVILEGE 특권 활성화합니까 프로세스가

을 처리 열 수 없습니다?

보호되어 있지 않은 시스템 프로세스 (smss.exe, csrss.exe, services.exe)를 열어 CreateProcessAsUser() 또는 UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS)에 해당 핸들을 사용할 수 있습니다. 또한 활성화 SE_ASSIGNPRIMARYTOKEN_PRIVILEGESE_TCB_PRIVILEGE 권한이 (설정 토큰의 SessionId 0) 당신은 2 가지 방법으로 얻을 수있는 :

  • 가 보호되지 않은 시스템 프로세스에서 스레드를 열고를 가장하고 자신의 스레드 토큰을 열 그것에 대한 권한을 조정하십시오.

  • 모든 시스템 프로세스에서 토큰을 열어 (보호 된 프로세스에서도 작동 함) 토큰을 복제하고 여기에 대한 권한을 조정 한 다음이 토큰으로 가장합니다. 가 LocalSystem 토큰

    • :이 과정을 실행하려면

  • 는 "시스템 환경에서 프로세스를 실행"합니다. 시스템 터미널 세션 내가 말한대로 (0)

모두에서

  • 이 가능합니다. 그리고 필요한 것은 SE_DEBUG_PRIVILEGE입니다.

    1. 더 간단히 - PROCESS_CREATE_PROCESS 액세스 권한으로 일부 시스템 프로세스를 엽니 다. UpdateProcThreadAttribute(PROC_THREAD_ATTRIBUTE_PARENT_PROCESS)과 함께이 핸들을 사용하십시오. 결과적으로 시작한 프로세스는 시스템 프로세스에서 토큰을 상속받습니다. 이것은 XP에서는 작동하지 않지만, 을 연결하여 HANDLE ParentProcess을 열린 핸들로 바꿀 수 있습니다.

    2. 또 다른 방법은 CreateProcessAsUser()을 사용하는 것입니다.프로세스를 만들기 전에 토큰 TokenSessionId을 설정하려면 SE_ASSIGNPRIMARYTOKEN_PRIVILEGESE_TCB_PRIVILEGE 권한이 필요합니다 (세션 0에서 실행하려는 경우).

  • +0

    감사합니다 @ RBM, 솔루션 작동합니다! 시스템 계정으로 하위 프로세스를 만들 수 있습니다. 프로세스 토큰을 복제하고 SE_ASSIGNPRIMARYTOKEN_PRIVILEGE, SE_TCB_PRIVILEGE를 사용하고 가장 (impersonation) 후에 프로세스를 시작하면 하위 프로세스가 시스템 프로세스로 생성됩니다. – user3279954

    관련 문제