2016-01-28 59 views
-1

我试图保护的过程在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; 
} 

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

+0

http://www.tutorialspoint.com/cplusplus/cpp_signal_handling.htm –

+0

@Holonout我不明白,这个URL是关于信号,它是什么连接到这个?你能解释更多吗? – user3671325

+1

对不起用户,错误的链接。这将更好地适合您的要求:http://security.stackexchange.com/questions/30985/create-a-unterminable-process-in-windows –

回答

1

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

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

0

有一个工作。您可以将流程设置为“关键”,而不是使流程变得无法运行,这意味着杀死此流程会导致Windows系统崩溃(BSOD)。

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

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

+0

谢谢,我会测试,并分享如果结果工作! – user3671325

+0

它不起作用!我只是简单地关闭了其他进程的过程!不会有所不同。 – user3671325

+0

您是否以管理员权限开始申请?这是必需的。我在Windows XP,7和8.1中使用它 - 工作正常。当试图杀死任务管理器中的进程时,您会收到有关系统终止的警告。 – Konrad