钩子函数的原理c/c++
发布网友
发布时间:2022-04-07 08:31
我来回答
共5个回答
热心网友
时间:2022-04-07 10:00
我的个人理解:
钩子函数其实就是函数指针,系统或软件定义好一些钩子,而你来把这些钩子挂接起来!说白了就是有些动作系统需要针对不同的情况做不同的处理,此时就需要定义一个钩子。具体的操作由用户挂上的钩子函数实现.
比如:
#include "stdio.h"
void (*g_say_func)(void);
void regist_say( void (*pfunc)(void ) )
{
g_say_func = pfunc;
}
void humen_say()
{
printf("hello world!!!\n");
}
void dog_say()
{
printf("wo wo !!!\n");
}
void cat_say()
{
printf("miao miao!!!");
}
void say_hello()
{
g_say_func();
}
void main()
{
regist_say(dog_say); //注册钩子函数
say_hello();
}
以上纯粹是个人理解!追问你写的这个好像只能说是回调吧?不是说钩子是特殊的回调吗,我怎么没看出这里面有什么特殊的地方啊
追答我也是看过linux netfilter钩子的时候,把钩子理解成这样。也不知道有没有理解错!
热心网友
时间:2022-04-07 11:18
例如键盘钩子,操作系统取得按键输入之后,会把这个按键消息发给当前的激活的窗口程序(例如word),但在发送给窗口程序之前,会先把这个按键消息作为参数调用一个函数,这个函数就是钩子函数,通常情况下,这个函数是一个空函数,如果你安装了钩子函数之后呢,这个函数就会跳转到你自己写的程序上,这时候你自己的程序就可以先处理这个键盘消息。这就是钩子函数的基本工作过程。
热心网友
时间:2022-04-07 12:53
构子也叫hook,一般用来钓鱼的,有几种分类方式,一般我都理解为用户级和内核级的hook。介绍的文章么,网上有很多了,我只在ccrun上写过一篇《API Hook基本原理和实现》,文库中有这篇文章,很肤浅。hook可以做很多事,如监控鼠标和键盘,远程注入其他程序。内核中的hook与使用api的那种hook已经很不一样了。微点对这个hook的机制弄得还不错,一般的hook都可以拦住。
hook的代码例子有很多,如老外的
http://www.codeproject.com/KB/system/HookSys/HookSys_code.zip
我在文章中也提了一个例子,源代码不知在ccrun上是否还可查到,如需要可留下邮箱。
热心网友
时间:2022-04-07 14:44
观望。。。。
热心网友
时间:2022-04-07 16:52
钩子本质上是一个jmp指令,win32提供的钩子都是比较高层的钩子。
除非API为你提供了钩子回调机制,否则你只能用“注入”的方式挂上钩子。
一个典型的,教科书式的方法:首先得到程序中函数的转跳地址,对于像user32.dll这种库,里面的地址万年不变的,然后在push参数之后,插入二进制(动态挂钩子)转跳指令,转跳地址就是你的钩子函数,在这个函数中你可以得到原来函数所有的参数。完成操作之后弹栈回跳要注意,不可将参数栈一起弹出,否则被钩挂的函数可能异常。
动态挂钩的过程,本质上是对程序代码段的一种写操作