C\C++杀不死的进程

http://blog.csdn.net/lynch0571/article/details/32965169


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

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

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

        画个草图,有助理解:


        以上是该程序的主要思想,具体代码如下:

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


Process1:

[cpp]  view plain  copy
  1. #include <windows.h>    
  2. #include <tlhelp32.h> //进程快照函数头文件    
  3. #include <stdio.h>    
  4.   
  5. bool getProcess(const char *procressName)               //此函数进程名不区分大小写    
  6. {    
  7.     char pName[MAX_PATH];                               //和PROCESSENTRY32结构体中的szExeFile字符数组保持一致,便于比较    
  8.     strcpy(pName,procressName);                         //拷贝数组    
  9.     CharLowerBuff(pName,MAX_PATH);                      //将名称转换为小写    
  10.     PROCESSENTRY32 currentProcess;                      //存放快照进程信息的一个结构体    
  11.     currentProcess.dwSize = sizeof(currentProcess);     //在使用这个结构之前,先设置它的大小    
  12.     HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的所有进程拍一个快照    
  13.   
  14.     if (hProcess == INVALID_HANDLE_VALUE)    
  15.     {    
  16.         printf("CreateToolhelp32Snapshot()调用失败!\n");    
  17.         return false;    
  18.     }    
  19.   
  20.     bool bMore=Process32First(hProcess,¤tProcess);        //获取第一个进程信息    
  21.     while(bMore)    
  22.     {    
  23.         CharLowerBuff(currentProcess.szExeFile,MAX_PATH);       //将进程名转换为小写    
  24.         if (strcmp(currentProcess.szExeFile,pName)==0)          //比较是否存在此进程    
  25.         {    
  26.             CloseHandle(hProcess);                              //清除hProcess句柄    
  27.             return true;    
  28.         }    
  29.         bMore=Process32Next(hProcess,¤tProcess);          //遍历下一个    
  30.     }    
  31.   
  32.     CloseHandle(hProcess);  //清除hProcess句柄    
  33.     return false;    
  34. }    
  35.   
  36. int main()    
  37. {    
  38.   
  39.     while(1)  
  40.     {  
  41.         if (!getProcess("calc.exe"))         //如果被保护的进程不存在(被杀死),则启动该进程  
  42.         {    
  43.             system("start calc.exe");  
  44.         }    
  45.         if (!getProcess("process2.exe"))    //如果保护进程process2不存在,则启动该进程  
  46.         {  
  47.             system("start process2.exe");  
  48.         }  
  49.         Sleep(10);                      //允许你睡一会,但不能“睡着”,要看好被保护的进程  
  50.     }  
  51.     system("pause");  
  52.     return 0;    
  53. }    

Process2:

[cpp]  view plain  copy
  1. #include <windows.h>    
  2. #include <tlhelp32.h> //进程快照函数头文件    
  3. #include <stdio.h>    
  4.   
  5. bool getProcess(const char *procressName)               //此函数进程名不区分大小写    
  6. {    
  7.     char pName[MAX_PATH];                               //和PROCESSENTRY32结构体中的szExeFile字符数组保持一致,便于比较    
  8.     strcpy(pName,procressName);                         //拷贝数组    
  9.     CharLowerBuff(pName,MAX_PATH);                      //将名称转换为小写    
  10.     PROCESSENTRY32 currentProcess;                      //存放快照进程信息的一个结构体    
  11.     currentProcess.dwSize = sizeof(currentProcess);     //在使用这个结构之前,先设置它的大小    
  12.     HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的所有进程拍一个快照    
  13.   
  14.     if (hProcess == INVALID_HANDLE_VALUE)    
  15.     {    
  16.         printf("CreateToolhelp32Snapshot()调用失败!\n");    
  17.         return false;    
  18.     }    
  19.   
  20.     bool bMore=Process32First(hProcess,¤tProcess);        //获取第一个进程信息    
  21.     while(bMore)    
  22.     {    
  23.         CharLowerBuff(currentProcess.szExeFile,MAX_PATH);       //将进程名转换为小写    
  24.         if (strcmp(currentProcess.szExeFile,pName)==0)          //比较是否存在此进程    
  25.         {    
  26.             CloseHandle(hProcess);                              //清除hProcess句柄    
  27.             return true;    
  28.         }    
  29.         bMore=Process32Next(hProcess,¤tProcess);          //遍历下一个    
  30.     }    
  31.   
  32.     CloseHandle(hProcess);  //清除hProcess句柄    
  33.     return false;    
  34. }    
  35.   
  36. int main()    
  37. {    
  38.   
  39.     while(1)  
  40.     {  
  41.         if (!getProcess("process1.exe"))        //如果保护进程process1不存在,则启动该进程  
  42.         {  
  43.             system("start process1.exe");  
  44.         }  
  45.         Sleep(10);                              //允许睡0.01秒,不能擅自脱离防守  
  46.     }  
  47.     system("pause");  
  48.     return 0;    
  49. }    


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

[cpp]  view plain  copy
  1. taskkill -im process1.exe  
  2. taskkill -im process2.exe  
        如果,再修改注册表,把Process1或Process2设为开机启动项,呵呵!那么任务管理器、DOS命令、关机、重启都不管用了。是不是要重装系统或者通过引导盘将这几个文件删除掉再开机呢?欢迎大家评论!
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值