钩子(Hook),是Windows消息处理机制的一个平台,
钩子实际上是一个处理消息的程序段,通过系统调用,
hook的这个本领,使它能够将自身的代码“融入”被hook住的程序的进程中,成为目标进程的一个部分。我们也知道,在windows2000以后的系统中,普通用户程序的进程空间都是独立的,程序的运行彼此间都不受干扰。这就使我们希望通过一个程序改变其他程序的某些行为的想法不能直接实现,但是hook的出现给我们开拓了解决此类问题的道路。
Pan Ying(zero world) 现在的不少程序都有取得密码窗口的内容的功能,你有没有想过是如何做到这一切的呢?我有一个同学就问过我这样一个问题,当时我也回答不出来,现在我研究了视窗的Hook函数之后总算有了一定的了解。下面就有我来揭开Hook函数的神秘面纱。 先来介绍Hook的含义: Hook是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息。举例来说,当你在一个窗口上点击鼠标以后,首先接收信息的是相应的Hook函数,然后才传到相应的应用程序。 如何定义Hook函数: SetWindowsHookEx: 用来装入新的Hook函数,其参数列表为下: int idHook:装入Hook类型,有WH_MOUSE 等。 HOOKPROC lpfn:要装入的Hook函数地址。 HINSTANCE hMod:函数所在的进程,如果为全局Hook函数该函数必须在Dll中。 DWORD dwThreadId:装入哪个进程,如果为全局,则为0。 返回相应Hook标识。 HookProc: 您自定义的Hook函数,应具有的参数如下: int nCode:传入的信息类型。 WPARAM wParam:短整型参数。 LPARAM lParam:长整型参数。 要在函数中调用CallNextHookEx把信息传给下一个Hook函数。 CallNextHookEx: 用于将信息传给下一个Hook函数,需要将得到的Hook标识和相应参数传入。 UnhookWindowsHookEx: 用于将装入的Hook函数从Hook链表中剔除,应传入得到的Hook标识。 下面我们来看一个例子: 例子原码的下载:HookTest.zip 本程序在Window98和Delphi5下通过。 一、调用LoadLibrary和GetProcAddress取得函数地址。 hinstDLL := LoadLibrary(LPCTSTR( 'hooktest.dll ')); @hkprcSysMsg:=GetProcAddress(hinstDLL, 'MouseProc '); 二、用SetWindowsHookEx将得到的函数装入。 hhk:= SetWindowsHookEx(WH_MOUSE,@hkprcSysMsg,hinstDLL, 0); 三、Windows会将函数装入到每一个进程中。 四、每当鼠标点击,自定义的Hook函数会将点击的窗口标题传给程序的标题。 if (nCode=HC_ACTION)and(WPARAM=WM_LBUTTONDOWN) then begin MyMouse:=CPointer(lPARAM); MyHandle2:=MyMouse^.hwnd; GetMem(MyString,GetWindowTextlength(myhandle2)+1); GetWindowText(MyHandle2,MyString,GetWindowTextlength(myhandle2)+1); TempHandle:=myhandle2; while (TempHandle <> 0) do begin myHandle2:=TempHandle; TempHandle:=GetParent(TempHandle); end; if (myhandle2 <> 0) then SetWindowText(myhandle2,MyString); FreeMem(MyString); end 就这样完成了得到密码窗口内容的功能 |