c++ - 是否可以模拟进程的访问令牌?
问题描述
模拟用户的典型方法是调用 LogOnUser() 来获取用户的访问令牌,并将此令牌传递给 ImpersonateLoggedOnUser() 进行模拟。
但是,这只会模拟调用线程的用户。有没有办法模拟或更改进程的访问令牌(主令牌)?支持 我正在访问一个网络共享,并产生了多个线程来访问该网络共享的不同部分。我是否必须在所有这些线程中模拟远程用户(有权访问该共享)?或者有没有办法首先“模拟”该进程,以便在产生新线程时它们已经通过自动继承进程主令牌来获得访问权限?
解决方案
不,这是不可能的。正式存在ProcessAccessToken
的信息类NtSetInformationProcess
。它以PROCESS_ACCESS_TOKEN
结构为输入。它没有记录,但在ntddk.h
// // Process Security Context Information // NtSetInformationProcess using ProcessAccessToken // PROCESS_SET_ACCESS_TOKEN access to the process is needed // to use this info level. // typedef struct _PROCESS_ACCESS_TOKEN { // // Handle to Primary token to assign to the process. // TOKEN_ASSIGN_PRIMARY access to this token is needed. // HANDLE Token; // // Handle to the initial thread of the process. // A process's access token can only be changed if the process has // no threads or a single thread that has not yet begun execution. // // N.B. This field is unused. // HANDLE Thread; } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
所以请注意
只有当进程没有线程或单个线程尚未开始执行时,才能更改进程的访问令牌。
真的在 xp/2003 上没有那么严格的条件:来自wrk中的 PspAssignPrimaryToken
仅当进程没有线程或只有一个线程时,才能替换主令牌。
但是从vista开始,这个添加的还没有开始执行
如果你调用它来进行自我处理(你可能需要SeAssignPrimaryTokenPrivilege特权并且可以STATUS_PRIVILEGE_NOT_HELD
没有它,取决于令牌类型) - 你得到了STATUS_NOT_SUPPORTED
错误。例如_
所以在实践中,我们只能在我们以挂起状态启动进程后更改进程令牌(例如看这个答案)。但CreateProcessAsUserW
无论如何在这种情况下更好地使用功能。
推荐阅读
- gem5 - 是否可以将信息从 O3 核心的加载队列一直发送到 Ruby 状态机?
- android - 如何根据 Android 应用上的微调器值发送通知?
- python - 请编写此循环并使用 python 在一行中尝试/除
- java - 如何通过凌空将微调器数据发送到数据库
- angular - SVG 元素在浏览器中呈现但在屏幕上不可见
- npm - 我需要将“.gitignore”中的内容复制粘贴到“.npmignore”吗
- javascript - Node.js Puppeteer - 无法在 page.evaluate 中设置 HTML 元素
- android - 尝试将元素添加到 MutableList 时出现 UnsupportedOperationException
- asp.net - ASP.NET MVC 更改 post 方法以保存 userId
- python - 在 python 中读取 llvm 位码