禁用UAC后,我需要创建一个与启用UAC时创建的进程具有相同特征的进程 - 基本上我是在启用UAC的情况下模拟进程创建。
我唯一的障碍是虚拟化。下面的示例代码应该在启用虚拟化的中型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);
}
答案 0 :(得分:0)
所以,我正在接近这个错误 - 虚拟化不是我想要的。要模拟UAC,如上所述,必须在禁用管理员组的情况下创建受限令牌,并使用该令牌创建该过程。
答案 1 :(得分:0)
这不起作用的原因是,启用虚拟化的SetTokenInformation
调用正在处理为CreateProcessAsUser
创建的主令牌。需要的是实际过程的访问令牌。这可以通过使用CreationFlag
CREATE_SUSPENDED
创建流程,并使用OpenProcessToken
的流程句柄调用ProcInfo
来获得。在该令牌上使用SetTokenInformation
启用虚拟化,然后ResumeThread
运行该过程。