首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建启用了FS虚拟化的进程

创建启用了FS虚拟化的进程
EN

Stack Overflow用户
提问于 2010-08-18 01:43:01
回答 2查看 960关注 0票数 0

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

我唯一的障碍是虚拟化。下面的示例代码应该创建一个中等IL的notedpad实例,并启用虚拟化。实际上,它创建了一个中等IL的notepad实例,并禁用了虚拟化。我不完全确定为什么虚拟化令牌会被忽略。有什么想法吗?

代码语言:javascript
运行
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-19 03:26:27

所以,我处理这个问题是不正确的-- fs虚拟化不是我想要的。如上所述,要模拟UAC,必须在禁用administrators组的情况下创建受限令牌,并使用该令牌创建进程。

票数 0
EN

Stack Overflow用户

发布于 2013-05-13 05:28:32

这不起作用的原因是,打开虚拟化的SetTokenInformation调用在为CreateProcessAsUser创建的主令牌上工作。需要的是实际进程的访问令牌。这可以通过使用CreationFlag CREATE_SUSPENDED创建进程,并使用ProcInfo中的进程句柄调用OpenProcessToken来实现。在该令牌上使用SetTokenInformation来启用虚拟化,然后使用ResumeThread来运行进程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3505295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档