第5讲Windows消息机制及HOOK应用
Windows 下 API hook 和 Windows hook 应用区别

Windows 下API hook 和Windows hook 应用区别Hook 字面的意思是钩子,但是实际上更像提供一种过滤,或者说修改消息处理,或者API的机制。
API hook什么是API的hook呢,其实就是将API调用的地方进行了转移,或者重新实现的一种技术。
这种技术不仅仅可以用在windows 上,其他OS上一样可以使用,我曾经在brew mp 上的手机开发上测试过API hook。
所以这里主要只讲windows 下的API hook。
API 的hook 基本思路都是想办法替换原来的API,使函数的调用关系,直接进行转换,典型的如下可以看到client 端要调用的FunctionA,在A进入之后,就调用了FunctionB , 在FunctionB 中回到FunctionA 做具体A应该做的事情,从A返回之后,FunctionB 然后在返回给Client,那么在FunctionB 中使用FunctionA的前后,它自己都可以干自己想要干的事情,这样就是一个API的hook, 下面我们主要讨论Windows 上最常用的两种API hook 策略。
A)IAT 替换API hook所谓的IAT (import address table ) 这个是PE文件中一个重要的部分,这里我们不详细讨论PE文件的构成,因为这个本来就可以写一张内容。
我们主要了解的是PE如何在一个已经加载在内存中的PE文件如何找到它的IAT。
(1)为什么要找IAT?一个模块,可能依赖别的API,也可能提供API,供别的模块调用,MS为了在PE文件中,分别用导入表和导出表进行描述两种关系。
导入表IAT 主要是描述了这个模块依赖那些其他模块提供的API。
而导出表EAT 是描述这个模块中都提供那些函数供别的模块调用。
如果我们在某个模块的导入表中替换它所依赖的函数,那么这样就可以实现API hook.(2)如何找IAT?要找IAT 要稍微了解一下PE文件的结构,一个PE 文件的大概长相就是这样,我们要找的IAT,就是要先找到PE文件可选头,在这个数据结构中,描述了IAT 描述的位置在那里,然后给距IAT descriptor 就可以找到IAT了。
第5讲 Windows消息机制及HOOK应用

HOOK管理的关键函数 SetWindowsHookEx UnhookWindowsHookEx CallNextHookEx
第5讲 Windows消息机制及HOOK应用
内容 事件/消息驱动 HOOK机制
1. Windows事件驱动机制
DOS程序的特点 顺序驱动和过程驱动
Windows程序的特点 操作无序 事件驱动 以消息为中心
WINDOWS消息处理过程
队列消息 基本上是用户输入的结果 击键(如WM_KEYDOWN和WM_KEYUP消息) 击键产生的字(WM_CHAR) 鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN) 时钟消息(WM_TIMER) 更新消息(WM_PAINT) 退出消息(WM_QUIT)
消息处理程序C
消息处理程序B
HOOK概念
消息处理程序C 消息处理程序A
消息处理程序B
C就是HOOK程序。即钩子 程序
C → B → A: 消息处理函数链
HOOK本质 一段用于处理系统消息的程序,这段程序由用户编写,挂入该消息的处理函数链中,被 OS自动调用 。
HOOK技术典型应用 木马程序【特征:平时潜伏,消息触发】 屏幕抓词、进程监控、垃圾邮件过滤、软件界面定制、……
while(ParentWnd !=NULL) { glhTargetWnd=ParentWnd; ParentWnd=GetParent(glhTargetWnd); } GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题
Windows消息机制的应用(实验版)

实验设计和步骤
⑤ 双击"发送文本到记事本中"按钮,在生成的单击响应 双击"发送文本到记事本中"按钮, 事件过程中,编写代码: 事ห้องสมุดไป่ตู้过程中,编写代码:
实验设计和步骤
6. 获取另外一个程序的登录窗口文本框中的内容 操作步骤: 操作步骤: 打开文件夹中的"用户登录"程序,使用Spy++小工 ① 打开文件夹中的"用户登录"程序,使用Spy++小工 标题名和 具查找"程序主窗口的标题名 窗口类名. 具查找"程序主窗口的标题名和窗口类名.
//函数参数意义 参数 子窗口所在父窗口的句柄 参数 子窗口的句柄 函数参数意义(参数 子窗口所在父窗口的句柄; 参数2: 子窗口的句柄; 函数参数意义 参数1: //参数 子窗口的标题名) 参数3:子窗口的标题名 参数 子窗口的标题名) h1:=FindWindowEx(h,0,'Edit',nil); //查找 记事本 子窗口(文本框)的句柄 查找"记事本 子窗口(文本框) 查找 记事本"子窗口 注意:其中 为父窗口的句柄, 子窗口句柄为 表示搜索所有的子窗口 表示搜索所有的子窗口, 注意:其中h为父窗口的句柄, 子窗口句柄为0表示搜索所有的子窗口,子窗 口标题不知道就使用nil. 口标题不知道就使用 .
Windows消息机制的应用 Windows消息机制的应用
使用自己编写的程序, 使用自己编写的程序,通过向其它程序发送 Windows消息,从而达到控制该程序的目的 消息, 消息
相关知识:Windows消息机制简述 相关知识:Windows消息机制简述
Windows操作系统是基于消息(Message)驱动 Windows操作系统是基于消息(Message) 操作系统是基于消息 系统,Windows消息提供了应用程序与应用程序 系统,Windows消息提供了应用程序与应用程序 之间,应用程序与Windows Windows系统之间进行通讯的 之间,应用程序与Windows系统之间进行通讯的 手段.应用程序要实现的功能由消息来触发, 手段.应用程序要实现的功能由消息来触发, 并靠对消息的响应和处理来完成. 并靠对消息的响应和处理来完成.
Hook课件

基本概念
• 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以 在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口 可以是其他进程所创建的。当消息到达后,在目标窗口处理函数 之前处理它。钩子机制允许应用程序截获处理window消息或特定 事件。 • 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入 系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序 就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即 可以加工处理(改变)该消息,也可以不作处理而继续传递该消 息,还可以强制结束消息的传递。
HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的 子程的DLL。 // 如果dwThreadId 标识当前进程创建的一个线程, // 而且子程代码位于当前进程,hMod必须为NULL。 // 可以很简单的设定其为本应用程序的实例句柄。 DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。 // 如果为0,钩子子程与所有的线程关联,即为全局钩子。 ); 函数成功则返回钩子子程的句柄,失败返回NULL。 以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同 时发送给钩子子程,且被钩子子程先处理。
(Hook procedure)
可以设定定的值
指定要 Monitor 所有的 thread
WH_KEYBOARD: 设定当目标收到 Keyboard Message 之前,呼叫你的 function
系统如何应对 SetWindowsHookEx?
BOOL WINAPI SetDIPSHook(DWORD dwThreadId){
•
• • • • •
•
windows钩子教程(hook)

Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。
而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。
钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。
这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
可见,利用钩子可以实现许多特殊而有用的功能。
因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。
钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。
(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。
(3)外壳钩子可以监视各种Shell事件消息。
比如启动和关闭应用程序。
(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。
(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。
此外,还有一些特定事件的钩子提供给我们使用,不一一列举。
下面描述常用的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. 同步系统消息队列事件。
windows消息原理

windows消息原理Windows消息原理是Windows操作系统中一种实现进程间通信的机制。
当一个应用程序需要发送消息给另一个应用程序时,它会创建一个消息,并将该消息发送给目标应用程序的消息队列。
消息由消息标识、消息参数和消息回调函数组成。
消息标识用于识别消息的类型,每个消息标识都有一个唯一的整数值。
消息参数则用于传递附加的信息,例如鼠标位置、键盘按键等。
回调函数是接收消息并对其进行处理的函数。
当一个程序需要发送消息时,它会使用函数PostMessage或SendMessage来将消息发送给目标程序。
PostMessage函数将消息放入目标应用程序的消息队列中,并立即返回。
而SendMessage函数则会等待目标应用程序处理完消息后才返回。
接收消息的应用程序会不断从自己的消息队列中取出消息,并将其传递给消息回调函数进行处理。
回调函数根据消息类型进行相应的操作,例如更新界面、处理用户输入等。
处理完消息后,应用程序会继续处理下一个消息,直到消息队列为空。
消息机制的优点是它允许不同的应用程序之间进行松耦合的通信。
发送消息的应用程序不需要知道目标应用程序的具体实现细节,只需要知道消息标识和消息参数即可。
同时,由于消息的处理是异步的,应用程序可以同时处理多个消息,提高了系统的响应速度。
然而,消息机制也存在一些缺点。
首先,由于消息的传递是通过消息队列,因此消息的接收可能会有延迟。
另外,由于消息的处理是在接收消息的线程中进行的,如果处理消息的时间过长,会导致界面无响应或其他应用程序的操作延迟。
因此,需要合理设计消息的处理逻辑,避免长时间的阻塞操作。
总的来说,Windows消息原理是一种可靠且灵活的进程间通信机制,它为应用程序之间的数据交换提供了一种简单而高效的方式。
WINDOWS钩子HOOK

Windows系统中钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows 系统中的消息进行拦截、监视、处理。
这种技术可以广泛应用于各种软件,尤其是需要有监控、自动记录等对系统进行监测功能的软件。
本文针对这个专题进行了探讨,希望可以为读者朋友们起到抛砖引玉的作用。
一、钩子的机制及类型Windows的应用程序都是基于消息驱动的,应用程序的操作都依赖于它所得到的消息的类型及内容。
钩子与Dos中断截获处理机制有类似之处。
钩子(Hook)是Windows消息处理机制的一个平台,通过安装各种钩子,应用程序可以在上面设置子程序以监视指定窗口的某种消息,并且当消息到达目标窗口之前处理它。
在Windows中,钩子有两种,一种是系统钩子(RemoteHook),它对消息的监视是整个系统范围,另一种是线程钩子(LocalHook),它的拦截范围只有进程内部的消息。
对于系统钩子,其钩子函数(HookFunction)应在Windows系统的动态链接库(DLL)中实现,而对于线程钩子来说,钩子函数可以在DLL之中实现,也可以在相应的应用程序之中实现。
这是因为当开发人员创建一个钩子时,Windows先在系统内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去,并且新的钩子将排在老的钩子的前面。
当一个事件发生时,如果安装的是一个局部钩子,当前进程中的钩子函数将被调用。
如果是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点就要求钩子函数必须在一个动态链接库中,所以如果想要使用远程钩子,就必须把该钩子函数放到动态链接库中去。
对于钩子所监视的消息类型来说,Windws一共提供了如下几种类型:如表1所示:表一、Windows消息类型消息类型常量标识值消息类型适用范围WH_CALLWNDPROC 4 发给窗口的消息线程或系统WH_CALLWNDPROCRET 12 窗口返回的消息线程或系统WH_CBT 5 窗口变化、焦点设定等消息线程或系统WH_DEBUG 9 是否执行其它Hook的Hook 线程或系统WH_FOREGROUNDIDLE 11 前台程序空闲线程或系统WH_GETMESSAGE 3 投放至消息队列中的消息线程或系统WH_JOURNALPLAYBACK 1 将所记载的消息进行回放系统WH_JOURNALRECORD 0 监视并记录输入消息系统WH_KEYBOARD 2 键盘消息线程或系统WH_MOUSE 7 鼠标消息线程或系统WH_MSGFILTER -1 菜单滚动条、对话框消息线程或系统WH_SHELL 10 外壳程序的消息线程或系统WH_SYSMSGFILTER 6 所有线程的菜单滚动条、对话框消息系统二、VB编程中钩子的实现(一)钩子函数(HOOK Function)的格式。
Windows消息拦截技术的应用

Windows消息拦截技术的应用一、前言众所周知,Windows程式的运行是依靠发生的事件来驱动。
换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理。
处理完此次消息后又回到等待状态。
从上面对Windows 程式运行机制的分析不难发现,消息在用户与程式之间进行交流时起了一种中间“语言”的作用。
在程式中接收和处理消息的主角是窗口,它通过消息泵接收消息,再通过一个窗口过程对消息进行相应的处理。
消息拦截的实现是在窗口过程处理消息之前拦截到消息并做相关处理后再传送给原窗口过程。
通常情况下,程序员可以在窗口过程中处理接收到的消息,这就要求窗口过程必须在开发程序时完成,但是在一些应用中常常需要获取和处理另外应用程序或其它单元模块中的消息,实现此类功能的技术也就本文要讨论的主题――消息拦截技术。
二、理解Windows消息机制在深入探讨消息拦截技术实现原理之前,让我们先来温习一下Windows消息机制原理知识。
1、消息的产生消息作为程序与外界交流的“语言”,它的产生自然来自外界,但这里所说的外界,不只是简单的指程序之外或软件系统之外,而是泛指消息处理模块之外的模块、Windows系统、其它应用程序以及硬件等。
通常根据消息产生的方式将其分为两大类,即硬件消息和软件消息。
硬件消息,常指由硬件装置所产生的事件(如鼠标或键盘被按下),放在系统消息队列(System Queue)中,再由系统消息处理机构将消息发送给应用程序消息队列中。
软件消息,常指由Windows系统或其它应用程序发送的信息,它直接放入应用程序消息队列(Application Queue)中,再由应用程序消息处理机构将消息传递给相应的窗口。
2、消息的组成一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。
当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。
例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
苏曙光.软件学院.华中科技大学
10
苏曙光.软件学院.华中科技大学
11
例子2
苏曙光.软件学院.华中科技大学
12
打开附件中的“记事本”程序,使用Spy++小工具查找 “记事本”程序主窗口的标题名和窗口类名。
苏曙光.软件学院.华中科技大学
13
//函数参数意义(参数1: 窗口所属的类名; 参数2: 窗口的标题名;) h:=FindWindow('Notepad','无标题 - 记事本'); //查找"记事本"父窗口的句柄
Windows程序的特点 操作无序 事件驱动 以消息为中心
苏曙光.软件学院.华中科技大学
3
WINDOWS消息处理过程
苏曙光.软件学院.华中科技大学
4
队列消息 基本上是用户输入的结果
击键(如WM_KEYDOWN和WM_KEYUP消息) 击键产生的字(WM_CHAR) 鼠标移动(WM_MOUSEMOVE)和鼠标按钮
} WNDCLASS, *pWNDCLASS;
lpfnhlpWCszMnudernsPuoNrroamce 指改该向字鼠成符窗串标员口描指必述过菜针须程单的为的的资句一指源柄个名针。指。 针资源的句柄。如果 hCursor为NULL,应 用程序必须在指针移 入应用程序窗口时显 式设置指针类型。
hbrBackground 背景画刷的句柄。
)
苏曙光.软件学院.华中科技大学
22
//窗口过程 //参数:窗口句柄,消息,消息参数,消息参数 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { //处理感兴趣的消息 switch (message) { case WM_DESTROY: PostQuitMessage (0) ; return 0 ; case WM_ONCOMMAND//用户选择了菜单消息
{
//分析菜单项,作出不同处理
(WM_LBUTTONDOWN) 时钟消息(WM_TIMER) 更新消息(WM_PAINT) 退出消息(WM_QUIT)
苏曙光.软件学院.华中科技大学
5
非队列消息
在许多情况下,来自调用特定的Windows函数。 CreateWindow(WM_CREATE消息) ShowWindow(WM_SIZE和WM_SHOWWINDOW消息) UpdateWindow(WM_PAINT消息)
19
苏曙光.软件学院.华中科技大学
20
窗口类
typedef struct { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName;
函数返回值 如果查到该子窗口,则返回它的句柄。
苏曙光.软件学院.华中科技ቤተ መጻሕፍቲ ባይዱ学
9
向窗口发送消息
发送 sendmessage sendmessagecallback sendnotifymessage sendmessagetimeout
寄送 postmessage postthreadmessage postquitmessage
……
苏曙光.软件学院.华中科技大学
6
应用
在自己编写的程序中,通过向其它程序发送 Windows消息,从而达到控制该程序的目的
苏曙光.软件学院.华中科技大学
7
获取窗口句柄的的API函数
FindWindow 函数 通过指定应用程序顶层主窗口的类名和标题名, 返回它的句柄。
HWND FindWindow( LPCTSTR lpClassName, //窗口所属的类的名称 LPCTSTR lpWindowName ); //窗口的标题 函数返回值: 如果查到该窗口返回其句柄。
苏曙光.软件学院.华中科技大学
8
FindWindowEx 函数
查找指定应用程序顶层主窗口中的子窗口的句柄。 参数说明
HWND FindWindowEx( HWND hwndParent, //要找的子窗口所在父窗口的句柄 HWND hwndChildAfter, //子窗口的句柄 LPCTSTR lpszClass, //子窗口的类名 LPCTSTR lpszWindow ); //子窗口的标题名
注意:其中h为父窗口的句柄, 子窗口句柄为0表示搜索所有的子窗口,子窗口标题不知道就 使用nil。
苏曙光.软件学院.华中科技大学
16
双击“发送文本到记事本中”按钮,在生成的单击响应事 件过程中,编写代码:
苏曙光.软件学院.华中科技大学
17
苏曙光.软件学院.华中科技大学
18
苏曙光.软件学院.华中科技大学
苏曙光.软件学院.华中科技大学
14
使用Spy++工具查找“记事本”程序子窗口的标 题名和窗口类名。
苏曙光.软件学院.华中科技大学
15
//函数参数意义(参数1: 子窗口所在父窗口的句柄; 参数2: 子窗口的句柄;
//参数3:子窗口的标题名)
h1:=FindWindowEx(h,0,'Edit',nil); //查找"记事本"子窗口(文本框)的句柄
苏曙光.软件学院.华中科技大学
21
窗口过程
用窗口过程来分发和处理消息
窗口类登记的窗口过程
LRESULT CALLBACK MainWndProc (
HWND hwnd, // 窗口句柄
UINT msg,
// 消息标识
WPARAM wParam, //消息参数1
LPARAM lParam //消息参数2
先进软件开发技术与工具
第05讲 Windows消息机制及HOOK应用
苏曙光
Huazhong University of Science and Technology
内容 事件/消息驱动 HOOK机制
苏曙光.软件学院.华中科技大学
2
1. Windows事件驱动机制
DOS程序的特点 顺序驱动和过程驱动