本人正在学习钩子,求一个关于HOOK的实例!

本人因为兴趣正在学习钩子,请提供以下实例的MFC工程,建立一个空的对话框工程,然后把HOOK掉别的程序调用的TerminateProcess函数,最好是只HOOK掉对这个程序的进程执行的TerminateProcess
如果不能实现后面的,实现前面的也可以啊,要全局钩子,主要是为了HOOK掉优化大师,360之类的能结束进程的程序,不要用DLL啊,不会,希望大家把代码给我
好复杂啊,原来钩子这么复杂,哎,我还是先学消息钩子吧

很抱歉,API Hook不等同于消息Hook,虽然都叫Hook,但有着本质的区别,也就没所谓全局和局部之分了。消息Hook是Windows提供给应用程序的一个正常的应用,而API,则是“利用”Windows的特性来达到的目的。
要Hook目标进程一个API,无非两种方法:利用PE文件的结构,把目标进程的每个可执行模块(包括exe和dll)中的导入表部分修改,把目标API的地址修改为你自己写的函数。这种方法以《Windows核心编程》的第22章介绍的挂接API的方法最为经典。
上种方法有个很大的弊端,就是如果目标进程已经在你的程序运行之前运行了,并且已经使用GetProcAddress得到了目标API的地址,这种方法就无用了,因为往后目标进程极有可能不会再去通过导入表来得到API的地址了。前段时间我做IE的socket的钩子,用到了另一种方法:
这种方法的前身是,把目标API的前5个字节修改为一个jmp跳转指令,直接跳到你的API里,接着你再把这5个字节写回去,然后再次用同样的参数去调用目标API,目标API返回之后再把那5个字节再回去(有点像缺页中断的处理过程)。这样在你就能拦截所有的对目标API的调用了。但是,这种方法的最大的缺点就是,对多线程来说效果不好。于是我就引出了另一种方法:当对目标API的调用导致的跳转到我的代码中后,不把那5个字节写回去,而是在你的API中,用汇编实现那5个字节原来的功能,之后直接跳转到目标API的第6个字节去运行,这样你的API就永远不会被漏掉了,而且只要你注意寄存器的保存与恢复,以及栈的平衡,这种方法就会很稳定。当然,这种方法会限于API版本的限制,不同的版本,开始的5个字节可能不一样,你就要分别对待了。

说了这么多废话,其中最核心的一点就是,把自己的代码注入到目标进程中,最简单的方法还是用Dll。当然,不用Dll的方法也有,比如罗云彬《Windows环境下32位汇编语言程序设计》中提到的那样,用汇编写——比Dll更麻烦。

以上言论的版权由真诚到永远所有
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-06-28
你去查一些Hook SSDT的资料吧,不过要编写驱动,比较麻烦。
相似回答