关于Hook的基本概念
hook方法的通俗解释

hook方法的通俗解释
"hook"方法通常是指在编程中用于改变或扩展现有代码行为的
一种技术。
它通常用于软件开发中的插件或扩展机制中,允许开发
人员在不修改原始代码的情况下,通过在特定的“hook”点插入自
定义代码来改变程序的行为。
具体来说,当一个程序在特定的事件发生时会触发一个“hook”点,开发人员可以注册他们自己的函数或代码到这个“hook”点上。
这样,当该事件发生时,注册的代码就会被执行,从而改变了程序
的行为。
举个例子,假设有一个网页应用程序,当用户点击“提交”按
钮时,程序会触发一个“beforeSubmit”钩子。
开发人员可以注册
他们自己的函数到这个钩子上,用于在表单提交之前执行一些额外
的验证或处理逻辑。
这样,无需修改原始的提交按钮代码,就可以
通过“hook”方法来扩展其行为。
总的来说,"hook"方法是一种非常灵活的技术,可以帮助开发
人员在不破坏现有代码结构的情况下,对程序进行定制和扩展。
它
在软件开发中被广泛应用,能够提高代码的可维护性和可扩展性。
hook编程

Hook编程什么是Hook编程在计算机科学中,Hook(钩子)是一种能够截获特定事件的机制。
Hook编程则是通过使用钩子来修改、扩展或拦截应用程序的行为。
通过在关键点插入自定义代码,可以实现对应用程序的控制和操作。
通过Hook编程,开发人员可以在应用程序的运行过程中插入自己的代码,并对其行为进行修改或拦截。
Hook技术广泛应用于操作系统、应用程序和游戏开发中,使开发人员能够定制和控制系统或应用的行为。
Hook编程的用途和优势Hook编程有许多用途和优势:1. 功能扩展通过Hook编程,可以在原有功能的基础上进行扩展,添加额外的功能。
这对于自定义应用程序的行为非常有用,可以根据特定需求进行定制化开发。
2. 行为修改Hook编程可以截获应用程序的行为并进行修改。
这允许开发人员干预应用程序的执行过程,改变其默认行为,使其满足自己的需求。
3. 错误处理通过Hook编程,可以在特定的错误条件下自动进行处理。
开发人员可以捕获错误并采取相应的行动,以确保应用程序的稳定性和可靠性。
4. 性能优化Hook编程可以用于监测和优化应用程序的性能。
通过截获和分析关键事件,开发人员可以找出性能瓶颈并进行性能优化,提升应用程序的运行效率。
5. 安全控制通过Hook编程,可以实现对应用程序的安全控制。
开发人员可以拦截和检测恶意行为,并采取相应的防范措施来保护应用程序和用户的安全。
Hook编程的实现方式在实际应用中,可以使用不同的方式来实现Hook编程:1. 静态链接静态链接是指在编译时将Hook代码直接嵌入到目标二进制文件中。
当目标程序运行时,Hook代码会被调用,从而实现对目标程序的控制。
2. 动态链接动态链接是指将Hook代码编译为动态链接库(DLL)或共享对象(SO),并在运行时将其加载到目标程序中。
通过修改系统的动态链接表(PLT/GOT),实现对目标程序的Hook。
3. 内存注入内存注入是指通过修改目标程序的内存空间,将Hook代码注入到目标程序的特定函数或方法中。
hooks 原理

hooks 原理Hooks原理是React中的重要概念,它是函数组件中引入状态和副作用的一种方式。
本文将详细介绍Hooks原理及其在React中的应用。
一、Hooks原理Hooks是React 16.8版本引入的新特性,它解决了在函数组件中无法使用state以及生命周期函数的问题。
Hooks提供了一种在函数组件中使用状态、副作用等特性的方式,以便更好地管理组件的状态和逻辑。
Hooks原理的核心是使用特定的函数来定义和更新组件的状态。
通过使用useState、useEffect等Hooks函数,我们可以在函数组件中定义状态和副作用,并在组件的生命周期中进行更新。
这样就实现了在函数组件中引入状态和副作用的效果。
二、useStateuseState是Hooks中最基本的函数之一,它用于定义和更新组件的状态。
useState函数接受一个初始状态作为参数,并返回一个数组,数组的第一个元素是当前状态的值,第二个元素是更新状态的函数。
通过调用更新状态的函数,我们可以改变组件的状态,并触发组件的重新渲染。
三、useEffectuseEffect是Hooks中用于处理副作用的函数。
副作用包括订阅事件、网络请求、修改DOM等操作。
useEffect接受两个参数,第一个参数是一个函数,用于定义副作用的具体操作;第二个参数是一个依赖数组,用于指定副作用依赖的状态。
当依赖数组中的状态发生变化时,副作用函数会被触发。
四、其他Hooks函数除了useState和useEffect外,Hooks还提供了其他一些常用的函数,如useContext、useReducer、useCallback、useMemo 等。
这些函数可以根据不同的需求,帮助我们更好地管理组件的状态和逻辑。
五、Hooks的优势相比于传统的类组件,Hooks具有以下几个优势:1. 简化组件逻辑:使用Hooks可以将组件的逻辑拆分成多个可复用的函数,使代码更加简洁和可读。
新手教学 —— HOOK指令概念及运用

新手教学——HOOK指令概念及运用我们平时写程序时,比如读HP,MP,都会用一个时钟设定周期去读,然后判断值再进行相应的操作。
但是利用时钟反复的读取非常占用系统资源,如果时钟设慢了又达不到想要的效果。
在这种情况下HOOK指令就可以达到非常好的效果了。
一.HOOK原理我们经常会去搜索到一个血值,然后CE查找访问,找到类似Mov edx,eax的代码。
Mov 指令就是赋值指令,将EAX的值赋给EDX,所以这里EAX就是我们想要获取到的血值。
那如何达到HOOK的目的呢?很简单,我们在自己程序内写一个接收EAX参数的子程序,那么只要Push eax,再Call我们的子程序地址上去,我们的子程序就能接收到EAX的值,并进行相应的处理,处理完后再转回原汇编继续运行。
可以说我们获得血值的时间比显示血值的时间更早,并且又避免了时钟反复的进行无用功。
顺便提一句,如果子程序中EAX用传址方式传参的话,还能修改EAX的值然后返回。
二.实际运用这里我写了一个类似血值变化的小程序。
当我们按“变”后,Value的值就会变化,并且下面那个编辑框显示读取到的值。
我们跟着HOOK的原理一步一步往下做。
打开CE,加载进程,搜索到这个变化的值。
右键选择查找访问再按一下“变”,我们就能看到那条关键性的MOV指令了。
选中MOV指令,点Show disassembler查看指令。
顺便分析一下这个CALL,把EAX的值放入0048a180中,PUSH4个参数,环境EBX=00401bf0,最后call 004014cc。
很显然,我们需要将EAX的值PUSH进堆栈,然后调用我们自己的子程序中就能实现HOOK 了,所以首先在易语言中定义一个接收参数的子程序这里我们怎么修改呢,如果直接修改就破坏了原来的指令,这是大忌。
在这里我们没办法对原汇编进行缩减,所以只能自己申请内存,先跳转到申请到的内存里,然后执行,完了再跳转回来。
顺便提一下跳转指令,汇编中的跳转指令很多,但大致分相对跳转和绝对跳转。
ios hook实例方法与类方法

ios hook实例方法与类方法这个题目涉及iOS开发中的两个重要概念:Hook(钩子)和方法(Method)。
在iOS开发中,Hook是指通过篡改运行时(Runtime)来修改方法的行为。
一个方法是指一段可执行代码,类方法是属于某个特定类的方法,而实例方法是属于某个具体对象的方法。
在下面的文章中,将逐步讲解iOS Hook实例方法与类方法的原理和实例。
第一部分:Hook原理1.1Hook的概念Hook是指在程序运行时对某个方法进行修改,从而改变该方法的行为或者获取方法的执行信息。
通常情况下,Hook中的修改行为被称为“注入(Injection)”,并且它可以分为两种类型:钱钩式(Hook Before)和后钩式(Hook After)。
钱钩式是在原方法执行之前做一些处理,而后钩式是在原方法执行之后做一些处理或者修改返回值。
1.2运行时(Runtime)运行时是指程序在运行时的状态,iOS开发中的运行时是由Objective-C runtime库提供支持的,它能够在程序运行过程中动态修改类和对象的行为。
Objective-C runtime库是苹果公司为了支持Objective-C语言增加的一个运行时环境,它包含了一系列的API,用于管理和操作对象、类和消息传递等。
1.3方法交换方法交换是指将两个方法的实现进行交换,从而达到修改方法行为的目的。
在Objective-C中,每个方法都对应着一个方法选择器(SEL)和方法实现(IMP),方法选择器用于唯一标识一个方法,而方法实现则是对方法的具体实现。
通过使用运行时的方法交换API,我们可以将两个方法的实现进行交换,从而达到修改方法行为的效果。
第二部分:Hook实例方法2.1实例方法的概念实例方法是指属于某个具体对象的方法,只有通过实例化一个对象,才能够调用和执行该方法。
在Objective-C中,实例方法是通过在类中定义的方法来实现的。
比如,对于一个名为Person的类,它可以定义一个实例方法叫做eat,用于表示一个人在吃饭。
hook实现原理

hook实现原理Hook,即钩子,是一种在特定事件发生之前、之中或之后执行的代码。
在编程中,钩子技术被广泛应用于各种场景,如进程间通信、事件处理、性能监控等。
本文将介绍钩子的基本原理,以及在C++编程语言中使用钩子进行事件处理的实现方法。
一、钩子的基本原理钩子是一种特殊的函数,通常在特定事件发生时被系统调用。
钩子的实现原理通常是在系统调用事件发生之前,通过某种方式拦截事件的执行流程,并添加自定义的代码。
这种实现方式依赖于编程语言的底层机制,通常涉及到操作系统的内存管理、进程控制、中断处理等方面。
在C++中,钩子的实现通常需要借助操作系统提供的API函数或内核对象来实现。
钩子的注册和注销通常需要调用相应的API函数,以便在特定事件发生时触发钩子函数。
同时,钩子函数需要具备可移植性,以便在不同的操作系统和平台上使用。
1. 钩子注册和注销在C++中,钩子的注册和注销通常需要使用操作系统提供的API函数。
例如,在Windows操作系统中,可以使用SetWindowsHookEx()函数注册钩子,使用UnhookWindowsHookEx()函数注销钩子。
这些函数需要传递钩子函数的地址作为参数,以便在特定事件发生时执行钩子函数。
2. 钩子函数的执行当事件发生时,操作系统会根据注册的钩子函数列表,依次调用相应的钩子函数。
每个钩子函数会在事件发生的过程中添加自定义的代码,从而实现钩子的功能。
钩子函数的执行顺序和执行时机取决于注册时的顺序和条件。
3. 钩子的类型和用途钩子根据实现方式可以分为不同的类型,如键盘钩子、鼠标钩子、定时器钩子等。
不同类型的钩子适用于不同的场景,如键盘钩子可用于实现键盘快捷键功能,鼠标钩子可用于实现鼠标事件处理等。
根据用途不同,钩子可以应用于各种编程场景,如游戏开发、网络通信、应用性能监控等。
三、案例分析:C++游戏开发中的钩子实现在C++游戏开发中,钩子技术常用于事件处理和性能监控。
以下是一个简单的示例程序,展示了如何在游戏开发中使用钩子技术:1. 程序初始化时注册鼠标移动钩子在程序初始化时,使用系统API函数注册鼠标移动钩子。
frida java层hook原理

frida java层hook原理Frida Java层Hook原理Frida是一款强大的动态分析工具,可以用于对Android应用进行逆向分析和应用程序的动态修改。
在Android开发中,Java层是应用程序的核心,在Java层进行Hook可以实现对应用程序的修改和控制。
本文将介绍Frida在Java层进行Hook的原理和实现方法。
一、Hook的基本概念和原理Hook是指在应用程序中拦截和修改函数调用的过程。
在Android 应用程序中,通过Hook可以截获应用程序的函数调用,修改其参数或返回值,甚至可以替换原有的函数实现。
Hook技术可以用于实现诸如函数跟踪、代码注入、动态调试等功能。
Frida是一款基于动态注入的Hook工具,它通过在目标进程中注入自己的代码来实现对应用程序的Hook。
Frida支持多种操作系统和架构,包括Android、iOS、Windows和macOS等。
在Android平台上,Frida主要通过Java层和Native层两种方式进行Hook。
二、Frida在Java层进行Hook的原理Frida在Java层进行Hook的原理主要有两个步骤:寻找目标函数和替换目标函数。
1. 寻找目标函数在Java层进行Hook时,首先需要确定目标函数的位置。
Frida提供了一些API来辅助寻找目标函数,比如通过类名和方法名来查找目标函数。
通过调用Frida提供的Java API,可以获取到目标函数的Method对象,进而获取到目标函数的地址。
2. 替换目标函数在找到目标函数之后,就可以通过Frida的Java API来替换目标函数了。
Frida提供了一些函数来实现Hook,比如intercept、replace等。
通过调用这些函数,可以将自定义的函数替换目标函数,实现对目标函数的修改和控制。
三、Frida在Java层进行Hook的实现方法在Frida中,可以使用JavaScript来编写Hook的代码。
frida hook so层 导出函数

1. 引言在移动应用程序开发中,安全性一直是一个重要的关注点。
为了保护应用程序免受黑客攻击和恶意软件的侵害,开发人员需要采取各种安全措施来确保应用程序的安全性。
其中,对于安卓应用程序而言,防止应用程序被hook是至关重要的一环。
2. Frida框架Frida是一款强大的动态分析工具,它可以用于进行应用程序的动态分析和修改。
Frida框架可以通过在应用程序运行时注入JavaScript脚本来实现应用程序的hook。
Frida框架可以在Android和iOS评台上使用,并且支持多种架构,包括ARM、x86和x86_64等。
3. Hook的概念在计算机科学中,hook指的是通过修改内存中的数据或者修改函数调用来改变程序的运行行为。
对于安卓应用程序而言,hook可以用来打印函数的参数和返回值,修改函数的返回值,甚至完全替换目标函数的实现。
4. Frida对So层导出函数的Hook在安卓应用程序中,许多重要的逻辑都是在so层实现的。
对so层导出函数的hook尤为重要。
通过hook so层导出函数,我们可以监控函数的调用和返回值,甚至可以修改函数的行为,从而实现对应用程序的动态修改和调试。
5. Hook So层导出函数的方法在Frida框架中,hook So层导出函数可以通过以下步骤实现:(1) 通过frida-trace工具分析目标函数我们可以使用frida-trace工具来分析目标so库中的函数。
frida-trace工具可以帮助我们快速找到我们需要hook的函数,并生成相应的hook脚本。
(2) 编写JavaScript脚本接下来,我们需要根据frida-trace工具生成的分析结果,编写相应的JavaScript脚本。
JavaScript脚本中需要包括对目标函数的hook逻辑,以及对函数参数和返回值的处理逻辑。
(3) 注入JavaScript脚本我们需要将编写好的JavaScript脚本注入到目标应用程序中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于Hook一、基本概念:钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
当消息到达后,在目标窗口处理函数之前处理它。
钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。
每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
二、运行机制:1、钩子链表和钩子子程:每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。
这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。
当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。
一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。
最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。
每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。
如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。
钩子子程是一个应用程序定义的回调函数(CALLBACK Function),不能定义成某个类的成员函数,只能定义为普通的C函数。
用以监视系统或某一特定类型的事件,这些事件可以是与某一特定线程关联的,也可以是系统中所有线程的事件。
钩子子程必须按照以下的语法:LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);HookProc是应用程序定义的名字。
nCode参数是Hook代码,Hook子程使用这个参数来确定任务。
这个参数的值依赖于Hook类型,每一种Hook都有自己的Hook代码特征字符集。
wParam和lParam参数的值依赖于Hook代码,但是它们的典型值是包含了关于发送或者接收消息的信息。
2、钩子的安装与释放:使用API函数SetWindowsHookEx()把一个应用程序定义的钩子子程安装到钩子链表中。
SetWindowsHookEx函数总是在Hook链的开头安装Hook子程。
当指定类型的Hook监视的事件发生时,系统就调用与这个Hook关联的Hook链的开头的Hook子程。
每一个Hook链中的Hook子程都决定是否把这个事件传递到下一个Hook子程。
Hook子程传递事件到下一个Hook子程需要调用CallNextHookEx函数。
HHOOK SetWindowsHookEx( int idHook, // 钩子的类型,即它处理的消息类型 HOOKPROC lpfn, // 钩子子程的地址指针。
如果dwThreadId参数为0// 或是一个由别的进程创建的线程的标识,// lpfn必须指向DLL中的钩子子程。
// 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
// 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
HINSTANCE hMod, // 应用程序实例的句柄。
标识包含lpfn所指的子程的DLL。
// 如果dwThreadId 标识当前进程创建的一个线程,// 而且子程代码位于当前进程,hMod必须为NULL。
// 可以很简单的设定其为本应用程序的实例句柄。
DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
// 如果为0,钩子子程与所有的线程关联,即为全局钩子。
); 函数成功则返回钩子子程的句柄,失败返回NULL。
以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子程,且被钩子子程先处理。
在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它,以执行钩子链表所指的下一个钩子子程。
这个函数成功时返回钩子链中下一个钩子过程的返回值,返回值的类型依赖于钩子的类型。
这个函数的原型如下:LRESULT CallNextHookEx(HHOOK hhk;int nCode;WPARAM wParam;LPARAM lParam;);hhk为当前钩子的句柄,由SetWindowsHookEx()函数返回。
NCode为传给钩子过程的事件代码。
wParam和lParam 分别是传给钩子子程的wParam值,其具体含义与钩子类型有关。
钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。
否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。
钩子在使用完之后需要用UnHookWindowsHookEx()卸载,否则会造成麻烦。
释放钩子比较简单,UnHookWindowsHookEx()只有一个参数。
函数原型如下:UnHookWindowsHookEx(HHOOK hhk;);函数成功返回TRUE,否则返回FALSE。
3、一些运行机制:在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。
当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。
也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。
因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。
在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。
也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。
必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。
#pragma data_seg预处理指令用于设置共享数据段。
例如:#pragma data_seg("SharedDataName")HHOOK hHook=NULL;#pragma data_seg()在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量 将被访问该Dll的所有进程看到和共享。
当进程隐式或显式调用一个动态库里的函数时,系统都要把这个动态库映射到这个进程的虚拟地址空间里(以下简称"地址空间")。
这使得DLL成为进程的一部分,以这个进程的身份执行,使用这个进程的堆栈。
4、系统钩子与线程钩子:SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。
线程勾子用于监视指定线程的事件消息。
线程勾子一般在当前线程或者当前线程派生的线程内。
系统勾子监视系统中的所有线程的事件消息。
因为系统勾子会影响系统中所有的应用程序,所以勾子函数必须放在独立的动态链接库(DLL) 中。
系统自动将包含"钩子回调函数"的DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程。
几点说明:(1)如果对于同一事件(如鼠标消息)既安装了线程勾子又安装了系统勾子,那么系统会自动先调用线程勾子,然后调用系统勾子。
(2)对同一事件消息可安装多个勾子处理过程,这些勾子处理过程形成了勾子链。
当前勾子处理结束后应把勾子信息传递给下一个勾子函数。
(3)勾子特别是系统勾子会消耗消息处理时间,降低系统性能。
只有在必要的时候才安装勾子,在使用完毕后要及时卸载。
三、钩子类型每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制。
下面描述所有可以利用的Hook类型。
1、WH_CALLWNDPROC和WH_CALLWNDPROCRET HooksWH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。
系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。
WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。
CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。
2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。
Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。
3、WH_DEBUG Hook在系统调用系统中与其他Hook关联的Hook子程之前,系统会调用WH_DEBUG Hook子程。
你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。
4、WH_FOREGROUNDIDLE Hook当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。
当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook子程。
5、WH_GETMESSAGE Hook应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。
你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。
6、WH_JOURNALPLAYBACK HookWH_JOURNALPLAYBACK Hook使应用程序可以插入消息到系统消息队列。
可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。
只要WH_JOURNALPLAYBACK Hook已经安装,正常的鼠标和键盘事件就是无效的。
WH_JOURNALPLAYBACK Hook是全局Hook,它不能象线程特定Hook一样使用。