gpt4 book ai didi

c++ - Windows Vista/Windows 7 权限 : SeDebugPrivilege & OpenProcess

转载 作者:IT老高 更新时间:2023-10-28 12:58:17 27 4
gpt4 key购买 nike

我所能找到的关于根据我的需要升级到适当权限的所有内容都与我当前的方法一致,但问题仍然存在。我希望也许有人有一些 Windows Vista/Windows 7 内部体验,可能会在只有黑暗的地方发光。我相信这会持续很长时间,但请耐心等待。
语境
我正在开发一个需要访问当前机器上其他进程的内存的应用程序。显然,这需要管理员权限。它还需要 SeDebugPrivilege (不,这不是 SetDebugPrivilege 的拼写错误),我相信自己是正确获得的,尽管我质疑是否不需要更多特权,从而导致我的问题。到目前为止,代码已在所有版本的 Windows XP 以及我的测试 Vista 32 位和 Windows 7 64 位环境中成功运行。
过程

  • 程序将始终以管理员权限运行。这可以在整个帖子中假设。
  • 升级当前进程的 Access Token包括 SeDebugPrivilege权利。
  • 使用 EnumProcesses在系统上创建当前 PID 的列表
  • 使用 OpenProcess 打开句柄与 PROCESS_ALL_ACCESS访问权限
  • 使用 ReadProcessMemory读取其他进程的内存。

  • 问题:
    在开发和我的个人测试(包括 Windows XP 32 和 64、Windows Vista 32 和 Windows 7 x64)期间,一切都运行良好。但是,在同事的 Windows Vista(32 位)和 Windows 7(64 位)计算机上进行测试部署期间, OpenProcess 似乎存在特权/权限问题。因通用 Access Denied 而失败错误。以受限用户身份运行时(如预期的那样)和明确以管理员身份运行时(右键单击 → 以管理员身份运行以及从管理员级别命令提示符运行时)都会发生这种情况。
    但是,这个问题在我的测试环境中已经无法重现。我亲眼目睹了这个问题,所以我相信这个问题是存在的。我可以辨别实际环境和我的测试环境之间的唯一区别是在 UAC 提示下使用域管理员帐户时发生了实际错误,而我的测试(没有错误)在UAC 提示。
    似乎虽然使用的凭据允许 UAC“以管理员身份运行”,但该进程仍然没有获得正确的权限来 OpenProcess 在另一个进程上。我对 Vista/Windows 7 的内部结构不够熟悉,无法知道这可能是什么,我希望有人知道可能是什么原因。
    踢球者
    报告此错误的人以及他的环境可以定期重现此错误的人有一个名为 RunWithDebugEnabled 的小应用程序。这是一个小型 bootstrap ,它似乎会提升自己的权限,然后启动传递给它的可执行文件(从而继承提升的权限)。当使用此程序运行时,在 UAC 提示下使用相同的域管理员凭据,程序可以正常工作并且能够成功调用 OpenProcess 并按预期运行。
    所以这肯定是获取正确权限的问题,众所周知,Domain Administrator账号是应该能够访问正确权限的管理员账号。 (显然,获得此源代码会很棒,但如果可能的话,我不会在这里)。
    笔记
    如前所述,失败 OpenProcess 报告的错误尝试是 Access Denied .根据 OpenProcess 的 MSDN 文档:

    If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.


    这让我相信,在这些条件下,(1) 获取 SeDebugPrivileges 可能存在问题。或 (2) 需要任何 MSDN 文档中未提及的其他权限,这些权限可能在域管理员帐户和本地管理员帐户之间有所不同
    示例代码:
    void sample()
    {
    /////////////////////////////////////////////////////////
    // Note: Enabling SeDebugPrivilege adapted from sample
    // MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
    // Enable SeDebugPrivilege
    HANDLE hToken = NULL;
    TOKEN_PRIVILEGES tokenPriv;
    LUID luidDebug;
    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
    {
    if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
    {
    tokenPriv.PrivilegeCount = 1;
    tokenPriv.Privileges[0].Luid = luidDebug;
    tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
    {
    // Always successful, even in the cases which lead to OpenProcess failure
    cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
    }
    else
    {
    cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
    }
    }
    }
    CloseHandle(hToken);
    // Enable SeDebugPrivilege
    /////////////////////////////////////////////////////////

    vector<DWORD> pidList = getPIDs(); // Method that simply enumerates all current process IDs

    /////////////////////////////////////////////////////////
    // Attempt to open processes
    for(int i = 0; i < pidList.size(); ++i)
    {
    HANDLE hProcess = NULL;
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidList[i]);
    if(hProcess == NULL)
    {
    // Error is occurring here under the given conditions
    cout << "Error opening process PID(" << pidList[i] << "): " << GetLastError() << endl;
    }
    CloseHandle(hProcess);
    }
    // Attempt to open processes
    /////////////////////////////////////////////////////////
    }

    谢谢!
    如果有人对在上述条件下在 Windows Vista 和 Windows 7 上正确打开另一个进程(假设可执行文件已正确“以管理员身份运行”)有所了解,我可能缺少哪些可能的权限、特权、权利等,将不胜感激。
    如果我不是完全被难住了,我就不会在这里,但我希望团队的经验和知识再次闪耀。我感谢您花时间阅读这堵文字墙。感谢您的善意,感谢您成为使 StackOverflow 对所有人如此有用的人!

    最佳答案

    所以经过大量的调试和困扰很多人的信息之后,我终于找到了写RunWithDebugEnabled的人。应用程序并了解其运行方式。

    在这种情况下,问题在于 Debug programs域管理员的本地策略中的特权已被删除,因此 SeDebugPrivilege进程的访问 token 中不存在 token 。如果它根本不存在,则无法启用它,我仍然知道无法将特权添加到现有访问 token 。

    当前魔法的工作原理:
    所以RunWithDebugEnabled魔术应用程序将使用其管理员权限将自身安装为服务并启动自身,从而在 SYSTEM 下运行。用户帐户而不是域管理员。与 SYSTEM权限,应用程序然后创建一个与管理员 token 相同的新访问 token ,只有 SeDebugPrivilege token 存在。这个新 token 用于CreateProcessAsUser()并使用新启用的 SeDebugPrivilege 运行程序以前缺少的。

    我实际上不喜欢这里的这种“解决方案”,并且一直在继续寻找一种“更清洁”的方式来获得这种特权。我将在 SO 上将此作为另一个问题发布在此处,我会尽量记住将其链接到此处,以帮助其他人跟进并供将来引用。

    编辑: Impersonate SYSTEM (or equivalent) from Administrator Account

    感谢大家抽出时间和精力帮助调试和解决这个问题。真的很感激!

    关于c++ - Windows Vista/Windows 7 权限 : SeDebugPrivilege & OpenProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932461/

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