HOOK的实例
来源:互联网 发布:图片透视软件 编辑:程序博客网 时间:2024/04/30 23:37
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的资料吧,不过要编写驱动,比较麻烦。
- 消息hook的实例
- HOOK的实例
- HOOK 与 DLL的实例
- hook实例
- Hook钩子C#实例
- WINCE hook技术实例
- hook实例小记
- Hook钩子C#实例
- Hook钩子C#实例
- Hook钩子C#实例
- Hook :实例剖析
- Hook钩子C#实例
- Hook钩子C#实例
- 一个非常清晰的"Hook API"实例源码
- SSDTHook实例--编写稳定的Hook过滤函数
- Hook 简单的实例--拦截鼠标和键盘消息(一)
- HOOK启思录-- HOOK的发展
- NDIS HOOK及MINIPORT HOOK的实现
- chrome开发者工具console
- 虚拟内存,学习随笔
- 重写窗体关闭事件protected override void OnFormClosing(FormClosingEventArgs e)遇到的错误
- HDU 3886 数位DP
- 通过URLConnection的方式访问WebService
- HOOK的实例
- light OJ 1205 数位DP
- Visual Studio 2008中使用科学计算库GSL
- 解决 “fatal error C1902: 程序数据库管理器不匹配;请检查安装” 的方法
- android学习——各个国家语言缩写
- 内存对齐问题
- oracle实用函数
- light OJ 1068 数位DP
- fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h