首页 >  知识中心 >  新闻详情

程序里的钩子函数 谁能用c语言写一个钩子函数的例子

来源:朵拉利品网  |  2020-05-06 10:24:43

1, 谁能用c语言写一个钩子函数的例子



例子:
HWND hWnd = NULL; //定义成全局变量
HHOOK hKeyboard;
HHOOK hMouse;
LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lparam ) // 鼠标钩子函数
{
return 1; // 返回非零值表示已经对当前消息进行了处理,这样系统就不会再将这个消息传递给目标窗口过程
}
LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lparam )
if( VK_F4 == wParam && (1 == (lparam>>29&1)) ) // 系统后门:Alt+F4键退出程序
{
::SendMessageA( hWnd, WM_CLOSE, 0, 0 );
定义钩子函数
钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是各不相同的。下面以鼠标钩子函数举例说明钩子函数的原型:
LRESULT CALLBACK HookProc(int nCode ,WPARAM wParam,LPARAM lParam)
参数wParam和 lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。nCode包含有关消息本身的信息,比如是否从消息队列中移出。 我们先在钩子函数中实现自定义的功能,然后调用函数 CallNextHookEx.把钩子信息传递给钩子链的下一个钩子函数。CallNextHookEx.的原型如下:
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ) 参数 hhk是钩子句柄。nCode、wParam和lParam 是钩子函数。
当然也可以通过直接返回TRUE来丢弃该消息,就阻止了该消息的传递。

2, 钩子函数的原理c/c++



我的个人理解:
钩子函数其实就是函数指针,系统或软件定义好一些钩子,而你来把这些钩子挂接起来!说白了就是有些动作系统需要针对不同的情况做不同的处理,此时就需要定义一个钩子。具体的操作由用户挂上的钩子函数实现.
比如:
#include "stdio.h"
void (*g_say_func)(void);
void regist_say( void (*pfunc)(void ) )
{
g_say_func = pfunc;
}
void humen_say()
{
printf("hello world!!! ");
}
void dog_say()
{
printf("wo wo !!! ");
}
void cat_say()
{
printf("miao miao!!!");
}
void say_hello()
{
g_say_func();
}
void main()
{
regist_say(dog_say); //注册钩子函数
say_hello();
}
以上纯粹是个人理解!

3, 请教高手钩子函数的用法和作用



Windows的钩子函数分两种,一种是全局的,一种是线程的。全局的钩子函数可以捕获任何应用程序的消息,但必须是标准的DLL才能实现,VB做不了。VB可以实现线程的,就是当前应用程序的消息,这对鼠标消息的捕636f70797a6431333335346166捉有影响。
SetWindowsHookEx定义如下:
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
idHook是钩子类型,如WH_KEYBOARD捕捉键盘消息,而WH_MOUSE捕捉鼠标消息。hmod用于全局钩子,VB要实现钩子,必须设为0。dwThreadId用于线程钩子VB中可以设置为App.ThreadID。lpfn为钩子函数,在VB中可以使用AddressOf获得钩子函数的地址。这个函数因为钩子类型不同而有所不同。如键盘钩子为:
Public Function KeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
如果Code不为0,钩子函数必须调用CallNextHookEx,将消息传递给下面的钩子。wParam和lParam不是按键。

4, 谁能详细的讲一下钩子函数?



钩子函数,举个例子吧,假设你设计了一个程序,它的关键模块是A模块,而A模块中的主要函数是a()函数,
由于这个模块会因为软件的升级需要更新一些功能,而你更新功能的时候又不希望A模块被完全的替换,这时可以采用这样的策略。
在A模块中定义一个函数指针,void(*a)(void);
在调用a()函数的地方使用这样的语句:
if(a) a();
在B模块中实现具体的功能,并且在B模块初始化的时候讲外部定义的函数指针a赋初值,这样当a模块需要更新的时候只要改变B模块中的定义就可以了。
归纳一下:钩子函数就是在真正的模块中只是一个函数指针,而这个指针的赋值是再其它模块中实现的。
不好意思,没说清楚,上面讲的是回调函数,钩子函数属于回调函数的一个特例。 我是做Linux开发,win32平台具体的api不清楚,不过机制都是一样,想看win32可以看这个链接

5, 钩子程序是什么东西



木马钩子其实也是一个dll文件,这个东东讲起来比较麻烦。
我尽量说简单点。
dll文件叫动态链接库文件,系统正常运行需要调用一些程序就是通过dll文件里的函数来执行的,一个正常运行的系统进程会调用许多的dll文件,而这些dll文件在系统用到某些功能时还会调用其它的dll文件。
木马钩子就是这样一种dll文件,通过其内置的函数,使系统进程认为这个dll文件是个正常的需要调用的dll,然后再通过这个dll来启动木马。
这就有点象使用钩子一样,先钩住挂靠再贴上去。
------说得不是很贴切。

名词解释


模块

模块(module)系指由复数个具基础功能之组件,组件组成之具特定功能之组件,该组件用以组成具完整功能之系统、设备或程序;泛用于各软,硬件领域。通常以其功能,用途命名,如散热模块、存储器模块、游戏模块等。

函数

函数(function)在数学中为两不为空集的集合间的一种对应关系:输入值集合中的每项元素皆能对应唯一一项输出值集合中的元素。 其定义通常分为传统定义和近代定义,前者从运动变化的观点出发,而后者从集合、映射的观点出发。其近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示。函数概念含有三个要素:定义域A、值域C和对应法则f。

函数指针

函数指针是一种在C、C++、D语言、其他类 C 语言和Fortran2003中的指针。函数指针可以像一般函数一样,用于调用函数、传递参数。在如 C 这样的语言中,通过提供一个简单的选取、执行函数的方法,函数指针可以简化代码。函数指针只能指向具有特定特征的函数。因而所有被同一指针运用的函数必须具有相同的参数和返回类型。

 
相关新闻
函数和库函数区别 初学c语言,函数库和库函数有什么区别,都是什么意思? 07-24
普通函数和成员函数的区别 成员函数和普通函数的所有区别 07-24
内联函数与外联函数的区别 内联函数和外联函数有什么区别 07-24
内函数和外函数关系 有关C语言的内部函数和外部函数的定义说明 07-24
成员函数和内联函数 类里面的成员函数与内联函数的区别 07-24
内联函数的关键字为 内联函数与普通函数的区别是什么 07-24
构造函数是内联函数吗 [转载]为什么内联函数,构造函数,静态成员函数不能为 07-24
区分内联函数 内联函数与普通函数的区别是什么 07-24
内联函数与重载函数 内联函数和 普通函数 宏定义的区别 07-24
内联函数优缺点 调用函数与内联函数的优劣? 07-24
相关产品
供应 LWG-3080 频率信号发生器 函数信号源 脉冲群发生器 05-21
厂家直销 不锈钢活动粘钩 金属强力钩子 免打孔卡通挂钩批发 06-18
LNG加气站站运行程序管理-LNG/L-CNG加气站设备管理 06-22
重庆不锈钢板哪里的好 不锈钢板行业 不锈钢板 重庆正硕 06-27
奉新行FX现代圣达菲新胜达驱动半轴总成外球笼内球笼防尘套修理包 驱动轴 07-03
供应恩鹤照明可选数码管 07-26
奶山羊羊苗养殖场 哪里的种羊品种好 亚洲黄羊羊舍 07-29
金袖子线盒钩绑好的双钩鱼钩子线仕挂渔具垂钓用品不带倒刺金袖钩 08-01
资阳简易机箱6、8/10人电玩设备捕鱼机 打鱼机 大型游戏机 08-02
肯德基小程序点餐系统开发 08-23

大家都在看