2010-08-17 5 views
0

UAC를 사용하지 않도록 설정 한 경우 UAC를 사용하여 만든 프로세스와 동일한 특성을 갖는 프로세스를 만들어야합니다. 기본적으로 UAC를 사용하는 프로세스 만들기를 에뮬레이트하고 있습니다.FS 가상화가 활성화 된 프로세스 만들기

내 유일한로드 블록은 가상화입니다. 아래 샘플 코드는 가상화를 사용하는 중간 IL에서 메모장의 인스턴스를 만들어야합니다. 실제로 가상화를 사용하지 않는 매체 IL에서 메모장의 인스턴스를 만듭니다. 나는 왜 가상 토큰이 무시되는지 완전히 확신하지 못합니다. 어떤 아이디어?

BOOL bRet; 
HANDLE hToken; 
HANDLE hNewToken; 

// Notepad is used as an example 
WCHAR wszProcessName[MAX_PATH] = 
L"C:\\Windows\\System32\\Notepad.exe"; 

// Medium integrity SID 
WCHAR wszIntegritySid[20] = L"S-1-16-8192"; 
PSID pIntegritySid = NULL; 

DWORD EnableVirtualization = 1; 
TOKEN_MANDATORY_LABEL TIL = {0}; 
PROCESS_INFORMATION ProcInfo = {0}; 
STARTUPINFO StartupInfo = {0}; 
ULONG ExitCode = 0; 

if (OpenProcessToken(GetCurrentProcess(),MAXIMUM_ALLOWED, &hToken)) 
{ 
    if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, 
     SecurityImpersonation, TokenPrimary, &hNewToken)) 
    { 
     if (ConvertStringSidToSid(wszIntegritySid, &pIntegritySid)) 
     { 
     TIL.Label.Attributes = SE_GROUP_INTEGRITY; 
     TIL.Label.Sid = pIntegritySid; 

     // Set the process integrity level 
     if (SetTokenInformation(hNewToken, TokenIntegrityLevel, &TIL, 
      sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(pIntegritySid))) 
     { 
      // Enable FS Virtualization 
      if (SetTokenInformation(hNewToken, TokenVirtualizationEnabled, 
       &EnableVirtualization, sizeof(EnableVirtualization))) 
      { 
       // Create the new process at Low integrity 
       bRet = CreateProcessAsUser(hNewToken, NULL, 
        wszProcessName, NULL, NULL, FALSE, 
        0, NULL, NULL, &StartupInfo, &ProcInfo); 
      } 
     } 
     LocalFree(pIntegritySid); 
     } 
     CloseHandle(hNewToken); 
    } 
    CloseHandle(hToken); 
} 
+0

가상화가 UAC의 기능이 아닙니까? 나는 당신이 UAC없이 가상화를 할 수 있다고 생각하지 않습니다. – Luke

답변

0

이렇게 잘못 접근했습니다. 즉, 가상화가 원하는 것이 아닙니다. 위에서 설명한대로 UAC를 에뮬레이트하려면 관리자 그룹이 비활성화 된 제한된 토큰을 만들어 해당 토큰을 사용하여 프로세스를 만드는 데 필요합니다.

0

이것이 작동하지 않는 이유는 CreateProcessAsUser에 대해 생성 된 기본 토큰에서가상화를 설정하는 호출이 작동하고 있기 때문입니다. 필요한 것은 실제 프로세스에 대한 액세스 토큰입니다. 이는 CreationFlagCREATE_SUSPENDED으로 프로세스를 만들고 ProcInfo에서 프로세스 핸들을 사용하여 OpenProcessToken을 호출하여 얻을 수 있습니다. 해당 토큰에 SetTokenInformation을 사용하여 가상화를 활성화 한 다음 ResumeThread을 실행하여 프로세스를 실행하십시오.

관련 문제