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);
}
가상화가 UAC의 기능이 아닙니까? 나는 당신이 UAC없이 가상화를 할 수 있다고 생각하지 않습니다. – Luke