Bla*_*zes 17 c++ windows process
我注意到无法从Process Explorer中杀死GoogleToolbarNotifier.exe.它返回"拒绝访问".它以用户身份运行,运行"正常"优先级,并从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;
}
Run Code Online (Sandbox Code Playgroud)
Har*_*ton 10
问题中给出的代码具有误导性.它构造一个没有允许条目和一个拒绝条目的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;
}
Run Code Online (Sandbox Code Playgroud)
运行我的副本时,Deny设置了Terminate权限(Process Explorer显示了这一点).
据推测,他们会SetKernelObjectSecurity在进程加载时调用更改/删除ACL.
| 归档时间: |
|
| 查看次数: |
14153 次 |
| 最近记录: |