通常情况下编写一个程序,能够点击关闭button正常结束程序,也能够使用任务管理器结束任务,还能够使用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]; //和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\C++各路高手以及操作系统专家请进来杀死这个进程的更多相关文章

  1. linux fork进程请谨慎多个进程/线程共享一个 socket连接,会出现多个进程响应串联的情况。

    昨天组内同学在使用php父子进程模式的时候遇到了一个比较诡异的问题 简单说来就是:因为fork,父子进程共享了一个redis连接.然后父子进程在发送了各自的redis请求分别获取到了对方的响应体. 复 ...

  2. 数据库高手(DBA专家 ,SSIS,replacation ,tourble shooting)

    http://www.cnblogs.com/qanholas/category/266780.html 随笔分类 - mssql SQL Server 2008 Datetime Cast 成 Da ...

  3. 一道看似简单的sql需求却难倒各路高手 - 你也来挑战下吗?

    转自:http://www.cnblogs.com/keguangqiang/p/4535046.html 听说这题难住大批高手,你也来试下吧.ps:博问里的博友提出的. 原始数据 select *  ...

  4. ucore操作系统学习(五) ucore lab5用户进程管理

    1. ucore lab5介绍 ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度.通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行. 在lab5中需要更进一步 ...

  5. 阿里巴巴-OS事业群-OS手机事业部-系统服务部门招聘Java开发工程师,有意者请进来

    我是阿里巴巴-OS事业群-OS手机事业部-系统服务部的开发工程师,正在招聘Java开发工程师. 以下是职位描述: 岗位名称:Java开发工程师 招聘人数:5人 生效日期:2014-03-12 结束日期 ...

  6. 如果你最近在考虑OCR的问题,请进来~~~

    本文主要是python方面各类ocr的api对比问题,至于app推荐几款:合合信息(扫面全能王),TextGrabber,白描等等等等 工作需要,搞文字识别技术,对比了几家 百度的OCR: #!/us ...

  7. 《操作系统导论》第5章 | 进程API

    本章主要讨论UNIX系统中的进程创建.UNIX系统采用了一种非常有趣的创建新进程的方式,即通过一对系统调用:fork()和exec().进程还可以通过第三个系统调用wait(),来等待其创建的子进程执 ...

  8. 说说我在项目中为什么不用实体框架,如果说我在诋毁你所爱的EF,请进来.

    1.坑多. 这一点没有人会否定.当然你可以说你很牛,但事实不会因为你牛就可以说不存在.从博客园中的博问中大家关于EF的提问量就问题的怪异程度就可以看出来. 1.Entity Framework 查询历 ...

  9. 操作系统开发系列—13.e.三进程

    我们再来添加一个任务,首先添加一个进程体: void TestC() { int i = 0x2000; while(1){ disp_str("C"); disp_int(i++ ...

随机推荐

  1. JavaScript中构造函数

    构造函数:函数的另一种执行方法,执行后创建对象,并创建原型对象. 原型链:对象访问构造函数的指针. Function函数:函数对象. Object函数:所有创建对象的祖辈对象,也是由Function对 ...

  2. Kubernetes Ingress实战

    本节内容: 服务发现与负载均衡 Ingress实战 一.服务发现与负载均衡 在前面的安装部署kubernetes集群中已经简单用示例来演示了Pod和Service,Kubernetes通过Servic ...

  3. 一步一步学习IdentityServer4 (7) IdentityServer4成功配置全部配置

    auth.liyouming.com 全部配 public class Startup { public Startup(IConfiguration configuration) { Configu ...

  4. input文本框 输入限制三则

    其一,只允许输入数字和小数点. <input onKeypress="return (/[\d.]/.test(String.fromCharCode(event.keyCode))) ...

  5. C语言:奇偶归一猜想

    1.奇偶归一猜想——求多少步归一.(10分) 题目内容: 奇偶归一猜想——对于每一个正整数,如果它是奇数,则对它乘3再加1,如果它是偶数,则对它除以2,如此循环,最终都能够得到1. 如n = 11,得 ...

  6. 【LOJ】 #2033. 「SDOI2016」生成魔咒

    题解 就是字符集较大需要离散化和建边表的后缀自动机水题 每次会加入i个新的串,其中重复的就是i的父亲节点所在节点的长度,减掉即可 代码 #include <iostream> #inclu ...

  7. windows7无声音,提示未插入扬声器或耳机的解决

    windows7无声音,提示未插入扬声器或耳机的解决: http://jingyan.baidu.com/article/358570f6043a85ce4624fc47.html

  8. linux kernel.shmall shemax shemin解释

        Linux X86-64操作系统,Oracle 10g数据库,由8G加到16G,把kernel.shmmax参数改到17179869184(16G)后,发现只要修改sga_max_size和s ...

  9. Mysql Window 下安装

    http://blog.csdn.net/u013235478/article/details/50623693

  10. git 设置bitbucket 邮箱、用户

    1. git config --global user.name "youname" 2 .git config --global user.email "youeami ...