防止用户进程被进程资源管理器中的"End Process"杀死
Prevent user process from being killed with "End Process" from Process Explorer
我注意到GoogleToolbarNotificationer.exe无法从Process Explorer中终止。返回"拒绝访问"。它以用户身份运行,运行"正常"优先级,并从程序文件运行。
他们是怎么做到的?
我认为可能有一种方法可以修改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;
}
问题中给出的代码具有误导性。它构造了一个没有允许条目和一个拒绝条目的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;
}
运行的副本时,在Terminate权限上设置了Deny(Process Explorer显示了这一点)。
假设它们在加载进程时调用SetKernelObjectSecurity
来更改/删除ACL。
我曾尝试在编写windows服务的帮助下完成这项工作。。然后进行一些更改
这是编写一个简单windows服务的链接http://code.msdn.microsoft.com/windowsdesktop/CppWindowsService-cacf4948
我们可以用以下两条语句更新Servicabase.cpp文件。。
fCanStop=FALSE;fCanShutdown=FALSE;
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- boost::进程间消息队列引发错误
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 终止 QProcess 不会终止子进程
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- Windows 进程间同步类似事件?
- 在挂钩启动新线程时解除挂钩进程
- pclose() 不会给我进程退出代码
- 运行代码时,c++ 会终止进程
- 如何在后台进程上处理来自Windows任务管理器的"End Task"?
- 防止用户进程被进程资源管理器中的"End Process"杀死