Hook简介

原创 2001年08月31日 14:55:00
Hook简介<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

Hook这个东西有时令人又爱又怕,Hook是用来拦截系统某些讯息之用,例如说,我们想让系统不管在什麽地方只要按个Ctl-B便执行NotePad,或许您会使用Form的KeyPreview,设定为True,但在其他Process中按Ctl-B呢?那就没有用,这是就得设一个Keyboard Hook来拦截所有Key in的键;再如:MouseMove的Event只在该Form或Control上有效,如果希望在Form的外面也能得知Mouse Move的讯息,那只好使用Mouse Hook来栏截Mouse的讯息。再如:您想记录方才使用者的所有键盘动作或Mosue动作,以便录巨集,那就使用JournalRecordHook,如果想停止所有Mosue键盘的动作,而放(执行)巨集,那就使用JournalPlayBack Hook;Hook呢,可以是整个系统为范围(Remote Hook),即其他Process的动作您也可以拦截,也可以是LocalHook,它的拦截范围只有Process本身。Remote Hook的Hook Function要在.Dll之中,Local Hook则在.Bas中。在VB如何设定Hook呢?使用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代表是何种Hook,有以下几种

    Public Const WH_CALLWNDPROC = 4

    Public Const WH_CALLWNDPROCRET = 12

    Public Const WH_CBT = 5

    Public Const WH_DEBUG = 9

    Public Const WH_FOREGROUNDIDLE = 11

    Public Const WH_GETMESSAGE = 3

    Public Const WH_HARDWARE = 8

    Public Const WH_JOURNALPLAYBACK = 1

    Public Const WH_JOURNALRECORD = 0

    Public Const WH_KEYBOARD = 2

    Public Const WH_MOUSE = 7

    Public Const WH_MSGFILTER = (-1)

    Public Const WH_SHELL = 10

    Public Const WH_SYSMSGFILTER = 6

 

lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式

 

    Private Function HookFunc(ByVal nCode As Long, _

                            ByVal wParam As Long, _

                            ByVal lParam As Long ) As Long

 

        nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。

        wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。

    因这个叁数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一定叫 HookFunc

 

hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(".dll名称")来传入。

 

dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。

 

值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,这个值要记录下来。

 

因为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()。

 

Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" _

        (ByVal hHook As Long, _

        ByVal ncode As Long, _

        ByVal wParam As Long, _

        lParam As Any) As Long

 

hHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure中的三个叁数。

 

最後是将这Hook去除掉,请呼叫UnHookWindowHookEx()

 

Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx"  _

        (ByVal hHook As Long) As Long

 

hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。

 

 

KeyBoard Hook的范例

 

Hook Function的三个叁数

 

nCode        wParam                     lParam            传回值

===========  ========================== ==============    ================

HC_ACTION    表按键Virtual Key          与WM_KEYDOWN同  若讯息要被处理传0

                                                        反之传1

HC_NOREMOVE

 

 

Public hHook as Long

 

Public Sub UnHookKBD()

If hnexthookproc <> 0 Then

    UnhookWindowsHookEx hHook

    hHook = 0

End If

End Sub

 

Public Function EnableKBDHook()

If hHook <> 0 Then

    Exit Function

End If

hhook = SetWindowsHookEx(WH_KEYBOARD, AddressOf _

            MyKBHFunc, App.hInstance, App.ThreadId)

End Function

 

Public Function MyKBHFunc(ByVal iCode As Long, _

    ByVal wParam As Long, ByVal lParam As Long) As Long

  MyKBHfunc = 0 '表示要处理这个讯息

 

  If wParam = vbKeySnapshot Then  '侦测 有没有按到PrintScreen键

    MyKBHFunc = 1 '在这个Hook便吃掉这个讯息

  End If

  Call CallNextHookEx(hHook, iCode, wParam, lParam) '传给下一个Hook

End Function

 

至于其他的 Hook的详细资料与nCode,wParam, lParam的意义,请查Win32 Help或Windows 95: A Developer's Guide (Jeffrey Richter著)(中译本:基峰 李书良译 侯俊杰总监 Windows95程式设计指南)

拦截聊天记录--Hook技巧简介【原创】

一、    战场环境 [兵工场]:VC6.0 [兵器谱]: Detours Express 2.1、Windbg6.11、OllyDBG 二、    战术分析 Hook从字面上...
  • liujiayu2
  • liujiayu2
  • 2016年02月02日 18:40
  • 1298

hook简介

 1.Hook简介:作用是拦截某些消息,关键函数是SetWindowsHookEX()2.示例程序:  1.新建一基于对话框工程,InnerHook,此过程的钩子是只拦截本进程的。  2.在OnIni...
  • zy122
  • zy122
  • 2006年11月14日 11:58
  • 475

HOOK简介

Hook这个东西有时令人又爱又怕,Hook是用来拦截系统某些讯息之用,例如说,我们想让系统不管在什麽地方只要按个Ctl-B便执行NotePad,或许您会使用Form的KeyPreview,设定为Tru...
  • guoyi987
  • guoyi987
  • 2011年01月18日 16:15
  • 237

GTK+浅谈之总结

一、简介        GTK+的一些知识点总结,方便以后查阅。 二、详解 1、G_BEGIN_DECLS和G_END_DECLS宏 #ifdef __cplusplus # define G...
  • taiyang1987912
  • taiyang1987912
  • 2015年09月02日 10:12
  • 633

基本的Logos语法

1.%hook 指定需要hook的class,必须以%end结尾。2.%log 该指令在%hook内部使用,将函数的类名、参数等信息写入syslog,可以%log([(),…..])的格...
  • G_Barble
  • G_Barble
  • 2015年07月28日 10:46
  • 1536

Hook技术简介

转载自:http://www.cnblogs.com/cryinstall/archive/2011/08/30/2280826.html 钩子(Hook),是Windows消息处理机制的一个平台,...
  • kevin_bobolkevin
  • kevin_bobolkevin
  • 2016年03月30日 10:48
  • 126

Hook技术简介

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机...
  • zm_21
  • zm_21
  • 2016年09月24日 20:45
  • 184

inline hook简介

inline hook简介 2011-07-24 19:49 1、简介          INLINE HOOK原理:         Inline Hook通过硬编码...
  • xiaoqiangvs007
  • xiaoqiangvs007
  • 2012年04月22日 11:53
  • 924

(转贴)HOOK简介

 HOOK专题目录 基本概念 运行机制 钩子类型 作者基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息...
  • bestshl
  • bestshl
  • 2007年02月15日 09:08
  • 508

API Hook应用简介

许久未写博客了,整个5月份与6月份都在做未知病毒检测的相关课题,其中的核心技术就是API Hook与支持向量机算法(SVM),大体的做法就是使用API Hook得到可疑进程的API调用序列,然后以AP...
  • SerenityMoon
  • SerenityMoon
  • 2010年08月23日 10:32
  • 2510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hook简介
举报原因:
原因补充:

(最多只允许输入30个字)