WIN32 动态 UAC 提权

这篇具有很好参考价值的文章主要介绍了WIN32 动态 UAC 提权。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

UAC(User Account Control) 是 Windows 平台的用户权限控制。它可以让程序使用管理员权限执行某些操作。

静态 UAC 提权

静态 UAC 提权让程序一直运行在管理员权限下,只要在项目设置里把 "UAC Execution Level" 设置为 "requireAdministrator"。这样生成的 exe 文件图标会自动加上一个小盾牌的角标 Overlay。执行 exe 文件会自动弹出 UAC 对话框。

WIN32 动态 UAC 提权

静态 UAC 提权对程序员来说是一种偷懒的办法,只需要修改一个配置就行。但对用户来说非常麻烦,每次打开程序都需要确认 UAC 对话框。比如“小黑盒加速器”,每次打开它都会弹 UAC 对话框。更奇葩的是“小黑盒加速器” 可以设置开机自启,每次开机都会弹一个 UAC 对话框要你确认。

动态 UAC 提权

动态 UAC 提权让程序一直运行在普通用户权限下,并且只有需要管理员权限操作时才会弹出 UAC 对话框。这种做法比静态 UAC 提权更加细致。一个普通的应用程序 99% 的功能都不需要管理员权限,只在极少数情况下才需要。比如“QQ音乐”,它只是一个音乐播放软件。用户大部分的时间都仅使用音乐播放功能。而需要管理员权限的“将QQ音乐设为默认应用”功能很少会被使用。所以动态 UAC 提权很有必要。

按照微软官方文档 Developing Applications that Require Administrator Privilege,有四种方法可以实现动态 UAC 提权:

  • Elevated Task Model
  • Operating System Service Model
  • Administrator Broker Model
  • Administrator COM Object Model

可以根据具体需要实现的功能选择合适的方法。比如:“添加防火墙规则”这个功能需要使用 INetFwPolicy2。这是一个 COM 接口,可以直接用第 4 种方法“Administrator COM Object Model”实现。使用这种方法有个前提,就是这个 COM 接口必须在注册表里是配置为可以提权的。比如 INetFwPolicy2 接口,先找到 NetFwPolicy2 的 GUID 为 E2B3C97F-6AE1-41AC-817A-F6F92166D7DD,再打开 regedit,输入 HKLM\Software\Classes\CLSID\{E2B3C97F-6AE1-41AC-817A-F6F92166D7DD}\ElevationEnabled 值为 1 就可以用。对于这种方法,The COM Elevation Moniker 介绍得比较详细,所以直接贴出完整代码:

#include <Windows.h>
#include <netfw.h>
#include <comdef.h>

#include <spdlog/spdlog.h>
#include <memory>
#include <filesystem>
#include <wil/resource.h>
#include <wil/com.h>
#include <iostream>

int add_firewall_rule();

int main()
{
    add_firewall_rule();
}

int add_firewall_rule()
{
    auto couninitialize_call = wil::CoInitializeEx();

    auto pNetFwPolicy2 = wil::CoCreateInstance<INetFwPolicy2>(__uuidof(NetFwPolicy2));

    wil::unique_cotaskmem_string clsid;
    RETURN_IF_FAILED(StringFromCLSID(__uuidof(NetFwPolicy2), &clsid));

    // https://learn.microsoft.com/en-us/windows/win32/secauthz/developing-applications-that-require-administrator-privilege
    // https://learn.microsoft.com/en-us/windows/win32/com/the-com-elevation-moniker
    BIND_OPTS3 bo{};
    bo.cbStruct = sizeof(bo);
    bo.hwnd = GetConsoleWindow();
    bo.dwClassContext = CLSCTX_LOCAL_SERVER;
    auto moniker = fmt::format(L"Elevation:Administrator!new:{}", clsid.get());
    spdlog::info(L"moniker: {}", moniker);
    auto hr = (CoGetObject(moniker.c_str(), &bo, IID_PPV_ARGS(&pNetFwPolicy2)));

    wil::com_ptr<INetFwRules> pNetFwRules;
    RETURN_IF_FAILED(pNetFwPolicy2->get_Rules(&pNetFwRules));

    long count{};
    RETURN_IF_FAILED(pNetFwRules->get_Count(&count));

    spdlog::info("rule count: {}", count);

    wil::com_ptr<IUnknown> pEnumerator;
    pNetFwRules->get__NewEnum(&pEnumerator);

    auto pVariant = pEnumerator.query<IEnumVARIANT>();

    std::vector<wchar_t> buf(1024);
    GetModuleFileNameW(nullptr, buf.data(), (DWORD)buf.size());
    std::filesystem::path exe_path(buf.data());

    // https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ics/c-enumerating-firewall-rules
    while (true) {
        wil::unique_variant var;
        ULONG cFecthed = 0;
        if (pVariant->Next(1, &var, &cFecthed) != S_OK) {
            break;
        }

        wil::com_ptr<INetFwRule> pNetFwRule;
        var.pdispVal->QueryInterface(__uuidof(INetFwRule), (void**)&pNetFwRule);

        _bstr_t app_name;
        pNetFwRule->get_ApplicationName(app_name.GetAddress());
        std::error_code ec{};
        if (!app_name || !std::filesystem::equivalent(exe_path, (wchar_t*)app_name, ec)) {
            continue;
        }

        pNetFwRule->put_Name(app_name);
        pNetFwRules->Remove(app_name);
        spdlog::info(L"remove firewall rule: {}", (wchar_t*)app_name);
    }

    auto pNetFwRule = wil::CoCreateInstance<INetFwRule3>(__uuidof(NetFwRule));
    pNetFwRule->put_Enabled(VARIANT_TRUE);
    pNetFwRule->put_Action(NET_FW_ACTION_ALLOW);
    pNetFwRule->put_ApplicationName(_bstr_t(exe_path.c_str()));
    pNetFwRule->put_Profiles(NET_FW_PROFILE2_ALL);

    pNetFwRule->put_Name(_bstr_t(L"firewall-test.exe(TCP-In)"));
    pNetFwRule->put_Protocol(NET_FW_IP_PROTOCOL_TCP);
    RETURN_IF_FAILED(pNetFwRules->Add(pNetFwRule.get()));

    pNetFwRule->put_Name(_bstr_t(L"firewall-test.exe(UDP-In)"));
    pNetFwRule->put_Protocol(NET_FW_IP_PROTOCOL_UDP);
    RETURN_IF_FAILED(pNetFwRules->Add(pNetFwRule.get()));

    spdlog::info("success");
    return S_OK;
}

关于动态 UAC 提权的代码只有第 30-36 行。需要注意的点有:

  • 第 32 行的 bo.hwnd 设置 UAC 对话框的 owner。如果代码是控制台程序,应该设置为 GetConsoleWindow(),如果是 GUI 程序可以直接填 nullptr
  • 第 33 行的 bo.dwClassContext 应填 CLSCTX_LOCAL_SERVER,而不是 CLSCTX_INPROC_SERVER。否则提权失败,CoGetObject 仍然返回 S_OK
  • UAC 对话框出现在 CoGetObject 调用时,而不是执行需要管理员权限的操作(如pNetFwRules->Add)时。
  • 每次执行 add_firewall_rule() 都会弹出 UAC 对话框。

很多动态 UAC 提权的程序都会在需要管理员权限的操作按钮上显示一个小盾牌图标,表示点击它会请求管理员权限,比如:

WIN32 动态 UAC 提权

可以直接调用 SHGetStockIconInfo 方法直接得到它的 HICON 句柄。文章来源地址https://www.toymoban.com/news/detail-808428.html

SHSTOCKICONINFO sii{};
sii.cbSize = sizeof(sii);
HRESULT hr = SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_SMALLICON, &sii);
m_buttonRepairFirewall.SetIcon(sii.hIcon);
DestroyIcon(sii.hIcon);

到了这里,关于WIN32 动态 UAC 提权的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权

    系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!! 拿到一个普通管理员的SHELL,在CS中没有*号代表有UAC 执行添加用户的命令时显示拒绝访问 使用CS自带的插件进行绕过提权 直接提到了system权限

    2024年02月16日
    浏览(42)
  • 浅谈Kernel32.dll(Windows平台下必有的动态库文件)

            今天听了前辈的黑客攻击的知识分享,里面比较基础的元素就是Kernel32.dll,我对它感兴趣好久了,今天搜集一些资料,有关Kernel32的。   目录 ​编辑 一、Kernel32介绍 二、Kernel32内存管理 三、引起Kernel32出错的主要元凶 四、解决方案 五、总结         Kernel32.dll是

    2024年02月04日
    浏览(42)
  • TX Text Control .NET for Windows Forms 32 Crk

    WINDOWS UI TX Text Control is a royalty-free, fully programmable rich edit control that offers developers a broad range of word processing features in a reusable component designed for Visual Studio. It provides comprehensive text formatting, powerful mail merge features and all word processing key concepts such as table support, images, headers and footers

    2024年02月07日
    浏览(48)
  • Windows安全基础:UAC

    目录 UAC原理介绍 UAC的四个安全级别定义 UAC的触发条件 UAC用户登录过程 UAC虚拟化 配置UAC 用户账号控制(User Account Control) 为Windows Vista推出的一项安全技术,其原理是通过限制安全应用软件对系统层级的访问,提升Windows操作系统的安全性。 可以在用户控制设置里面设置级别

    2024年01月16日
    浏览(42)
  • 通过组策略把用户电脑的UAC通知设置为3级

    在Windows操作系统中,可以通过组策略编辑器(Group Policy Editor)来配置用户的用户账户控制(UAC)设置。但是,请注意,将UAC设置为3级的通知方式在标准的Windows UAC设置中并未直接提供,UAC级别通常包括“始终通知”、“默认”和“从不通知”。 如果需要调整到类似“始终通

    2024年03月25日
    浏览(37)
  • WIN提权补丁提权,at,sc,psexes提权

    win提权分为web和本地提权 web提权就是getshell后,权限是网站权限,要进行提权 本地提权是本地用户进行提权 本地用户的权限大于网站权限,所以本地提权成功概率比web提权概率大 因为我们做渗透测试,一般都是从网站入侵。所以大部分都是web提权。 而本地提权一般运用在内

    2024年02月06日
    浏览(33)
  • Win10关于debug时windows用户账户控制EnableLUAC

    目录 Win10关于debug时windows用户账户控制EnableLUAC 1、debug时,需要UAC独立使能的附加条件配置 1.1、用户帐户控制: 以管理员批准模式运行所有管理员  1.2、 此时光有以下配置是不够的,必须有上述配置 2、delphi或C++ Builder项目配置文件Manifest  2.1、项目配置如下: 2.2、否则项目

    2024年02月05日
    浏览(68)
  • linux 切换用户报错:This account is currently not available

    在用su命令切换用户的时候,报错This account is currently not available。这是因为用户的shell禁止登陆了。 有两种方式可以解决: 方式一:修改/etc/passwd 方式二:使用命令修改

    2024年02月09日
    浏览(65)
  • 【网络安全】--win提权

    提高自己的执行权限,已完成更多高权限才拥有的特权 whoami #查看当前用户权限 systeminfo # 查看操作系统及补丁情况 ipconfig #查看ip net user #查看当前用户情况 netstat #查看当前网络连接情况(只有tcp) netstat -ano #显示出tcp和udp连接情况 netstat -an | find “ESTABLISHED” #查看开启状态

    2024年02月06日
    浏览(39)
  • Windows UAC权限详解以及因为权限不对等引发的若干问题分享

    目录 1、什么是UAC? 2、微软为什么要设计UAC? 3、标准用户权限与管理员权限 4、程序到底以哪种权限运行?与哪些因素有关? 4.1、给程序设置以管理员权限运行的属性 4.2、当前登录用户的类型 5、案例1 - 无法在企业微信聊天框中启动安装包程序 6、案例2 - 使用Windbg时可能会

    2024年02月04日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包