zoukankan      html  css  js  c++  java
  • CC++各路高手以及操作系统专家请进来杀死这个进程

            通常情况下编写一个程序,能够点击关闭button正常结束程序,也能够使用任务管理器结束任务,还能够使用taskkill等命令杀死进程,实在都不行也能够直接重新启动计算机。

            可是,这些方法真的都管用吗?我认为不一定。今天晚上闲着没事,想写一个杀不死的程序。设计思路如为写三个程序ProcessMainProcess1Process2,相互保护,详细例如以下:

    • 1、依照平时的方法写一个程序ProcessMain实现你的功能;
    • 2、再写一个程序Process1保护ProcessMain和Process2都不被杀掉;
    • 3、再写一个程序Process2保护Process1不被杀掉。

            画个草图,有助理解:


            以上是该程序的主要思想,详细代码例如以下:

    (为了简化程序。将ProcessMain设置为Windows自带的计算器“calc.exe”)


    Process1:

    #include <windows.h>  
    #include <tlhelp32.h> //进程快照函数头文件  
    #include <stdio.h>  
    
    bool getProcess(const char *procressName)               //此函数进程名不区分大写和小写  
    {  
    	char pName[MAX_PATH];                               //和PROCESSENTRY32结构体中的szExeFile字符数组保持一致,便于比較  
    	strcpy(pName,procressName);                         //拷贝数组  
    	CharLowerBuff(pName,MAX_PATH);                      //将名称转换为小写  
    	PROCESSENTRY32 currentProcess;                      //存放快照进程信息的一个结构体  
    	currentProcess.dwSize = sizeof(currentProcess);     //在使用这个结构之前,先设置它的大小  
    	HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的全部进程拍一个快照  
    
    	if (hProcess == INVALID_HANDLE_VALUE)  
    	{  
    		printf("CreateToolhelp32Snapshot()调用失败!
    ");  
    		return false;  
    	}  
    
    	bool bMore=Process32First(hProcess,¤tProcess);        //获取第一个进程信息  
    	while(bMore)  
    	{  
    		CharLowerBuff(currentProcess.szExeFile,MAX_PATH);       //将进程名转换为小写  
    		if (strcmp(currentProcess.szExeFile,pName)==0)          //比較是否存在此进程  
    		{  
    			CloseHandle(hProcess);                              //清除hProcess句柄  
    			return true;  
    		}  
    		bMore=Process32Next(hProcess,¤tProcess);          //遍历下一个  
    	}  
    
    	CloseHandle(hProcess);  //清除hProcess句柄  
    	return false;  
    }  
    
    int main()  
    {  
    
    	while(1)
    	{
    		if (!getProcess("calc.exe"))		 //假设被保护的进程不存在(被杀死)。则启动该进程
    		{  
    			system("start calc.exe");
    		}  
    		if (!getProcess("process2.exe"))	//假设保护进程process2不存在,则启动该进程
    		{
    			system("start process2.exe");
    		}
    		Sleep(10);						//同意你睡一会,但不能“睡着”。要看好被保护的进程
    	}
    	system("pause");
    	return 0;  
    }  

    Process2:

    #include <windows.h>  
    #include <tlhelp32.h> //进程快照函数头文件  
    #include <stdio.h>  
    
    bool getProcess(const char *procressName)               //此函数进程名不区分大写和小写  
    {  
    	char pName[MAX_PATH];                               //和PROCESSENTRY32结构体中的szExeFile字符数组保持一致,便于比較  
    	strcpy(pName,procressName);                         //拷贝数组  
    	CharLowerBuff(pName,MAX_PATH);                      //将名称转换为小写  
    	PROCESSENTRY32 currentProcess;                      //存放快照进程信息的一个结构体  
    	currentProcess.dwSize = sizeof(currentProcess);     //在使用这个结构之前,先设置它的大小  
    	HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的全部进程拍一个快照  
    
    	if (hProcess == INVALID_HANDLE_VALUE)  
    	{  
    		printf("CreateToolhelp32Snapshot()调用失败!
    ");  
    		return false;  
    	}  
    
    	bool bMore=Process32First(hProcess,¤tProcess);        //获取第一个进程信息  
    	while(bMore)  
    	{  
    		CharLowerBuff(currentProcess.szExeFile,MAX_PATH);       //将进程名转换为小写  
    		if (strcmp(currentProcess.szExeFile,pName)==0)          //比較是否存在此进程  
    		{  
    			CloseHandle(hProcess);                              //清除hProcess句柄  
    			return true;  
    		}  
    		bMore=Process32Next(hProcess,¤tProcess);          //遍历下一个  
    	}  
    
    	CloseHandle(hProcess);  //清除hProcess句柄  
    	return false;  
    }  
    
    int main()  
    {  
    
    	while(1)
    	{
    		if (!getProcess("process1.exe"))		//假设保护进程process1不存在,则启动该进程
    		{
    			system("start process1.exe");
    		}
    		Sleep(10);								//同意睡0.01秒,不能擅自脱离防守
    	}
    	system("pause");
    	return 0;  
    }  


            以上代码能够保证用户在不关机、不注销和不重新启动的情况下杀不掉进程。甚至通过高速的批处理命令也无可奈何:

    taskkill -im process1.exe
    taskkill -im process2.exe
            假设。再改动注冊表。把Process1或Process2设为开机启动项,呵呵!那么任务管理器、DOS命令、关机、重新启动都无论用了。是不是要重装系统或者通过引导盘将这几个文件删除掉再开机呢?欢迎大家评论!

  • 相关阅读:
    Linux系统 Docker RabbitMQ容器集群部署
    Linux系统 SSH免密登入
    ubuntu server 乱码
    简单总结在github上托管工程
    在线编译系统之nodejs执行shell
    Ubuntu中软件安装与卸载
    ubuntu软件安装
    “cannot find module ‘npmlog’….”的错误
    关于事件的一点小总结
    mongodb基本操作
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5081896.html
Copyright © 2011-2022 走看看