防止用户进程被进程资源管理器中的"End Process"杀死

Prevent user process from being killed with "End Process" from Process Explorer

本文关键字:进程 End Process 杀死 资源管理器 用户      更新时间:2023-10-16

我注意到GoogleToolbarNotificationer.exe无法从Process Explorer中终止。返回"拒绝访问"。它以用户身份运行,运行"正常"优先级,并从程序文件运行。

他们是怎么做到的?

我认为可能有一种方法可以修改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;
}

问题中给出的代码具有误导性。它构造了一个没有允许条目和一个拒绝条目的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;
}

运行的副本时,在Terminate权限上设置了Deny(Process Explorer显示了这一点)。

假设它们在加载进程时调用SetKernelObjectSecurity来更改/删除ACL。

我曾尝试在编写windows服务的帮助下完成这项工作。。然后进行一些更改

这是编写一个简单windows服务的链接http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948

我们可以用以下两条语句更新Servicabase.cpp文件。。

fCanStop=FALSE;fCanShutdown=FALSE;