问题描述
|
我注意到GoogletoolbarNotifier.exe无法从Process Explorer中终止。它返回“拒绝访问”。它以用户身份运行,具有\“ normal \”优先级,并且从程序文件运行。
他们是如何做到的呢?
我认为可能有一种方法可以修改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_@R_93_4045@ION,pTempDacl,NULL );
// check dwErr...
LocalFree( pTempDacl );
CloseHandle( hProcess );
return dwErr == ERROR_SUCCESS;
}
解决方法
运行该副本时,在“终止”权限上设置了“拒绝”(Process Explorer会显示此信息)。
大概在过程加载时,他们调用ѭ1来更改/删除ACL。
, 问题中给出的代码具有误导性。它构造一个没有允许条目和一个拒绝条目的DACL。如果将DACL应用于启用了继承的文件,则可能有意义,但是在这种情况下,deny条目是多余的。在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,pEmptyDacl,NULL);
}
free(pEmptyDacl);
return dwErr;
}
, 我试图借助编写Windows服务..然后进行一些更改来做到这一点。
这是编写简单Windows服务的链接
http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948
我们可以使用以下两个语句更新Servicabase.cpp文件。
fCanStop = FALSE;
fCanShutdown = FALSE;