允许非管理员进程从管理进程中读取

时间:2014-11-13 14:23:32

标签: c++ process admin token privileges

让我尽量详细解释我的情况。我有2个流程,流程A和流程B. 进程A以管理员身份运行,而进程B则不以。现在,我想允许流程B使用PROCESS_VM_READ打开流程A,以便它可以使用ReadProcessMemory从流程A中读取。

所以我尝试了一些事情,我决定从进程A中查找进程B的令牌组和令牌权限,然后在自身上调用AdjustTokenGroupAdjustTokenPrivileges,以便复制权限和来自流程B的群组。很遗憾,我无法执行此操作ERROR_CANT_ENABLE_DENY_ONLY。我还试图给进程B提供进程A的相同组和权限,但这导致了ERROR_NOT_ALL_ASSIGNED。当我只是复制令牌权限时,它仍然无法读取。

这是我尝试过的一个例子(在过程A中):

BOOL MatchPrivilege( HANDLE hProcess )
{
    HANDLE ProcessToken = NULL;
    HANDLE OurProcessToken = NULL;

    if( OpenProcessToken( hProcess, TOKEN_QUERY, &ProcessToken ) && OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS, &OurProcessToken ) )
    {
        DWORD RequiredSizePrivileges = 0;
        GetTokenInformation( ProcessToken, TokenPrivileges, NULL, 0, &RequiredSizePrivileges );

        DWORD RequiredSizeGroups = 0;
        GetTokenInformation( ProcessToken, TokenGroups, NULL, 0, &RequiredSizeGroups );

        if( RequiredSizePrivileges > 0 && RequiredSizeGroups > 0 )
        {
            VOID* ProcessPrivileges = malloc( RequiredSizePrivileges );
            VOID* ProcessGroups = malloc( RequiredSizeGroups );

            DWORD SizePrivileges = 0;
            DWORD SizeGroups = 0;

            if( GetTokenInformation( ProcessToken, TokenPrivileges, ProcessPrivileges, RequiredSizePrivileges, &SizePrivileges ) 
                && GetTokenInformation( ProcessToken, TokenGroups, ProcessGroups, RequiredSizeGroups, &SizeGroups ) )
            {
                if( AdjustTokenPrivileges( OurProcessToken, FALSE, ( TOKEN_PRIVILEGES* )ProcessPrivileges, SizePrivileges, NULL, NULL ) 
                    && AdjustTokenGroups( OurProcessToken, FALSE, ( TOKEN_GROUPS* )ProcessGroups, SizeGroups, NULL, NULL ) )
                {
                    free( ProcessPrivileges );
                    free( ProcessGroups );
                    return TRUE;
                }
            }

            free( ProcessPrivileges );
            free( ProcessGroups );
        }
    }

    return FALSE;
}

所有流程B都会使用OpenProcess致电PROCESS_VM_READ,然后在流程A的有效地址上调用ReadProcessMemory。欢迎任何帮助,建议和评论。

0 个答案:

没有答案