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

我注意到GoogleToolbarNotifier.exe不能从Process Explorer中被杀死。 它返回“访问被拒绝”。 它以用户身份运行,运行“正常”优先级,并从程序文件运行。

他们是如何做到的呢?

我认为可能有一种方法来修改ACL,或者将进程标记为“关键”,但我似乎无法find任何东西。

更新:

我find了一个很好的挖掘答案。 @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; } 

当运行我的副本具有拒绝设置终止权限(进程资源管理器显示此)。

据推测,他们调用SetcoreelObjectSecurity来更改/删除它们的进程加载ACL。

问题中的代码是误导性的。 它构建了一个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; } 

我试图做到这一点与写作Windows服务的帮助,然后做出一些改变

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

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

fCanStop = FALSE; fCanShutdown = FALSE;