AdjustTokenPrivileges使用详解,安全编程必备技能

吉云

今天跟大家伙儿聊聊我捣鼓`AdjustTokenPrivileges`这个玩意儿的经历,一开始看名字就觉得挺唬人的,但真上手,也就那么回事儿。

我是想搞一个程序,需要它能干一些比较底层的活儿,结果发现权限不够,老是碰壁。上网一搜,好家伙,都说要用`AdjustTokenPrivileges`来“提升权限”。也不能算完全“提升”,更像是“调整”或者“赋予”权限。

那咋整?先得把几个关键的函数搞明白:

AdjustTokenPrivileges使用详解,安全编程必备技能

  • OpenProcessToken:这玩意儿是打开进程令牌的,说白就是拿到你当前进程的“身份证”,才能进行后续操作。
  • LookupPrivilegeValue:这个函数是用来查找权限对应的`LUID`(本地唯一ID)的。因为`AdjustTokenPrivileges`需要用到`LUID`来指定你要调整的权限。
  • AdjustTokenPrivileges:这才是主角,负责真正调整进程令牌的权限。

知道这几个函数,下一步就是撸代码。我先是尝试用`GetCurrentProcessId()`获取当前进程的ID,然后用`OpenProcessToken()`打开进程令牌。这里要注意,打开的时候要指定`TOKEN_ADJUST_PRIVILEGES`权限,不然`AdjustTokenPrivileges`没法用,会报错。

AdjustTokenPrivileges使用详解,安全编程必备技能

拿到令牌句柄之后,我就用`LookupPrivilegeValue()`去查找我需要的权限,比如`SE_DEBUG_NAME`(调试权限),拿到它的`LUID`。然后,我就构造一个`TOKEN_PRIVILEGES`结构体,把`LUID`和要启用的状态放进去。

调用`AdjustTokenPrivileges()`,把构造好的`TOKEN_PRIVILEGES`结构体传进去。如果一切顺利,这个函数会返回TRUE,表示权限调整成功。实际操作中肯定会遇到各种问题,比如权限不够,或者参数传错等等。

我记得有一次,我一直调整不成功,死活返回FALSE。后来才发现,原来是我在`OpenProcessToken()`的时候,没有指定`TOKEN_ADJUST_PRIVILEGES`权限,导致`AdjustTokenPrivileges`没法修改令牌。改过来之后,一切就都OK。

还有一次,我需要在程序里循环启用和禁用某个权限。结果发现,第一次启用/禁用都成功,但后面的操作就老是失败。查半天,才发现是我的代码逻辑有问题,没有正确地处理之前的令牌状态。后来我每次调整权限之后,都重新获取一次令牌状态,才解决这个问题。

`AdjustTokenPrivileges`这个函数虽然用起来有点儿麻烦,但功能还是很强大的。它可以让你在程序里动态地调整进程的权限,从而实现一些比较高级的功能。不过也要注意安全问题,不要滥用权限,以免造成不必要的风险。

如果你的程序需要在UAC环境下运行,并且需要提权,最好在编译的时候就设置这样可以避免一些运行时的问题。VS2010和更高版本的VS,都可以在工程属性里直接设置,非常方便。

AdjustTokenPrivileges使用详解,安全编程必备技能

总结一下我的经验:

  • 用`OpenProcessToken`拿到进程令牌。
  • 用`LookupPrivilegeValue`找到权限对应的`LUID`。
  • 用`AdjustTokenPrivileges`调整权限。
  • 注意权限和UAC设置。
  • AdjustTokenPrivileges使用详解,安全编程必备技能

希望我的这些经验能帮到大家,少走一些弯路!

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]