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 这样的语言中,通过提供一个简单的选取、执行函数的方法,函数指针可以简化代码。函数指针只能指向具有特定特征的函数。因而所有被同一指针运用的函数必须具有相同的参数和返回类型。