http://blog.csdn.net/lynch0571/article/details/32965169
通常情况下编写一个程序,可以点击关闭按钮正常结束程序,也可以使用任务管理器结束任务,还可以使用taskkill等命令杀死进程,实在都不行也可以直接重启计算机。
但是,这些方法真的都管用吗?我觉得不一定,今天晚上闲着没事,想写一个杀不死的程序。设计思路如为写三个程序ProcessMain、Process1和Process2,相互保护,具体如下:
- 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];
- 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()调用失败!\n");
- return false;
- }
-
- bool bMore=Process32First(hProcess,¤tProcess);
- while(bMore)
- {
- CharLowerBuff(currentProcess.szExeFile,MAX_PATH);
- if (strcmp(currentProcess.szExeFile,pName)==0)
- {
- CloseHandle(hProcess);
- return true;
- }
- bMore=Process32Next(hProcess,¤tProcess);
- }
-
- CloseHandle(hProcess);
- return false;
- }
-
- int main()
- {
-
- while(1)
- {
- if (!getProcess("calc.exe"))
- {
- system("start calc.exe");
- }
- if (!getProcess("process2.exe"))
- {
- 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];
- 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()调用失败!\n");
- return false;
- }
-
- bool bMore=Process32First(hProcess,¤tProcess);
- while(bMore)
- {
- CharLowerBuff(currentProcess.szExeFile,MAX_PATH);
- if (strcmp(currentProcess.szExeFile,pName)==0)
- {
- CloseHandle(hProcess);
- return true;
- }
- bMore=Process32Next(hProcess,¤tProcess);
- }
-
- CloseHandle(hProcess);
- return false;
- }
-
- int main()
- {
-
- while(1)
- {
- if (!getProcess("process1.exe"))
- {
- system("start process1.exe");
- }
- Sleep(10);
- }
- system("pause");
- return 0;
- }
以上代码可以保证用户在不关机、不注销和不重启的情况下杀不掉进程,甚至通过快速的批处理命令也无可奈何:
- taskkill -im process1.exe
- taskkill -im process2.exe
如果,再修改注册表,把Process1或Process2设为开机启动项,呵呵!那么任务管理器、DOS命令、关机、重启都不管用了。是不是要重装系统或者通过引导盘将这几个文件删除掉再开机呢?欢迎大家评论!