如何保护进程免于被杀?

时间:2016-01-28 11:38:55

标签: c++ windows winapi g++

我试图保护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;
}

但是我可以从任务管理器中删除进程!什么错了?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

有一项工作。而不是使流程不可销售,您可以制作流程&#34; critical&#34;这意味着终止此进程会导致Windows系统崩溃(BSOD)。

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

但请记住:您必须在注销和/或系统关闭时实施适当的终止。否则系统会在这种情况下崩溃。