Créer process avec FS activé la virtualisation
-
29-09-2019 - |
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);
}
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.