怎么正确使用openprocesstoken?新手程序员看这篇指南

吉云

大家今天就来聊聊我捣鼓OpenProcessToken这玩意儿的经历。不是啥高深理论,就是我自己瞎折腾的过程记录,希望能给同样在摸索的朋友一点启发。

初衷:想看看别的进程

起因很简单,就是有时候,我想看看别的程序到底在干嘛或者想获取它的一些信息,比如它的权限啥的。光知道个进程ID(PID)好像没啥用,直接去访问人家,系统肯定不让,说你没权限。

怎么正确使用openprocesstoken?新手程序员看这篇指南

摸索过程:碰壁与发现

我就知道得先拿到那个目标进程的“句柄”,像是个门把手,有它才能操作。我就试试OpenProcess这个函数,想着拿到句柄就好办。结果?一调用,很多时候直接返回失败,说“访问被拒绝”。得,权限不够。

没办法,只能继续查资料,看看怎么才能“提升”我自己的权限,或者说,让我的程序有权去“打开”别的进程。这时候,OpenProcessToken就进入我的视线。

网上查查,大概意思是,每个进程都有个“访问令牌”(Access Token),这玩意儿记录进程的安全信息,包括它的用户、组、还有就是特权(Privileges)OpenProcessToken就是用来打开这个令牌的。

但这里有个鸡生蛋蛋生鸡的问题:我要用OpenProcess打开目标进程,需要权限;而要调整我自己的权限,似乎也得先用OpenProcessToken打开我自己的进程令牌。

动手实践:一步步来

怎么正确使用openprocesstoken?新手程序员看这篇指南

行,那就一步步来。我的思路是这样的:

  • 第一步:先搞定自己的令牌。 我得先拿到我自己进程的令牌句柄。这个简单点,用GetCurrentProcess()拿到当前进程的伪句柄,然后传给OpenProcessToken。这里请求的权限(DesiredAccess)得注意,因为我后面要修改它,所以得要TOKEN_ADJUST_PRIVILEGESTOKEN_QUERY这些权限。
  • 第二步:查找需要的特权。 我解到,要想有权打开其他进程(特别是系统级别的),通常需要一个叫SeDebugPrivilege的特权。这个特权名字是个字符串,但系统里认的是一个叫LUID的内部标识符。我得用LookupPrivilegeValue这个函数,把我这个进程令牌的句柄(上一步拿到的)和"SeDebugPrivilege"这个名字传进去,它会告诉我对应的LUID是
  • 第三步:尝试启用特权。 知道LUID,接下来就是关键一步:用AdjustTokenPrivileges函数。这个函数有点复杂,得构造一个结构体,告诉它我要启用(或者禁用)哪个LUID对应的特权。我把上一步查到的SeDebugPrivilege的LUID放进去,设置标志位为SE_PRIVILEGE_ENABLED。调用这个函数,如果成功,我的进程理论上就有调试权限。这一步要特别小心,权限不是随便加的,用完最好恢复回去。
  • 第四步:再次尝试打开目标进程。 我的进程有SeDebugPrivilege(理论上),我再次调用OpenProcess,传入目标进程的PID和想要的访问权限(比如PROCESS_QUERY_INFORMATION)。这回成功率就大大提高!能拿到目标进程的有效句柄。
  • 怎么正确使用openprocesstoken?新手程序员看这篇指南

  • 第五步:打开目标进程的令牌。 终于到最终目的。有目标进程的句柄(上一步拿到的),我再调用OpenProcessToken,把这个句柄和想要的访问权限(比如TOKEN_QUERY)传进去。如果一切顺利,就能拿到目标进程的访问令牌句柄!

结果与感受

经过这么一番折腾,总算是成功拿到目标进程的令牌句柄。拿到之后,就可以用这个句柄去做更多事情,比如查询它的用户、组信息,或者看看它到底有哪些特权等等。

整个过程下来,感觉就像是在闯关。一开始被权限大门拦住,然后到处找钥匙(查资料),找到OpenProcessToken和相关的权限调整函数,一步步给自己“赋能”,才打开那扇门。

强调一下,提升权限和访问其他进程是比较敏感的操作,得确保你知道自己在干什么,并且有正当理由。尤其那个SeDebugPrivilege,权力很大,用不好可能会影响系统稳定或者带来安全风险。我这只是记录下自己的实践过程,大家要用的话务必谨慎。

怎么正确使用openprocesstoken?新手程序员看这篇指南

好,这回关于OpenProcessToken的折腾就分享到这里。纯粹是个人捣鼓记录,说得比较糙,希望能对大家有点用处。

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

目录[+]