C\C++各路高手以及操作系统专家请进来杀死这个进程
2015-12-28 10:57
661 查看
通常情况下编写一个程序,能够点击关闭button正常结束程序,也能够使用任务管理器结束任务,还能够使用taskkill等命令杀死进程,实在都不行也能够直接重新启动计算机。
可是,这些方法真的都管用吗?我认为不一定。今天晚上闲着没事,想写一个杀不死的程序。设计思路如为写三个程序ProcessMain、Process1和Process2,相互保护,详细例如以下:
1、依照平时的方法写一个程序ProcessMain实现你的功能;
2、再写一个程序Process1保护ProcessMain和Process2都不被杀掉;
3、再写一个程序Process2保护Process1不被杀掉。
画个草图,有助理解:
以上是该程序的主要思想,详细代码例如以下:
(为了简化程序。将ProcessMain设置为Windows自带的计算器“calc.exe”)
Process1:
Process2:
以上代码能够保证用户在不关机、不注销和不重新启动的情况下杀不掉进程。甚至通过高速的批处理命令也无可奈何:
可是,这些方法真的都管用吗?我认为不一定。今天晚上闲着没事,想写一个杀不死的程序。设计思路如为写三个程序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]; //和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()调用失败!\n"); 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()调用失败!\n"); 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命令、关机、重新启动都无论用了。是不是要重装系统或者通过引导盘将这几个文件删除掉再开机呢?欢迎大家评论!
相关文章推荐
- 课程设计——c++中读取txt文件
- C++ STL priority_queue
- C语言---类型转换
- GC基本算法及C++GC机制
- vs2008中C++项目编译过程中越来越慢
- const——c与c++不同
- C语言字符串操作总结大全
- 【C++】动态开辟二维数组
- 【C++】斐波那契数列前N项的和递归与非递归算法
- C/C++——C和C++怎样分配和释放内存,区别是什么?
- 图的最短路径问题————树上奶牛(tree.cpp)
- c++标准库 及 命名空间std
- C语言创始人
- c++异常处理
- 【c语言】模拟库函数strstr
- c++变量的存储区域
- C语言数组内存初始化
- 《C语言及程序设计》第22讲实践项目
- C++ iterator 前++ 后++ 效率区别
- c++字符集之间转换(UTF-8,UNICODE,Gb2312)