当前位置:C++技术网 > 资讯 > 怎样保护 程序不被删除

怎样保护 程序不被删除

更新时间:2016-08-06 19:20:00浏览次数:1+次

如何使用hook 技术 保护程序所在的文件夹不被删除?

思路是怎样的?


C++技术网解答:

    这个问题涉及的技术属于偏底层的技术。所以,要想真心学会,要花点功夫的。

    先跟你讲讲基本原理。涉及到文件夹操作,属于文件IO的API函数类别。这里用到的Hook技术是API Hook。API Hook也就是拦截API函数的,与消息Hook不一样。消息Hook是拦截窗口消息的。但是工作机制都很想,都是拦截。

    不管是窗口消息,还是文件操作,都可以设置Hook。Hook分很多种的,但是基本原理都差不多。设置了Hook之后,系统会在发生你Hook的东西时先执行你的代码,然后进行Hook链传递,让所有Hook都可以执行。

    Hook主要问题就是跨进程操作。自己程序中设置的Hook,可以容易的实现,因为本身就在一个进程内,所以是可以直接利用的。然而如果你要Hook其他程序进程的东西,你得先让你的代码进到其他进程的内存空间中,这就是所谓的注入dll。

    当然,你设置好Hook后,系统会在合适的时候,将你的dll注入到目标进程中,这样你的代码开始工作。你的代码拦截对应的消息或者API函数,让你自己对应的函数先执行,然后再决定要不要执行原本的函数或者消息。所以,你的dll在目标进程中,要先获得要拦击的消息或者函数地址,然后执行自己的处理,然后再在你的代码中调用原有的API函数,实现监测API,但是不破坏原有API函数的执行流程。

    不过,你要的是,保护自己的程序所在的文件夹不被删除。在系统中,所有程序最终都是调用系统API函数来执行功能的,所以要防止文件夹被删除,只要拦截文件夹操作函数即可。拦截之后,直接返回,不让真正的删除文件夹的API函数被执行即可。

    当然,你需要让所有程序执行时都无法删除你的文件夹,所以,你要将API Hook代码放在Dll中,然后设置好Hook,系统执行Hook的内容时,会将你的Dll注入目标进程。目标进程只要想删除你的文件夹,就要调用删除文件夹的API函数,你拦截到这个函数后,检查参数,如果被删除的文件夹是你要保护的文件夹,则直接返回完成,这样真正的删除文件夹并没有执行,所以达到了阻止删除文件夹的目的。如果不是你要保护的文件夹,你要调用原始的API,保证其他文件夹正常被删除,否则会影响正常使用。

    不过,API Hook拦截并不是最好的。删除文件、在文件写入时加密,在文件读出来的时候解密,防止文件被修改,等等,这些最好是用文件过滤驱动。

    文件系统过滤驱动是一种自选驱动,使用它可以给别的驱动特别是文件系统增加功能或者是修改别的驱动的行为。文件系统过滤驱动是一种内核组件,它作为Windows NT系统的一部分来运行。
     一个文件系统过滤驱动可以过滤对文件系统或文件系统volume的I/O操作,过滤 可以是记录、监测 甚至 阻止,具体的行为是由驱动的种类决定的。文件系统过滤驱动的典型应用包括防病毒软件、加密程序和分级存储管理系统。

    但是文件过滤驱动更加复杂,但是功能却很强大。看你的需要了。

    对于API Hook的理解,可以参考阅读:百度百科API Hook

    API Hook自己进程的API函数的讲解文章,请参考:HOOK API入门之Hook自己程序的MessageBoxW

    API Hook系统其它进程的API函数的讲解文章,请参考:HOOK所有程序的MessageBox

    文件过滤驱动开发,请参考:文件过滤驱动开发