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

标签 c++ windows security winapi impersonation

模拟用户的典型方法是调用 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/

相关文章:

c - 检测到域的连接

c# - 序列化和散列

c++ - 在 namespace 内的 lambda 中使用时找不到运算符重载

c++ - 选酒动态规划

C++ Caesar 加密项目 (ASCII)

c++ - 如果找到,删除字符串中的第一个字符

windows - 在 Windows 中使用 pkg-config 查找库

c# - 将 C# 集成到 C 到 Java 时出现 OutOfMemoryError/程序崩溃

ruby-on-rails - 最灵活的 Rails 密码安全实现

java - 使用默认解析器的 JAXB XXE 攻击