【问题标题】:Can someone explain RtlAdjustPrivilege有人可以解释 RtlAdjustPrivilege
【发布时间】:2018-06-22 22:52:04
【问题描述】:

我了解java和python,但是任何名称中包含C的语言都很难理解和学习。最近我试图使用 NtRaiseHardError 在 Windows 中创建 BSOD,在 c++ 中尝试几次(不成功)后,我转向了 c#。

使用来自here 的代码我能够制作一个程序并导致蓝屏死机。后来我试图完全理解代码,但我无法理解 RtlAdjustPrivilege 在做什么。

我看到这是某种权限更改,但是在程序运行时,尽管我使用的是用户帐户,但我没有看到管理员密码提示,所以我相信它没有升级到管理员权限。如果有人知道这个函数到底是做什么的或它是如何工作的,请解释一下。它是这样实现的:

要导入它:

[DllImport("ntdll.dll")]
private static extern uint RtlAdjustPrivilege
(
    int Privilege,
    bool bEnablePrivilege,
    bool IsThreadPrivilege,
    out bool PreviousValue
);

以后再用:

RtlAdjustPrivilege(19, true, false, out bool previousValue);

【问题讨论】:

    标签: c# c function bsod ntdll


    【解决方案1】:

    19 是 SE_SHUTDOWN_PRIVILEGE - 在 wdm.h 中声明。

    RtlAdjustPrivilege打开当前进程(if IsThreadPrivilege := false)或当前线程(if IsThreadPrivilege := true)token,然后调用ZwAdjustPrivilegeToken (@987654324 @ 是这个 api 的薄壳),最后关闭打开的令牌。

    ZwAdjustPrivilegeToken (AdjustTokenPrivileges) 函数启用或禁用指定访问令牌中的权限。但权限必须已经在令牌中

    【讨论】:

    • @JustHobby - 是的。正确的。仅启用或禁用单个权限。如果想要更多 - 最好致电AdjustTokenPrivileges
    • 感谢@RbMm 的帮助
    • @JustHobby 当然这个 api“未记录”,但在所有 Windows 版本中从 ntdll.dll 导出,我认为 - 总是会被导出。它允许更简单地调整单个权限。我们需要更多——当然AdjustTokenPrivileges(或ZwAdjustPrivilegeToken)在这里效率更高,但几次调用RtlAdjustPrivilege也不错。和函数返回NTSATUS - long(可以假设和int - 这是相同的),但不是uint - 从某种意义上说这是签名结果,我们将其比较为> = 0(ok)或(
    • 我知道它是“未记录的”,但它很容易调用,所以我以任何方式使用它。我对 Windows 编程不是很了解,但如果我能得到相同的结果,我想我下次会使用 AdjustTokenPrivileges。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 2012-05-23
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多