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

问题描述:

我注意到GoogleToolbarNotifier.exe无法从Process Explorer中终止。它返回“访问被拒绝”。它以用户身份运行,运行“正常”优先级,并从Program Files运行。防止用户进程被Process Explorer中的“End Process”终止

他们是怎么做到的?

我想可能有一种方法来修改ACL,或者将进程标记为'critical',但我似乎无法找到任何东西。

更新:

我发现挖一个好一点的答案。 @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; 
} 
+0

它是否以管理员权限运行并且PE不是? – Sushisource 2011-05-31 10:07:31

+0

PE以管理员(提升)权限运行。进程是普通的非管理员用户。 – Blazes 2011-05-31 10:27:26

+0

它很好,谢谢。您应该将其作为答案发布并接受它 – 2011-07-27 08:46:31

当运行我的副本已拒绝集上终止许可(Process Explorer显示了这一点)。

假设他们调用SetKernelObjectSecurity以在其进程加载时更改/删除ACL。

+7

请注意,当以管理员身份运行程序(如任务管理器和进程资源管理器)时,这不起作用,因为使用SeDebugPrivilege时,进程和线程将绕过访问检查。 – wj32 2011-05-31 10:53:55

+0

因为你对PROCESS_TERMINATE权限是正确的,所以给你信任。我终于找到了代码来做到这一点... – Blazes 2011-05-31 13:00:53

问题中给出的代码具有误导性。它构造了一个DACL,没有允许条目和一个拒绝条目;如果将DACL应用于启用了继承的文件,这可能是有意义的,但在这种情况下,拒绝条目是多余的。在Windows访问控制模型中,如果DACL存在但不包含匹配的ACE,access is implicitly denied

这是我的版本,它应用一个空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; 
} 
+0

这个解决方案在XP上不适用于我。我仍然可以终止Process Explorer中的进程。 – kobik 2017-01-17 14:21:32

+0

@ kobik:你是否以管理员身份登录? XP没有UAC,因此如果您使用管理权限登录,则Process Explorer将以管理权限运行。正如wj32已经提到的那样,如果Process Explorer以管理权限运行,则绕过进程权限。这是设计。 – 2017-01-17 20:31:57

+0

@SneakyTactician,Windows 10中的任务管理器会自动升级,因此如果您的帐户具有管理权限 - 除了可能在企业环境中(通常情况下除外),那么无论权限如何,任务管理器都将始终能够终止进程。 (在Windows 7上,您必须通过“显示来自所有用户的进程”按钮来请求任务管理器进行升级。) – 2017-09-05 22:31:13

我试图与编写Windows服务..和然后做一些改变

这里的帮助下做到这一点是链接到编写一个简单的窗口服务 http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948

,我们可以更新Servicabase.cpp与以下两个语句中的文件..

fCanStop = FALSE; fCanShutdown = FALSE;

+0

小型控制台例如。即nuke-m可以杀死你的服务。即使您将两个值设置为false也是如此。 – 2015-02-11 10:57:59

+0

这不会影响Process Explorer,它只会影响Service管理工具(以及等效工具,例如'sc')。所以它与这个问题无关。 – 2017-01-17 21:18:41