【问题标题】:Prevent user process from being killed with "End Process" from Process Explorer防止用户进程被进程资源管理器中的“结束进程”杀死
【发布时间】:2011-09-05 08:54:40
【问题描述】:

我注意到 GoogleToolbarNotifier.exe 无法从 Process Explorer 中杀死。它返回“拒绝访问”。它以用户身份运行,以“正常”优先级运行,并从 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 不是?
  • PE 以管理员(提升)权限运行。进程是普通的非管理员用户。
  • 效果很好,谢谢。您应该将其发布为答案并接受它
  • 您不能关闭 GetCurrentProcess 检索到的进程句柄,因为它是一个伪句柄。
  • 请在答案中发布您的答案,而不是在问题中。

标签: c++ windows process


【解决方案1】:

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

大概他们在他们的进程加载时调用SetKernelObjectSecurity 来更改/删除 ACL。

【讨论】:

  • 请注意,当以管理员身份运行任务管理器和进程资源管理器等程序时,这不起作用,因为使用 SeDebugPrivilege 会绕过进程和线程的访问检查。
  • 感谢您,因为您对 PROCESS_TERMINATE 权限的看法是正确的。我最终找到了这样做的代码......
【解决方案2】:

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

【讨论】:

  • 这个解决方案在 XP 上对我不起作用。我仍然可以从 Process Explorer 终止进程。
  • @kobik:您是以管理员身份登录的吗? XP 没有 UAC,因此如果您使用管理权限登录,则 Process Explorer 正在使用管理权限运行。正如 wj32 已经指出的,如果 Process Explorer 以管理权限运行,则绕过进程权限。这是设计使然。
  • @SneakyTactician,Windows 10 中的任务管理器会自动提升,因此,如果您的帐户具有管理权限 - 它通常会,但可能在企业环境中除外 - 那么任务管理器将始终能够杀死一个进程,无论权限如何。 (在 Windows 7 上,您必须要求任务管理器通过“显示所有用户的进程”按钮进行提升。)
【解决方案3】:

我尝试在编写 Windows 服务的帮助下做到这一点..然后进行一些更改

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

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

fCanStop=假; fCanShutdown=FALSE;

【讨论】:

  • 一个小控制台,例如。即 nuke-m 可以立即杀死您的服务。即使您将这两个值都设置为 false。
  • 这不会影响 Process Explorer,它只会影响服务管理工具(以及等效工具,例如 sc)。所以它与这个问题无关。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多