API 通过HOOK OpenProcess() 实现进程防杀

在WINDOWS操作系统下,当我们无法结束或者不知道怎样结束一个程序的时候,或者是懒得去找“退出”按钮的时候,通常会按“CTRL+ALT+DEL”呼出任务管理器,找到想结束的程序,点一下“结束任务”就了事了,呵呵,虽然有点粗鲁,但大多数情况下都很有效,不是吗? 

                 
     设想一下,如果有这么一种软件,它所要做的工作就是对某个使用者在某台电脑上的活动作一定的限制,而又不能被使用者通过“结束任务”这种方式轻易地解除限制,那该怎么做?无非有这么三种方法:1.屏蔽“CTRL+ALT+DEL”这个热键的组合;2.让程序不出现在任务管理器的列表之中;3.让任务管理器无法杀掉这个任务。对于第一种方法,这样未免也太残酷了,用惯了“结束任务”这种方法的人会很不习惯的;对于第二种方法,在WINDOWS 9X下可以很轻易地使用注册服务进程的方法实现,但是对于WINDOWS   NT架构的操作系统没有这个方法了,进程很难藏身,虽然仍然可以实现隐藏,但实现机制较为复杂;对于第三种方法,实现起来比较简单,我的作品:IPGate网址过滤器 就是采用的这种方式防杀的,接下来我就来介绍这种方法。 

     任务管理器的“结束任务”实际上就是强制终止进程,它所使用的杀手锏是一个叫做TerminateProcess()的Win32 API函数,我们来看看它的定义: 

             BOOL TerminateProcess( 
               HANDLE       hProcess; // 将被结束进程的句柄 
               UINT         uExitCode; // 指定进程的退出码 
             ); 

     看到这里,是不是觉得不必往下看都知道接下来要做什么:HooK  TerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。真的是这么简单吗?先提出一个问题,如何根据hProcess判断它是否是我的进程的句柄?答案是:在我的进程当中先获得我的进程的句柄,然后通过进程间通讯机制传递给钩子函数,与hProcess进行比较不就行了?错!因为句柄是一个进程相关的值,不同进程中得到的我的进程的句柄的值在进程间进行比较是无意义的。 

     怎么办?我们来考察一下我的hProcess它是如何得到的。一个进程只有它的进程ID是独一无二的,操作系统通过进程ID来标识一个进程,当某个程序要对这个进程进行访问的话,它首先得用Openprocess 这个函数并传入要访问的进程ID来获得进程的句柄,来看看它的参数: 

             HANDLE Openprocess
             DWORD       dwDesiredAccess, // 希望获得的访问权限 
             BOOL        bInheritHandle, // 指明是否希望所获得的句柄可以继承 
             DWORD       dwProcessId // 要访问的进程ID 
             ); 

      脉络渐渐显现:在调用TerminateProcess()之前,必先调用 Openprocess ,而 Openprocess 的参数表中的dwProcessId是在系统范围内唯一确定的。得出结论:要HooK  的函数不是TerminateProcess()而是 Openprocess ,在每次调用 Openprocess 的时候,我们先检查dwProcessId是否为我的进程的ID(利用进程间通讯机制),如果是的话就简单地返回一个错误码就可以了,任务管理器拿不到我的进程的句柄,它如何结束我的进程呢? 

     至此,疑团全部揭开了。由HooK  TerminateProcess()到HooK    Openprocess 的这个过程,体现了一个逆向思维的思想。其实我当初钻进了TerminateProcess()的死胡同里半天出也不来,但最终还是蹦出了灵感的火花,注意力转移到了 Openprocess 上面,实现了进程防杀。喜悦之余,将这心得体会拿出来与大家分享。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
09年初刚到现在这家公司,头让做一个进程防杀的功能,为了保护我们的软件的服务程序,类似360或瑞星这样的安全产品都有进程防杀的功能。研究了一个多月,总结网上的各种防杀方法并参考其代码,特此将各种实现方法归纳为以下6种,并将其对应源码奉上。 源码全部经过自己修改调试,部分为原创,在vs2005下调试通过,在各种windows操作系统下测试过 1. ring3提升线程为系统线程 原理:windows在强制结束进程的时候会先结束掉所有的线程,把程序的线程改成系统线程,就可以达到防杀的目的 优点:ring3实现进程防杀,无驱动无hook,原理及代码都较为简单,能防止任务管理器杀掉进程 缺点:只能下xp下有效(与xp打的补丁也有关,有的xp系统会失败)防杀能力有限,例如不能防住IceSword等工具 该方法是参考了csdn一位朋友的做法,原文地址为 http://blog.csdn.net/KeSummer/archive/2008/05/18/2455379.aspx 2.hookApi之NtQuerySystemInformation 原理:hook NtQuerySystemInformation 来隐藏进程 优点:ring3实现进程隐藏,无驱动,能在任务管理器里隐藏进程 缺点:只能在nt2000下隐藏进程,通用性较差 3.detours库实现进程防杀 原理:和2类似,hook OpenProcess防杀进程 优点:防杀能力和通用性都较强,在nt2000,xp,2003均可防杀 缺点:hookApi是用detours库来实现的,2008下防杀失败,不能防住某些进程工具 4.hook任务管理器结束进程事件 原理:挂钩任务管理器窗口,利用CBT钩子拦截结束进程消息 优点:通用性较强,任意的windows平台均可防止任务管理器杀进程 缺点:只能针对windows任务管理起到防杀作用 5.双进程保护 原理:主进程和守护进程互相监控,发现对方不在就启动对方。为了避免父子进程关系,主进程启动临时进程,临时进程启动守护进程 优点:通用性较强,保护能力较强,可保护windows服务程序。hook防杀需要主程序和桌面交互的,而服务程序是不和桌面交互的 缺点:非真正的防杀,只是杀了又启,手段有点不入流 6.驱动级进程保护 原理:驱动级的ZwQuerySystemInformation hook,来隐藏或防杀进程 优点:防杀能力较强,在IceSword 1.2.2版本下测试通过 缺点:加载有驱动,程序实现较为复杂,驱动级hook被360等杀毒工具检测为木马 yipihaoma qq:49489047
### 回答1: 进程防杀是一种非常重要的安全措施,可以有效预防恶意代码对电脑进行攻击。使用 openprocess 可以实现进程防杀,具体操作如下。 首先,使用 openprocess 函数打开需要防止退出的进程句柄。该函数的第一个参数是进程访问权限,第二个参数是是否允许继承句柄,第三个参数是要打开的进程 ID。openprocess 函数成功打开进程后,返回进程句柄。 接下来,使用 WaitForSingleObject 函数等待进程句柄。如果进程关闭或退出,WaitForSingleObject 函数将返回一个信号。使用此函数等待进程句柄,可以使进程一直运行,即使被恶意代码试图杀死该进程也不会成功。 最后,使用 CloseHandle 函数关闭进程句柄。这是一种必要的操作,因为不使用该函数关闭句柄,会导致资源泄漏和内存泄漏问题。 综上所述,使用 openprocess 实现进程防杀是一种安全措施,可以有效预防恶意代码对电脑进行攻击。只有正确理解和应用 openprocess 函数,才能在应对恶意攻击和防护方面发挥重要作用。 ### 回答2: OpenProcessWindows API提供的一种功能,它可以打开一个进程并返回其进程句柄。在某些情况下,我们需要防止某些恶意程序或用户不正当地终止我们的进程,这时可以使用OpenProcess实现进程防杀。我们可以在进程启动的时候为它创建一个线程,不断地检测当前进程是否还存在,如果被终止,则重新启动进程。 在实现进程防杀的过程中,需要注意以下几点: 1. 获取系统进程句柄:在使用OpenProcess之前,需要获取系统进程句柄。可以使用GetCurrentProcess函数获取当前进程的句柄,也可以使用OpenProcess函数打开系统中的其他进程。 2. 获取进程ID:除了要获取进程句柄,还需要获取进程ID。可以使用GetProcessId函数获取当前进程的ID,也可以使用CreateProcess等函数创建进程时指定ID。 3. 定时检测进程状态:需要在进程启动时创建一个线程,不断地检测当前进程是否还存在。可以使用WaitForSingleObject或WaitForMultipleObjects函数等待指定句柄的状态。 4. 进程重启:如果检测到进程被终止,则可以使用CreateProcess函数重新启动进程。 需要注意的是,使用OpenProcess进行进程防杀并不能完全保证防止进程被终止,一些高级用户或程序可能会绕过这种防护措施。因此,还需要在代码中添加其他安全措施,提高进程的安全性。 ### 回答3: OpenProcess函数是Windows操作系统的API之一,用于在操作系统中打开一个已经存在的进程。这个函数可用于访问其他进程的内存、线程等资源,同时也可用于实现进程防杀。 在实际应用中,若将OpenProcess函数用于进程防杀,可对某一进程进行监控,一旦检测到有恶意程序试图关闭或终止监控的进程时,该进程将会自动重启或重建。 当然,为了更好地实现进程防杀,还需在操作系统中实现进程通信和拦截机制。在Windows操作系统中,进程间通信是通过IPC(Inter-Process Communication)机制实现的,而拦截机制是通过Hook技术实现的。 通常,我们需要在被监控的进程中添加Hook模块,用于拦截有关进程终止操作的系统调用,如TerminateProcess等。一旦Hook程序捕捉到有进程终止命令的发送,它将会取消该操作,从而确保进程的持续运行。 同时,我们还需要在监控程序和被监控程序之间实现进程通信,以便在进程终止时通知监控程序重新启动或重建进程。 综上所述,使用OpenProcess函数实现进程防杀并不是一项简单的任务,需要综合考虑多种技术和机制,同时还需要考虑系统性能和稳定性等因素。因此,在使用OpenProcess函数进行进程防杀时,需要谨慎操作,确保其正常运行并达到预期效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值