首页 > 解决方案 > 是否可以模拟进程的访问令牌?

问题描述

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

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

标签: c++windowssecuritywinapiimpersonation

解决方案


不,这是不可能的。正式存在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无论如何在这种情况下更好地使用功能。


推荐阅读