Windows——降权启动程序

作者:小 琛
欢迎转载,请标明出处

应用场景:运行的程序本身为管理员权限,此时需要启动一个新的程序,该程序需要以普通权限启动。

思路:

  1. 使用 CreateProcessAsUserCreateProcessWithLogonW 等函数创建一个新的进程。这些函数可以指定一个不同权限的用户账户来启动进程,从而实现进程的降权启动。注意,这些函数需要当前程序拥有 SeAssignPrimaryTokenPrivilege 权限,可以通过调用 AdjustTokenPrivileges 函数获取该权限。

  2. 获取新进程的安全标识符(SID),并使用 SetTokenInformation 函数将新进程的安全性设置为普通权限。具体来说,可以使用以下步骤实现:

    • 通过 OpenProcessToken 函数获取当前进程的令牌句柄;
    • 使用 GetTokenInformation 函数获取当前进程令牌的安全标识符;
    • 使用 DuplicateTokenEx 函数创建一个新的安全令牌;
    • 使用 SetTokenInformation 函数将新令牌的安全级别设置为普通权限。
  3. 使用新令牌启动进程。在 CreateProcessAsUserCreateProcessWithLogonW 函数中指定新令牌即可。

BOOL CreateProcessAsUser(std::wstring command_line)
{
    LOG_INFO << "_CreateProcessAsUser command_line:" << command_line;
    BOOL ret = FALSE;
    DWORD u_ExplorerPID;
    HANDLE hTokenUser = 0;
    HANDLE h_Token = 0;
    HANDLE h_Process = 0;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(STARTUPINFO));
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOWNORMAL;
    HWND h_Progman = GetShellWindow();
    GetWindowThreadProcessId(h_Progman, &u_ExplorerPID);
    h_Process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, u_ExplorerPID);
    OpenProcessToken(h_Process, TOKEN_DUPLICATE, &h_Token);
    DuplicateTokenEx(h_Token, TOKEN_ALL_ACCESS, 0, SecurityImpersonation, TokenPrimary, &hTokenUser);
    ret = CreateProcessWithTokenW(hTokenUser, NULL, NULL, (WCHAR*)command_line.c_str(), NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
    if (h_Token) {
        CloseHandle(h_Token);
    }
    if (hTokenUser) {
        CloseHandle(hTokenUser);
    }
    if (h_Process) {
        CloseHandle(h_Process);
    }
    if (!ret) {
        LOG_INFO << "_CreateProcessAsUser GetLastError:" << GetLastError();
    }
    return ret;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值