使用Process Explorer防止用户进程被“结束进程”杀死

17
我注意到从进程管理器中无法结束GoogleToolbarNotifier.exe,它会返回“拒绝访问”。它以用户身份运行,“正常”优先级运行,并且从Program Files中运行。
他们是如何做到的?
我认为可能有一种方法可以修改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_INFORMATION, NULL, NULL, pTempDacl, NULL );
    // check dwErr...
    LocalFree( pTempDacl );
    CloseHandle( hProcess );
    return dwErr == ERROR_SUCCESS;
}

它是否正在使用管理员权限运行,而PE不是? - Sushisource
它运行得很好,谢谢。你应该将其发布为答案并接受它。 - Andriy Tylychko
1
您不能关闭由GetCurrentProcess检索到的进程句柄,因为它是伪句柄。 - Norbert Willhelm
请参考以下链接:http://security.stackexchange.com/questions/30985/create-a-unterminable-process-in-windows - Raghav Guar
3
请在回答中发布您的答案,而不是在问题中发布。 - anon
显示剩余3条评论
3个回答

10
问题陈述中给出的代码是有误导性的。它创建了一个不包含任何允许规则但包含一个拒绝规则的DACL;如果你将该DACL应用到启用了继承的文件上,那么这样做可能是有意义的,但在本例中,该拒绝规则是多余的。在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, NULL, pEmptyDacl, NULL);
    }

    free(pEmptyDacl);
    return dwErr;
}

这个解决方案在我的XP系统上没有起作用。我仍然可以通过进程管理器终止该进程。 - kobik
@kobik:你以管理员身份登录了吗?XP系统没有用户账户控制,所以如果你以管理员权限登录,则Process Explorer会以管理员权限运行。正如wj32已经指出的那样,如果Process Explorer以管理员权限运行,则进程权限将被绕过。这是按设计来的。 - Harry Johnston
@SneakyTactician,Windows 10中的任务管理器会自动提升权限,因此如果您的帐户具有管理员特权(通常情况下都是如此,除非在企业环境中),则任务管理器将始终能够杀死进程,而不受权限的限制。(在Windows 7中,您需要通过“显示所有用户的进程”按钮请求任务管理器提升权限。) - Harry Johnston

9

当运行我的拷贝时,终止权限上设置了拒绝(Process Explorer 显示这一点)。

可能他们在进程加载时调用SetKernelObjectSecurity来改变或移除ACLs。


7
请注意,当以管理员身份运行像任务管理器和进程资源管理器这样的程序时,此设置不起作用,因为使用SeDebugPrivilege特权时,对于进程和线程,访问检查将被绕过。 - wj32
因为您在 PROCESS_TERMINATE 权限方面是正确的,所以我给了您信用。最终,我找到了相应的代码... - Blazes

-4

一个小的控制台,比如说 nuke-m,可以即时杀死你的服务。即使你将两个值都设置为 false。 - Zen Of Kursat
这不会影响进程管理器,只会影响服务管理工具(和类似于“sc”的工具)。因此,这与本问题无关。 - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接