HOOK的实例

来源:互联网 发布:图片透视软件 编辑:程序博客网 时间:2024/04/30 23:37

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

2008-06-27 17:42249524324 | 分类:VC++ | 浏览1546次
本人因为兴趣正在学习钩子,请提供以下实例的MFC工程,建立一个空的对话框工程,然后把HOOK掉别的程序调用的TerminateProcess函数,最好是只HOOK掉对这个程序的进程执行的TerminateProcess  如果不能实现后面的,实现前面的也可以啊,要全局钩子,主要是为了HOOK掉优化大师,360之类的能结束进程的程序,不要用DLL啊,不会,希望大家把代码给我
好复杂啊,原来钩子这么复杂,哎,我还是先学消息钩子吧
我有更好的答案
提问者采纳
2008-06-27 18:12
很抱歉,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更麻烦。以上言论的版权由真诚到永远所有
提问者评价
感谢真诚的回答啊
评论|0

☆真诚到永远☆   |八级采纳率58%

擅长:C/C++VC++操作系统/系统故障

按默认排序|按时间排序

其他1条回答

2008-06-28 22:16csx007700|四级
你去查一些Hook SSDT的资料吧,不过要编写驱动,比较麻烦。
原创粉丝点击