gpt4 book ai didi

c++ - 是否可以模拟进程的访问 token ?

转载 作者:可可西里 更新时间:2023-11-01 11:23:03 24 4
gpt4 key购买 nike

模拟用户的典型方法是调用 LogOnUser() 以获取用户的访问 token 并将此 token 传递给 ImpersonateLoggedOnUser() 以进行模拟。

但是,这只会模拟调用线程 的用户。有没有办法模拟或更改进程的访问 token (主 token )?支持 我正在访问网络共享,并且生成了多个线程来访问该网络共享的不同部分。我是否必须在所有这些线程中模拟远程用户(有权访问该共享)?还是有一种方法可以先“模拟”进程,以便在生成新线程时,它们已经通过自动继承进程主 token 获得了访问权限?

最佳答案

不,这是不可能的。 NtSetInformationProcess 的正式存在 ProcessAccessToken 信息类。它以 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;

所以请注意

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.

真正在 xp/2003 上条件不那么严格:来自 wrk 中的 PspAssignPrimaryToken

A primary token can only be replaced if the process has no threads, or has one thread.

但是从vista开始这个添加还没有开始执行

如果您为自己的进程调用它(您可能需要 SeAssignPrimaryTokenPrivilege 权限并且可以在没有它的情况下获得 STATUS_PRIVILEGE_NOT_HELD,具体取决于 token 类型)- 您获得了 STATUS_NOT_SUPPORTED 错误。对于example

所以在实践中,我们只能在以挂起状态启动进程后更改进程 token (例如,查看 answer )。但最好使用 CreateProcessAsUserW无论如何在这种情况下都能发挥作用。

关于c++ - 是否可以模拟进程的访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57753029/

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