Question

Avec UAC désactivé, je dois créer un processus avec les mêmes caractéristiques que le processus créé avec l'UAC activé -., Fondamentalement, je suis émule la création de processus avec UAC activé

Mon seul obstacle est la virtualisation. L'exemple de code ci-dessous doit créer une instance de notedpad au moyen de l'IL avec la virtualisation activée. En réalité, il crée une instance de bloc-notes à moyen IL avec la virtualisation désactivé. Je ne suis pas vraiment pourquoi le jeton de virtualisation est ignorée. Toutes les idées?

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);
}
Était-ce utile?

La solution

Alors, j'approchais ce mal - la virtualisation fs est pas ce que je veux. Pour imiter UAC, comme décrit ci-dessus, son nécessaire de créer un jeton restreint avec le groupe des administrateurs handicapés et à utiliser ce jeton pour créer le processus.

Autres conseils

La raison pour laquelle cela ne fonctionne pas, est que l'appel SetTokenInformation pour activer la virtualisation travaille sur le jeton principal créé pour CreateProcessAsUser. Ce qui est nécessaire est un jeton d'accès pour le processus réel. Ceci peut être obtenu en créant le processus avec le CreationFlag de CREATE_SUSPENDED et appeler OpenProcessToken avec la poignée de processus de ProcInfo. Utilisez SetTokenInformation sur ce jeton pour permettre la virtualisation et ResumeThread puis de lancer le processus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top