防止用户进程被Process Explorer中的“ End Process”杀死

问题描述

| 我注意到GoogletoolbarNotifier.exe无法从Process Explorer中终止。它返回“拒绝访问”。它以用户身份运行,具有\“ normal \”优先级,并且从程序文件运行。 他们是如何做到的呢? 我认为可能有一种方法可以修改ACL或将过程标记为“关键”,但是我似乎找不到任何东西。 更新: 我很认真地找到了答案。 @Alex K.是正确的,因为已删除该过程的PROCESS_TERMINATE权限,但是我想用代码提供答案:
static const bool ProtectProcess()
{
    HANDLE hProcess = GetCurrentProcess();
    EXPLICIT_ACCESS denyAccess = {0};
    DWORD dwAccesspermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL;
    BuildExplicitaccessWithName( &denyAccess,_T(\"CURRENT_USER\"),dwAccesspermissions,DENY_ACCESS,NO_INHERITANCE );
    PACL pTempDacl = NULL;
    DWORD dwErr = 0;
    dwErr = SetEntriesInAcl( 1,&denyAccess,NULL,&pTempDacl );
    // check dwErr...
    dwErr = SetSecurityInfo( hProcess,SE_KERNEL_OBJECT,DACL_Security_@R_93_4045@ION,pTempDacl,NULL );
    // check dwErr...
    LocalFree( pTempDacl );
    CloseHandle( hProcess );
    return dwErr == ERROR_SUCCESS;
}
    

解决方法

        运行该副本时,在“终止”权限上设置了“拒绝”(Process Explorer会显示此信息)。 大概在过程加载时,他们调用ѭ1来更改/删除ACL。     ,        问题中给出的代码具有误导性。它构造一个没有允许条目和一个拒绝条目的DACL。如果将DACL应用于启用了继承的文件,则可能有意义,但是在这种情况下,deny条目是多余的。在Windows访问控制模型中,如果存在DACL但不包含匹配的ACE,则访问被隐式拒绝。 这是我的版本,该版本应用空的DACL,拒绝所有访问。 (请注意,它返回错误代码而不是布尔值。)
DWORD ProtectProcess(void)
{
    HANDLE hProcess = GetCurrentProcess();
    PACL pEmptyDacl;
    DWORD dwErr;

    // using malloc guarantees proper alignment
    pEmptyDacl = (PACL)malloc(sizeof(ACL));

    if (!InitializeAcl(pEmptyDacl,sizeof(ACL),ACL_REVISION))
    {
        dwErr = GetLastError();
    }
    else
    {
        dwErr = SetSecurityInfo(hProcess,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,pEmptyDacl,NULL);
    }

    free(pEmptyDacl);
    return dwErr;
}
    ,        我试图借助编写Windows服务..然后进行一些更改来做到这一点。 这是编写简单Windows服务的链接 http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948 我们可以使用以下两个语句更新Servicabase.cpp文件。 fCanStop = FALSE; fCanShutdown = FALSE;