让我尽量详细解释我的情况。我有2个流程,流程A和流程B.
进程A以管理员身份运行,而进程B则不以。现在,我想允许流程B使用PROCESS_VM_READ
打开流程A,以便它可以使用ReadProcessMemory
从流程A中读取。
所以我尝试了一些事情,我决定从进程A中查找进程B的令牌组和令牌权限,然后在自身上调用AdjustTokenGroup
和AdjustTokenPrivileges
,以便复制权限和来自流程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
。欢迎任何帮助,建议和评论。