闲来无事,英语又学的太痛苦。看到我妈妈电脑开起在,就坐上去看看新闻,听听音乐。哎,突然间,老毛病又烦了,想起原来一直有个编程的问题没有解决——禁止别人用任务管理器,结束自己的程序进程(.NET程序)。带着这个问题,我开始Google,开始baidu,又开始编程了。和原来的搜索结果一样,什么东西都是一筹莫展,得到的答案永远是:C#没有办法自己去禁止别人用任务管理器结束自己进程。不过功夫不负有心人。我还是找到一大堆的替代方法,可以让别人不结束自己进程的方法。

总结方法有:

1.      把任务管理器程序给别人删除了,不让别人打开(妈呀,这个我觉得最不可取了,有点杀鸡取卵的味道,没有任务管理器,我是无法忍受的。毕竟人家用户,购买了你产品,你总不可能把别人任务管理器给洗白了吧?)否决!

2.      接下来这个比较温柔,通过C#内置的Process类,对任务管理器的进程进行扫描,如果检查到有taskmgr.exe的进程(任务管理器进程),就把这个进程结束了。(虽然没有第一个来的恶劣,但是,用户还是不能使用任务管理器)否决!

3.      写两个程序进行双保护。这个想法是网上提的最多的思路,如果一个程序被结束了,另一个程序检测到这个程序不在了,就立即重新启动该程序,双双保护,互助互利(结果我尝试了一下,不可取,因为1,CPU使用率太高,一直在循环检测,计算机速度立即就下了。我妈妈这个机子,P4的配置,1G内存,也来不起了。网页也卡起了。2,我写了一个第三方程序,以最快速率去结束这个两个进程,如果这两个进程为了节约CPU的使用率,而把扫描间隔时间隔的太开的话,立刻被我的程序洗白。所以,理论上这种方法,肯定是会被洗白的)否决

4.      技术含量比较高了,通过Windows的驱动机制,把自己给隐藏了(把自己变成驱动),然后隐藏到系统中运行,在任务管理器完全找不到,其实我多喜欢这种方式的,但是,这个程序一弄出来,瑞星,Google,Hotmail,360卫士,全部当成病毒查出来了,我当时眼流花都要流出来了。他们都太不给面子,Google,Hotmail直接把我的附件删除了。随便我压缩,分包压缩,都逃不过他们的法眼。所以,我清楚的意识到,这种程序弄出来,在客户机器上,肯定是无法长久生存的。毕竟一个堂堂正正的程序,干嘛要去隐藏呢?所以。该条方案否决!

5.      用第三方的VC++程序,辅助C#程序达到不让别人禁止C#进程的方法。哎,弄了半天,这种方法,我认为最行之有效。毕竟不得不承认,要搞Windows系统级的程序设计,C++是当之无愧的龙头老大,C#只是一个做网站级应用的能手。不过,你发布一个程序给用户,用户看到那个任务管理器里面还有个其他程序在运作或者是看到你的安装包里面怎么还有其他程序名字,确实感觉太不专业,太不地道了。话又说回来,这种辅助程序一般都要收费。我下载的那个就要收费。所以,最后,这个方案也否决了!

难道,C#真的就不能自己弄个什么名堂的东西出来,不被任务管理器结束吗?实际,我认为,C#是可以做到这一点的。原因有2个。1,C#是支持带*号这种指针的方式的。也就是说,C#可以使用指针。2,C#可以完全无障碍的调用Windows自己的API函数(虽然性能没有VC++开发的好),调用第三方开发的COM组件,甚至调用USB插口接口相关信息(曾今做U盘杀毒的时候,用到过,不过主要还是结合API完成的,一个未公开的API函数R开头的忘记了)。所以,为此,我抱着信心开始准备找第三方提供的动态链接库之类的东西,毕竟要自己写,C#还是有许多性能和调用方面的麻烦问题要考虑,毕竟不是毕业设计,所以,能简单就简单,只要克服以上提到的5种方法的不足。

最后,功夫不负有心人,找了大半天,找到了一个叫Peter的牛人,写了一个通过VC++程序调用VC++动态链接库,实现的VC++程序不被任务管理器结束的源代码。幸亏源代码相当详尽(VC++动态链接库的源码,VC++应用程序源码),要不然,后面的活路,就没有办法做了。于是我开始,慢慢,慢慢走上辛苦的VC++代码分析上。你们可能要问我干什么?我可以很坦然的告诉你,虽然我VC++能力确实不强,但是我要把VC++的代码,移植到C#上。听起来,很不可思意,但是,我真的成功了。最后,为了报答我的学校——成都电子机械高等专科学校和成都信息工程学院。我把VC++应用程序调用代码,移植到.NET上,并且,为了调用方便,我做成了.NET可以识别的dll运行库。只要按以下方式调用运行即可。这个dll运行库可以保护自己进程,也可以通过设置保护其他进程,作为第三方动态链接库存在。(很幸运,虽然这个第三方动态链接库我还是很花了些时间,但是绝对不收费,免费放送,提供C#工程源码下载!如果大家有兴趣也可以一起讨论一下,我的邮件是Email:k.liuxu@gmail.com),至于那个牛人的设计思路,其实,就是用系统函数挂钩,挂接了所有的系统函数消息。没有直接分析任务管理器这些东西。不过,在CMD命令控制台中,无法接受消息,所以,用命令控制台,是可以结束进程的。不过,命令控制台,一般用户不会使用,可以直接把命令控制台删除,或者移植到程序内部调用,不准用户外部调用,就行了。至于其他更麻烦的东西,就有兴趣大家在慢慢聊吧。

前面分析VC++代码是一个艰苦的历程,简直是挥泪分析啊,眼睛都看肿了,才把VC++应用程序部分移植出来。其实总结了一下,实际上还是因为自己学习不扎实,所以才看的恼火,对不起电子高专培养我的刘光会和杨勇老师,对不起信息工程学院的安俊秀和陈晓红老师。不过最后弄出来了,还是一件好事情吧,也充分说明了C#还是可以搞一些基于系统级的调用和编程的。也许在大鸟眼睛中,移植这种工作并不算什么,这种程序也许是小儿科,不过,对于,刚刚毕业的我来说,还是一种不小的挑战。

由于时间有限,我只把前半部分的VC++应用程序端移植完成,在以后的时间中,等我把Dll部分抽象出来,我会做成.NET可以识别的dll发布出来。如果还有时间,我就再来说说,我怎么分析的吧。不过这个可能要说很久很久了,毕竟涵盖了5年我大学学习的所有基础知识,大到系统,小到函数指针,代理,枚举这些结构,内存存储空间等等。好了废话不多说了。现在主要看看怎么使用。

首先,我们必须具备两个DLL文件,一个是我用.NET程序生成的KProtectProcess.dll文件,这个文件可以直接放到VS.NET开发环境中进行使用。还有一个是我还没有编译出来的NKCore.dll文件(其实我移植了一半,但是里面设计很多系统关键字,我在C#中还没有找到很好的解决方案,所以正在研究),这个文件是C++的运行库,实际上核心也是这个文件。

1首先我们新建立一个工程。如下:

2.按照如图,放置这些控件,以便我们操作

3.添加引用.NET可以识别的KProtectProcess.dll动态链接库(VB.NET,J#.NET,VC++.NET都可以调用)右键项目,选择添加引用:

4.找到KProtectProcess.dll这个文件并添加(注意保持,KProtectProcess.dll文件和NKCore.dll文件在同一目录中)

5.点确定以后,你会看到工程中,多了一个程序集KProtectProcess.dll

6.双击,按钮进入代码的编写,(其中保护自己,停止保护自己,保护其他进程,停止保护其他进程按钮的名字分别是:button1,button2,button3,button4),具体调用代码编写如下(代码调用,已经简化的相当简单了):自身保护调用SelfProtection(),自身释放调用UnLoadProtection(),其他进程保护,首先调用ProtectProcessID赋值,然后调用ProtectProcess进行保护,如果不赋值,我会抛出一个异常。

7.       所有工作都准备完毕就可以调试了。其中以下演示怎么保护其他进程。比如我们现在打开Windows计算器这个程序,计算器这个程序的进程名是calc.exe,所以,我们就找他的进程号PID.1764

现在只需要在程序的进程号中输入,1764,然后点保护,最后,你看用任务管理器是不是不能结束calc这个程序了?很简单吧?

结束语:

(1).NET程序原代码下载地址为(大小47KB):TestClose.rar

(2)两个动态连接库文件(大小14KB):Dll.rar

(3).NET可识别的Dll我移植出来的.cs文件(7KB):KProcess.rar

(4)VC++原始代码文件(大小10KB):vc.rar

C# 保护进程不被结束(源代码)防任务管理器结束进程的更多相关文章

  1. Android应用程序进程启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创 ...

  2. selenium高级应用 - 结束Windows中浏览器的进程

    结束Windows中浏览器的进程 #-*- coding:utf-8 #结束Windows中浏览器的进程 from selenium import webdriver import unittest ...

  3. 创建进程,join方法,进程对象相关属性和方法,僵尸进程和孤儿进程,守护进程,互斥锁

    创建进程 在python中提供了一个multiprocessing模块可以帮助我们使用多进程解决问题.在multiprocessing 模块中有一个类Process. from multiproces ...

  4. linux进程通信之使用匿名管道进行父子进程通信

    管道:是指用于连接一个读进程和一个写进程,以实现它们之间通信的共享文件,又称pipe文件. 管道是单向的.先进先出的.无结构的.固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起 ...

  5. Linux进程核心调度器之主调度器schedule--Linux进程的管理与调度(十九)

    主调度器 在内核中的许多地方, 如果要将CPU分配给与当前活动进程不同的另一个进程, 都会直接调用主调度器函数schedule, 从系统调用返回后, 内核也会检查当前进程是否设置了重调度标志TLF_N ...

  6. 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池

    一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...

  7. 1.2 Linux中的进程 --- fork、vfork、exec函数族、进程退出方式、守护进程等分析

    fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfo ...

  8. Linux 进程资源用量监控和按用户设置进程限制

    每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方 ...

  9. 一般来说,主方法main()结束的时候线程结束

    suspend()是将一个运行时状态进入阻塞状态(注意不释放锁标记).恢复状态的时候用resume().Stop()指释放全部. 这几个方法上都有Deprecated标志,说明这个方法不推荐使用. 一 ...

随机推荐

  1. SQL单行函数和多行函数

    单行函数和多行函数示意图: 单行函数分为五种类型:字符函数.数值函数.日期函数.转换函数.通用函数 单行函数: --大小写控制函数 select lower('Hello World') 转小写, u ...

  2. R的几个基础函数

    本章目录: 1.路径和文件 2.数据转换 3.获得帮助 路径和文件: 1.工作路径: 显示当前路径:getwd() 设置路径:setwd(“绝对路径”) 2.目录: 创建目录:dir.create(& ...

  3. 【转载】poj 1276 Cash Machine 【凑钱数的问题】【枚举思路 或者 多重背包解决】

    转载地址:http://m.blog.csdn.net/blog/u010489766/9229011 题目链接:http://poj.org/problem?id=1276 题意:机器里面共有n种面 ...

  4. Spring中为什么实体类不用注入

    要理解为什么不用注入,首先就清楚注入的目的是什么?如果不注入,在程序中要使用某个类对象的方法,则需要去new一个对象.然后我们调用其中的方法,众所周知"程序=算法+数据".不失一般 ...

  5. eclipse修改端口启动多个tomcat

    参考:https://blog.csdn.net/zl544434558/article/details/47857343 在一个eclipse启动多个tomcat,修改tomcat的端口是不可以的, ...

  6. Apache Phoenix基本操作-1

    本篇我们将介绍phoenix的一些基本操作. 1. 如何使用Phoenix输出Hello World? 1.1 使用sqlline终端命令 sqlline.py SZB-L0023780:2181:/ ...

  7. BZOJ3669 [Noi2014]魔法森林(SPFA+动态加边)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. javaScript中的DOM补充

    一.DOM树 二.DOM节点 DOM 是这样规定的:    整个文档是一个文档节点     每个 HTML 标签是一个元素节点     包含在 HTML 元素中的文本是文本节点     每一个 HTM ...

  9. 0.00-050613_head.s

    # head.s contains the -bit startup code. # Two L3 task multitasking. The code of tasks are in kernel ...

  10. JNI_Z

    1. ZC: 用到 VC6 ... http://blog.csdn.net/jiangwei0910410003/article/details/17465085 http://blog.csdn. ...