Процесс создания с включенной виртуализацией FS - PullRequest
0 голосов
/ 17 августа 2010

С отключенным UAC мне нужно создать процесс с теми же характеристиками, что и процесс, созданный с включенным UAC - в основном я эмулирую создание процесса с включенным UAC.

Мое единственное препятствие - это виртуализация. Приведенный ниже пример кода должен создать экземпляр notepad со средней 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);
}

Ответы [ 2 ]

0 голосов
/ 13 мая 2013

Причина, по которой это не работает, заключается в том, что вызов SetTokenInformation для включения виртуализации работает на основном токене, созданном для CreateProcessAsUser.Для этого нужен токен доступа для самого процесса.Это можно получить, создав процесс с CreationFlag CREATE_SUSPENDED и вызвав OpenProcessToken с дескриптором процесса из ProcInfo.Используйте SetTokenInformation на этом токене, чтобы включить виртуализацию, а затем ResumeThread, чтобы запустить процесс.

0 голосов
/ 18 августа 2010

Итак, я подошел к этому неправильно - виртуализация fs - это не то, что я хочу. Чтобы эмулировать UAC, как описано выше, необходимо создать ограниченный токен с отключенной группой администраторов и использовать этот токен для создания процесса.

...