如何保护进程不被终止

How to protect a process from being killed?

本文关键字:进程 终止 保护 何保护      更新时间:2023-10-16

我试图保护 c++ 窗口中的进程,代码为:

#include <iostream>
#include <Aclapi.h>
#include <iostream>
#include <windows.h>
#include <sddl.h>
#include <stdio.h>
using namespace std;
BOOL DenyAccess()
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = FALSE;
    SetKernelObjectSecurity(hProcess, DACL_SECURITY_INFORMATION, sa.lpSecurityDescriptor);
    return TRUE;
}
int main()
{
    while(DenyAccess());
    return 0;
}

但是我可以从任务管理器中杀死进程! 怎么了?

Windows

服务器使用一对相互监控的线程来强制执行 Windows Server 与 Windows Client 的许可。如果一个线程停止或挂起,另一个线程将恢复受影响的线程或启动新线程。线程在系统进程中运行。您无法在不使窗口崩溃的情况下终止系统进程。

因此,一种方法是将代码注入到启动一对线程的系统进程中,并让线程保护每个线程并执行任何您让无法杀死的进程执行的操作(或者让第三个线程执行您想要的任何工作)。您可以将线程设置为非常高的优先级,以确保没有任何内容可以同时成功定位两个线程。

有一个解决方法。与其使进程不可杀死,不如使进程"关键",这意味着杀死此进程会导致Windows系统崩溃(BSOD)。

这可以通过在ntdll.dll中调用未记录的函数RtlSetProcessIsCritical来完成。
请参阅 http://www.codeproject.com/Articles/43405/Protecting-Your-Process-with-RtlSetProcessIsCriti 中的详细示例

但请记住:您必须在注销和/或系统关闭时实现正确的终止。否则,在这种情况下系统将崩溃。