使用Process Explorer中的“结束进程”防止用户进程被终止

时间:2011-05-31 10:06:07

标签: c++ windows process

我注意到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;
}

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:9)

运行我的副本时,在终止权限上设置了拒绝(Process Explorer显示此内容)。

据推测,他们会在进程加载时调用SetKernelObjectSecurity来更改/删除ACL。

答案 2 :(得分:-3)

我试图在编写Windows服务的帮助下完成它,然后进行一些更改

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

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

fCanStop = FALSE; fCanShutdown = FALSE;