C#阻止“任务管理器”结束进程 我在“Windows任务管理器”里点击“结束进程”,想用C#实现不能结束的目的;就像点击“WINLOGIN.EXE”--“结束进程”,系统会提示“该进程为关键系统进程,任务管理器无法结束进程”;请问用C#应该怎么是想呢?拜谢!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 buller:声明一下啊,我不是想实现什么坏目的,仅仅是为了开发一个小监控程序 这个很简单啊——挂钩API任务管理器结束进程是通过调用API:TerminateProcess实现的你只需要挂钩对这个API的调用就可以了我现在放假回家,没有编程工具,你到网上查一下挂钩API就行了基本上有两个方法,其一是修改导入表,其二是修改函数的前5个字节,让其跳转到自定义的函数 是组织任务管理器运行还是组织任务管理器结束指定进程?前者可以建立个新线程,每隔一定时间来获取系统当前是否有taskmgr,如果有就结束后者:一般常用的保护方法有几种: 1,设置进程属性为隐藏。这种只能骗一般的人; 2,API钩子勾住任务管理器里的TermiteProcess进程; 3,API全局钩子够上面的那个进程,这样就不怕它用任务管理器之外的工具杀你了; 4,勾住SSDT的函数,如果用卡巴,就有点麻烦,因为它也是用这招,就看谁先取得了。 5,写中断门; 6,写内核态驱动…… …… 以上方法,从上往下,一个比一个有效。如果你到了第四层,杀毒软件也未必能干掉你的进程(1-6以上转自博客园) 回复CsToD,shiweifu:首先谢谢两位的回答,我觉定用挂钩API来实现,可是不知到怎么实现,网上搜不到用C#实现的,希望能得到你们的帮助,谢谢!! 好像是在winpro这个方法里实现 挂钩API用C#怎么实现啊,网上很多资料都是C++/VB的急死了,请高手帮忙啊!!!! [DllImport("kernel32.dll", SetLastError=true)] static extern int TerminateProcess ( int hProcess, int uExitCode) qlzf11140820 :能不能在贴一些代码出来,我没有编过API的代码,对这个很陌生、、、、谢谢了!!! 还有,楼主连API都不懂,就更别想去做挂钩API这么难的动作了,我现在上网不方便,3月份的时候给你写一下(如果你等得及) CsToD:就是不懂才学的,不懂不代表没有判断能力,希望你不要打消别人的积极性;或许你很厉害,但不代表你就有权利这样说别人!不管别人回答的正确与否,但能够回答就能给人希望!! 在GOOGLE上面搜索 hook Terminateprocess 一大堆资料...楼主只需要静下心来仔细理解一下代码,很容易用C#实现的. http://blog.csdn.net/panpanloveruth/archive/2007/06/20/1659236.aspx 非常感谢hyblusea,我仔细学习研究一下。很敬佩你这样的人呵呵!! 不是吧,MVP也在乱讲?需要用的是“挂钩API”的技术,跟安装钩子没关系钩子是用于拦截消息的,挂钩API是拦截对API的调用的,两者天壤之别。 CsToD:拦截API调用不是拦截消息的一种吗?我查了很多资料都是用钩子啊。而且钩子有很多类型,有些用C++完成此功能的代码也安装了钩子。 拦截API调用不是拦截消息的一种吗?......还是那句话——勿在浮云筑高台从基础做起 1. ring3下 一般情况,挂一个全局钩子是为了将拦截API的DLL注入到触发进程中去,这一步不是必须的。将DLL注入到目标进程的任何方法都可以用来实现API拦截,而不一定需要HOOK,这个概念不要混淆了.2. 拦截API一般需要一个 win32 dll用来处理拦截过程(当然也不是必须的)C# 托管模式下你可以做挂钩 或者其他类型的注入,但是没法做这个WIN32 DLL 3.楼主可以再看看相关的概念,有问题大家来讨论 我自己先顶一下,API确实不简单,需要时间来学习啊呵呵 LZ,API需要时间来慢慢的积累。CSToD的话也许有点过,但是他的想法是对的,LZ,HOOK方面的东西需要积累到了一定的层次以后再去弄的。我的建议,先巩固基础,然后看看MSDN,当你的积累到了一定的程度,就会发现原来这些东西都其实是很简单明了的。另外对于hook我之前也有看过,不过是很久之前,现在没看过了,抽空把hook看了。其实你要挂接API的话,使用hook可以实现,具体选择的hook类型,不记得了 我现在用FindWindow函数查看Windows任务管理器是否打开,用FindWindow(lpClassName,"Windows任务管理器"),请问这里的lpClassName应该是什么?我用FindWindow(null,"Windows任务管理器")不行 还是自己顶一下吧,上边那个问题已经解决了,用FindWindow(null,"Windows 任务管理器") 呵呵,写成"Windows服务"吧.这种要求的,一般都是做成服务程序的. 程序运行时屏蔽任务管理器就行了/////屏蔽任务管理器/// private void LockScreen_Load(object sender, EventArgs e) { try { RegistryKey r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true); r.SetValue("DisableTaskMgr", "1"); //屏蔽任务管理器 } catch { RegistryKey r = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"); r.SetValue("DisableTaskMgr", "0"); } }/////恢复任务管理器/// private void LockScreen_FormClosing(object sender, FormClosingEventArgs e) { RegistryKey r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true); r.DeleteValue("DisableTaskMgr");//恢复任务管理器 } 不知道能不能真的阻止,不过你可以模似一个假象,弹出任务管理器时结束进程都有一个确认对话框,你把该对话替换掉,就是不让用户去点,自己默认为否,然后自己自定义弹出一个框出来既然你都已经用FindWindow查找到了任务管理器的句柄,再用:msg=FindWindow("#32770", "任务管理器警告")来获取消息框的句柄,如果返回值不等0的时候说明显示了消息框,然后FindWindowEx(msg, FindWindowEx(hMsg, 0, "Static", ""), "Static", vbNullString)获得原来消息提示的句柄,GetWindowText 获取消息句柄返回的文本,SendMessage来发送一个消息,关闭原来的消息框 ,这时弹出一个自己的对话框出来 全局钩子,需要使用C++或者能够编译出本地代码的语言(如delphi)来写dll,至于加载则什么语言都可以。网上很多代码,推荐使用MS的Detours来写,编写方便。另外SSDT Hook实现起来也比较简单,不过大多数杀软也有使用。 写流氓软件还是别用.net了,.net根本不适合做这种工作,纯虚拟机里运行的代码根本没办法对宿主操作系统运行时进行须改。 看来你们都没写过windows服务程序.. 把你的进程写成系统进程就可以,写成Server进程就可以。我用VB做过。不能结束 to cstoD:三月份快过去了,你说给我写一下程序,写好了吗?对于你来说可能很简单,对我来说太难了,先谢谢了 正如5楼的方法挂钩API,首先要注入一个dll,这个dll必须用C++写所以完全用c#基本是无法实现的我原来只注意到是要阻止结束进程,没注意要用C#写,抱歉 C#用ThoughtWorks.QRCode.dll不能解析全是中文的 c#代码如何控制打开一个文件? combobox设置为只读型后??? 在项目中定义枚举 gdi+问题 YetAnotherForum 怎么安装呀? 在 C# 中共享“接口实现”的唯一方法是使用静态方法 请问如何跳到页面上设置的书签处? 请问:用udp怎么发送广播 dos下的问题 如何让datetimepicker只能选择年份和月份 怎么得到启动过的服务器对象
任务管理器结束进程是通过调用API:TerminateProcess实现的
你只需要挂钩对这个API的调用就可以了
我现在放假回家,没有编程工具,你到网上查一下挂钩API就行了
基本上有两个方法,其一是修改导入表,其二是修改函数的前5个字节,让其跳转到自定义的函数
还是组织任务管理器结束指定进程?前者可以建立个新线程,每隔一定时间来获取系统当前是否有taskmgr,如果有就结束后者:
一般常用的保护方法有几种:
1,设置进程属性为隐藏。这种只能骗一般的人;
2,API钩子勾住任务管理器里的TermiteProcess进程;
3,API全局钩子够上面的那个进程,这样就不怕它用任务管理器之外的工具杀你了;
4,勾住SSDT的函数,如果用卡巴,就有点麻烦,因为它也是用这招,就看谁先取得了。
5,写中断门;
6,写内核态驱动……
…… 以上方法,从上往下,一个比一个有效。如果你到了第四层,杀毒软件也未必能干掉你的进程(1-6以上转自博客园)
谢谢了!!!
或许你很厉害,但不代表你就有权利这样说别人!
不管别人回答的正确与否,但能够回答就能给人希望!!
很敬佩你这样的人呵呵!!
不是吧,MVP也在乱讲?需要用的是“挂钩API”的技术,跟安装钩子没关系
钩子是用于拦截消息的,挂钩API是拦截对API的调用的,两者天壤之别。
......
还是那句话——勿在浮云筑高台从基础做起
这里的lpClassName应该是什么?我用FindWindow(null,"Windows任务管理器")不行
//屏蔽任务管理器
///
private void LockScreen_Load(object sender, EventArgs e)
{
try
{
RegistryKey r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true);
r.SetValue("DisableTaskMgr", "1"); //屏蔽任务管理器
}
catch
{
RegistryKey r = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System");
r.SetValue("DisableTaskMgr", "0");
}
}
///
//恢复任务管理器
///
private void LockScreen_FormClosing(object sender, FormClosingEventArgs e)
{
RegistryKey r = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", true);
r.DeleteValue("DisableTaskMgr");//恢复任务管理器
}
既然你都已经用FindWindow查找到了任务管理器的句柄,再用:msg=FindWindow("#32770", "任务管理器警告")来获取消息框的句柄,如果返回值不等0的时候说明显示了消息框,然后FindWindowEx(msg, FindWindowEx(hMsg, 0, "Static", ""), "Static", vbNullString)获得原来消息提示的句柄,GetWindowText 获取消息句柄返回的文本,SendMessage来发送一个消息,关闭原来的消息框 ,这时弹出一个自己的对话框出来
另外SSDT Hook实现起来也比较简单,不过大多数杀软也有使用。
挂钩API,首先要注入一个dll,这个dll必须用C++写
所以完全用c#基本是无法实现的
我原来只注意到是要阻止结束进程,没注意要用C#写,抱歉