gpt4 book ai didi

c++ - CreateProcessWithTokenW 的 cmdline 参数的最大长度是否有解决方法?

转载 作者:行者123 更新时间:2023-11-30 05:11:53 26 4
gpt4 key购买 nike

我正在尝试从 Windows 7-10 上的提升进程创建未提升进程。

我使用以下内容作为引用:

FAQ: How do I start a program as the desktop user from an elevated app?

现在,这个方法非常有效,但是由于可能的遗留检查,CreateProcessWithTokenW() 似乎只允许 cmdline 参数小于或等于1024 个字符。

我需要通过的cmdline远不止于此,这会导致E_INVALIDARG错误。

有人遇到过和我一样的问题吗?如果是这样,您是如何解决这个绝对荒谬的 1024 个字符限制的?

最佳答案

对于我们提升的(在同一 session 中)未提升的进程,我们接下来需要做的是:

  • 通过我们提升的 token 创建受限 token 使用 LUA_TOKEN
  • 创建 RestrictedToken
  • 在新代币中设置中等完整性级别
  • 调用 CreateProcessAsUser - 注意

If hToken is a restricted version of the caller's primary token, the SE_ASSIGNPRIMARYTOKEN_NAME privilege is not required.

ULONG LowExec(PCWSTR lpApplicationName, PWSTR lpCommandLine)
{
HANDLE hToken, hLowToken;

ULONG cb = GetSidLengthRequired(1);

TOKEN_MANDATORY_LABEL tml = { { (PSID)alloca(cb) } };

ULONG dwError = NOERROR;

if (CreateWellKnownSid(WinMediumLabelSid, 0, tml.Label.Sid, &cb) &&
OpenProcessToken(NtCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY |
TOKEN_ADJUST_DEFAULT | TOKEN_ASSIGN_PRIMARY, &hToken))
{
BOOL fOk = CreateRestrictedToken(hToken, LUA_TOKEN, 0, 0, 0, 0, 0, 0, &hLowToken);

if (!fOk)
{
dwError = GetLastError();
}

CloseHandle(hToken);

if (fOk)
{
if (SetTokenInformation(hLowToken, ::TokenIntegrityLevel, &tml, sizeof(tml)))
{
STARTUPINFOW si = { sizeof(si)};
PROCESS_INFORMATION pi;

if (CreateProcessAsUser(hLowToken, lpApplicationName, lpCommandLine, 0, 0, TRUE, 0, 0, 0, &si, &pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
else
{
dwError = GetLastError();
}
}
else
{
dwError = GetLastError();
}

CloseHandle(hLowToken);
}
}
else
{
dwError = GetLastError();
}

return dwError;
}

关于c++ - CreateProcessWithTokenW 的 cmdline 参数的最大长度是否有解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44833235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com