0

在禁用 UAC 的情况下,我需要创建一个与启用 UAC 创建的进程具有相同特征的进程 - 基本上我正在模拟启用 UAC 的进程创建。

我唯一的障碍是虚拟化。下面的示例代码应该在启用虚拟化的中等 IL 上创建 notepad 的实例。实际上,它在禁用虚拟化的中等 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);
}
4

2 回答 2

0

所以,我错误地处理了这个问题——fs 虚拟化不是我想要的。为了模拟 UAC,如上所述,有必要创建一个禁用管理员组的受限令牌并使用该令牌来创建进程。

于 2010-08-18T19:26:26.507 回答
0

这不起作用的原因是SetTokenInformation打开虚拟化的调用正在处理为CreateProcessAsUser. 需要的是实际过程的访问令牌。这可以通过使用 来创建进程,并使用来自 的进程句柄CreationFlag CREATE_SUSPENDED调用来获得。使用该令牌启用虚拟化,然后运行该进程。OpenProcessTokenProcInfoSetTokenInformationResumeThread

于 2013-05-12T21:28:32.027 回答