Knocker 发表于 2006-3-27 13:12

Hook及其应用

<P>Hook可真是一个了不起的家伙,它有时令人又爱又怕!那么什么是Hook呢?原来呀,它是用来拦截系统某些信息之用,例如说,我们想让系统不管在什麽地方只要按个Ctl-N便执行NotePad,或许您会使用Form的KeyPreview ,设定为True,但在其他Process中按Ctl-N呢?那就没有用,这时就得设一个Keyboard Hook来拦截所有Key in的键;再如:MouseMove的Event只在该Form或Control上有效,如果希望在Form的外面也能得知Mouse Move的信息,那只好使用Mouse Hook来栏截Mouse 的信息。Hook呢,可以是整个系统为范围(Remote Hook),即其他 Process的动作您也可以拦截,也可以是LocalHook,它的拦截范围只有Process本身。 Remote Hook的Hook Function要在.Dll之中,Local Hook则在.Bas中。</P>
<P>  在VB如何设定Hook呢?使用SetWindowsHookEx()</P>
<P>  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</P>
<P>  idHook代表是何种Hook,有以下几种</P>
<P><BR>Public Const WH_CALLWNDPROC = 4<BR>Public Const WH_CALLWNDPROCRET = 12<BR>Public Const WH_CBT = 5<BR>Public Const WH_DEBUG = 9<BR>Public Const WH_FOREGROUNDIDLE = 11<BR>Public Const WH_GETMESSAGE = 3<BR>Public Const WH_HARDWARE = 8<BR>Public Const WH_JOURNALPLAYBACK = 1<BR>Public Const WH_JOURNALRECORD = 0<BR>Public Const WH_KEYBOARD = 2<BR>Public Const WH_MOUSE = 7<BR>Public Const WH_MSGFILTER = (-1)<BR>Public Const WH_SHELL = 10<BR>Public Const WH_SYSMSGFILTER = 6</P>
<P>  lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个信息产生时,来处理它的Function,这个Hook Function有一定的参数格式</P>
<P>  Private Function HookFunc(ByVal nCode As Long,ByVal wParam As Long, ByVal lParam As Long ) As Long</P>
<P>  nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。</P>
<P>  因这个参数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至于Hook Function的名称我们可以任意给定,不一定叫HookFunc</P>
<P>  hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(".dll名称")来传入。</P>
<P>  dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以 一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。<BR>  值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle, 这个值要记录下来。<BR>  因为A程序可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程序也来设一 个Remote的 KeyBoard Hook,那麽到底KeyBoard的信息谁所拦截?答案是,最後的那一个 所拦截,也就是说A先做 keyboard Hook,而後B才做,那信息被B拦截,那A呢?就看B的 Hook Function如何做。如果B想让A的 Hook Function也得这个信息,那B就得呼叫 CallNextHookEx()将这信息Pass给A,於是产生Hook的一个连线。如果B中不想Pass这信息给A,那就不要呼叫CallNextHookEx()。</P>
<P><BR>Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" _<BR>(ByVal hHook As Long, _<BR>ByVal ncode As Long, _<BR>ByVal wParam As Long, _<BR>lParam As Any) As Long</P>
<P>  hHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure 中的三个参数。<BR>  最後是将这Hook去除掉,请呼叫UnHookWindowHookEx()<BR>  Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" _<BR>(ByVal hHook As Long) As Long <BR>  hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程序结束Hook,则换A可 以直接拦截信息。</P>


页: [1]

编程论坛