HOOK教程一_使用SetWindowsHookEx进行Windows消息HOOK
第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); //取目标窗口标题
setwindowshookex函数易语言用法 -回复

setwindowshookex函数易语言用法-回复setwindowshookex函数是Windows操作系统提供的一个强大的函数,可用于在系统级别捕获和处理各种窗口相关事件,如鼠标点击、键盘输入、窗口创建和关闭等。
本文将详细介绍setwindowshookex函数的易语言用法,以帮助读者更好地理解和应用这一函数。
第一步:了解setwindowshookex函数的基本概念和作用。
setwindowshookex函数是Windows操作系统中的一种钩子函数,可以用于实现窗口操作的全局监控和拦截。
通常,我们需要在一个宿主程序中使用这个函数,并指定一个回调函数,当特定事件发生时,系统将调用这个回调函数,并将相关的信息传递给它,从而我们可以在回调函数中对这些事件进行处理。
第二步:明确setwindowshookex函数的参数和返回值。
在使用setwindowshookex函数之前,我们需要了解它的参数和返回值,这样才能正确地调用和处理。
下面是setwindowshookex函数的声明和参数说明:int setwindowshookex(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId);其中,idHook参数指定了钩子的类型,lpfn参数是一个指向回调函数的指针,hmod参数是宿主程序的实例句柄,dwThreadId参数用于指定钩子线程的ID。
setwindowshookex函数的返回值是一个类型为HHOOK的句柄,它用于标识钩子的实例,我们可以使用这个句柄来更新或移除钩子。
第三步:创建回调函数。
回调函数是setwindowshookex函数的核心部分,它会在特定事件发生时被调用。
在易语言中,我们可以通过声明一个带有特定参数和返回值的函数来实现回调函数。
下面是一个简单的回调函数示例:proc MyCallbackProc(nCode: integer, wParam: integer, lParam: integer) : integer;begin在这里处理事件,如判断鼠标点击的位置,或者拦截并修改键盘输入end;在这个示例中,MyCallbackProc是我们自定义的回调函数,它接受三个参数:nCode用于指示事件类型,wParam和lParam用于传递事件相关的信息。
setwindowshookex函数易语言用法 -回复

setwindowshookex函数易语言用法-回复setwindowshookex函数是Windows操作系统提供的一种函数,用于在系统级别进行钩子操作。
本文将介绍setwindowshookex函数在易语言中的用法,并一步一步回答相关问题。
首先,我们需要了解setwindowshookex函数的基本概念和作用。
setwindowshookex函数起到的作用是安装一个钩子函数,用于监视或拦截特定类型的事件。
它可以用于拦截全局事件,例如鼠标和键盘事件。
在易语言中,我们可以使用winapi插件来调用Windows操作系统提供的API函数,包括setwindowshookex函数。
接下来,我们将一步一步回答以下问题:问题1:如何使用winapi插件在易语言中调用setwindowshookex函数?在易语言中,我们可以使用winapi插件来调用setwindowshookex函数。
首先,我们需要导入winapi插件:use winapi然后,在需要使用setwindowshookex函数的地方,我们可以直接调用它,例如:ret = setwindowshookex(...)需要注意的是,函数的返回值ret表示函数执行的结果,我们可以根据ret 的值来判断函数是否执行成功。
问题2:setwindowshookex函数的参数是什么意思?setwindowshookex函数有三个参数,分别是hhook、lpfn、hmod和dwthreadid。
- hhook:表示一个钩子标识符,用于标识安装的钩子。
- lpfn:表示一个指向钩子函数的指针,该函数会在特定事件发生时被调用。
- hmod:表示一个模块句柄,用于指定钩子函数所在的模块。
通常可以使用0来表示当前进程。
- dwthreadid:表示一个线程标识符,用于指定钩子函数被安装的线程。
可以使用0来表示所有线程。
问题3:如何编写一个钩子函数?在使用setwindowshookex函数之前,我们需要编写一个钩子函数来处理特定事件。
VB外挂之HOOK技术的最详细教程

vb外挂之HOOK技术终极详细解说By:史上最大小强很多学习vb的人都想学习外挂及hook,我在网上也找到了一段程序,后台键盘记录外挂,其实网上大多数流传的HOOK代码都跟这段代码几乎一个出处。
网上有关于这些代码的解释,但是关键部分根本就没解释,等于没说。
下面的程序解释得很详细。
有的地方全属个人看法,不过还是值得一看。
不对的地方欢迎大家指出。
当然,高手勿笑。
好吧,正式我们的hook学习。
Hook并不神秘,它说到底就是通过调用API函数在消息队列中安装钩子,实现截获消息,处理消息的功能。
在这里,我浅浅的讲讲windows的消息机制。
比如,我们按键盘的某个键时,系统就会生成一个消息到系统的消息队列,系统再发送到应用程序消息队列中,windows有不同的消息队列。
对于键盘钩子,是安装在系统的消息队列中。
看程序:(以下程序在模块中,呵呵,工程-----添加模块)Option Explicit ‘强制性变量声明,不允许出现未声明的变量。
呵呵,都懂!!Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer‘Getkeystate是api函数,顾名思义,获取某个键的状态,参数nvirtkey就是某个键的虚拟键键码,不同的系统虚拟键码不同。
比如vbkeycontrol或者vbkeyshift就可以作为参数。
返回值是16位的,如开关键打开,则位0设为1(开关键包括CapsLock,NumLock,ScrollLock);如某个键当时正处于按下状态,则位15为1;如已经抬起,则为0。
数据在储存器中,最高位为1时是负数,为0时是正数。
Public 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‘Setwindowshookex,就是建立钩子的函数,最主要的的函数。
SetWindowsHookEx 安装钩子详解

WH_KEYBOARD_LL(13):此挂钩只能wLevelKeyboardProc挂钩处理过程.
WH_MOUSE_LL(14):此挂钩只能在Windows NT中被安装,用来对底层的鼠标输入事件进行监视.详情参见LowLevelMouseProc挂钩处理过程.
参数:
idHook:指示欲被安装的挂钩处理过程之类型,此参数可以是以下值之一:
WH_MSGFILTER(-1):安装一个挂钩处理过程, 以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.详情参见MessageProc挂钩处理过程.
WH_JOURNALRECORD(0):安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRecordProc挂钩处理过程.
MSGF_DIALOGBOX: 输入事件由一个消息框或者对话框产生.
MSGF_MENU: 输入事件由一个菜单条产生.
MSGF_SCROLLBAR: 输入事件由一个滚动条产生.
MSGF_NEXTWINDOW: 输入事件由于用户摁下组合键<Alt+Tab>以激活另一个窗口而产生.
若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数 CallNextHookEx 并返回其返回值.
WH_SHELL(10):安装一个挂钩处理过程以接受对外壳应用程序有用的通知, 详情参见 ShellProc挂钩处理过程.
WH_FOREGROUNDIDLE(11):安装一个挂钩处理过程,该挂钩处理过程当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务.
WH_CALLWNDPROCRET(12) :安装一个挂钩处理过程,它对已被目标窗口处理过程处理过了的消息进行监视,详情参见 CallWndRetProc 挂钩处理过程.
setwindowshookex wh_getmessage 句柄-概述说明以及解释

setwindowshookex wh_getmessage 句柄-概述说明以及解释1.引言1.1 概述setwindowshookex函数是Windows操作系统提供的一个强大的钩子函数,可以用来监视和拦截特定的事件和消息。
而WH_GETMESSAGE 钩子是setwindowshookex函数中的一种类型,可以监视并拦截消息在消息队列发送到线程的过程中。
本文将详细介绍setwindowshookex函数和WH_GETMESSAGE钩子的原理和用法,以及使用setwindowshookex和WH_GETMESSAGE 时需要注意的事项。
通过本文的阐述,读者将能够更好地理解这两个重要的概念,并学会如何有效地利用它们来实现一些高级的Windows应用程序功能。
文章结构部分内容如下:1.2 文章结构本文将首先介绍setwindowshookex函数的作用和用法,包括其参数和返回值等相关信息。
接着将详细讲解WH_GETMESSAGE钩子的使用方法和原理,以及该钩子在Windows编程中的重要性。
最后,将结合具体实例和注意事项,探讨在实际开发过程中如何正确地使用setwindowshookex和WH_GETMESSAGE,并指出一些常见的注意事项和解决方法。
通过本文的阐述,读者将能够深入了解setwindowshookex 和WH_GETMESSAGE的作用及使用技巧,从而提高自身在Windows编程领域的技能水平。
1.3 目的本文的目的是介绍setwindowshookex函数和WH_GETMESSAGE 钩子的概念、功能和使用方法,帮助读者更好地理解这两个重要的Windows API,在开发Windows应用程序时能够灵活运用这些函数,实现特定的功能和监控消息的处理过程。
通过深入探讨setwindowshookex 和WH_GETMESSAGE的原理和实践,读者可以加深对Windows系统消息处理机制的理解,提升自己在Windows编程领域的技术水平。
WinCE系统鼠标键盘钩子使用方法

3/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
添加 Beep 函数,通过 GPIO 句柄操作 GPIO15。 void Beep() {
创建需要挂入系统的消息处理函数 即钩子函数,钩子函数定义必须为制定的格式。 钩子函数根据实际应用需求,决定是否调用 CallNextHookEx,将消息传递给后面的钩子处理。 首位的钩子函数返回值决定该消息是丢弃,还是传给系统消息处理函数,再分发给各窗口。 以下为键盘及鼠标钩子函数的示例。
键盘钩子函数
1/5
成都英创信息技术有限公司
WinCE 系统鼠标键盘钩子使用方法
使用钩子需要用到函数,SetWindowsHookEx,UnhookWindowsHookEx,CallNextHookEx。 及键盘钩子鼠标钩子的定义,及键盘消息,鼠标消息的结构体定义,均定义在 pwinuser.h 中。
#include "pwinuser.h"
该键盘钩子示例函数中,当检测到按键‘1’按下时,调用 Beep 函数触发蜂鸣器。
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
这时,可以使用键盘鼠标钩子来实现这些功能。
钩子是 WINDOWS/WINCE 系统独有的消息处理机制。通过系统调用,将消息处理程序段挂入系统, 获得消息处理优先控制权,在消息达到目的窗口前进行处理。钩子函数可以通过判断决定是否加工处理 (改变)消息,或不做处理继续传递各消息,或强制结束消息传递。
Windows下APIHook技术

Windows下APIHook技术1 前⾔在Micrisoft Windows中,每个进程都有⾃⼰的私有地址空间。
当我们⽤指针来引⽤内存的时候,指针的值表⽰的是进程⾃⼰的⾃制空间的⼀个内存地址。
进程不能创建⼀个指针来引⽤属于其他进程的内存。
独⽴的地址控件对开发⼈员和⽤户来说都是⾮常有利的。
对开发⼈员来说,系统更有可能捕获错误的内存读\写。
对⽤户⽽⾔,操作系统变得更加健壮。
当然这样的健壮性也是要付出代价的,因为它使我们很难编写能够与其他进程通信的应⽤程序或对其他进程进⾏操控的应⽤程序。
在《Windows 核⼼编程》第⼆⼗⼆章《DLL注⼊和API拦截》中讲解了多种机制,他们可以将⼀个DLL注⼊到另⼀个进程地址的空间中。
⼀旦DLL代码进⼊另⼀个地址空间,那么我们就可以在那个进程中随⼼所欲了。
本⽂主要介绍了如何实现替换Windows上的API函数,实现Windows API HOOK。
API HOOK的实现⽅法⼤概不下五六种。
本位主要介绍了其中的⼀种,即如何使⽤WIndows挂钩来注⼊DLL。
2 使⽤Windows挂钩来注⼊DLL2.1 简单windows消息HOOK2.1.1 SetWindowsHookEx这个是安装狗⼦的函数声明如下:HHOOK WINAPI SetWindowsHookEx(__in int idHook, \\钩⼦类型__in HOOKPROC lpfn, \\回调函数地址__in HINSTANCE hMod, \\实例句柄__in DWORD dwThreadId); \\线程ID,0表⽰所有让我们通过⼀个例⼦来学些下这个API。
进程A(⼀个游戏改建⼯具,需要接获键盘消息),安装了WH_KEYBOARD_LL挂钩,如下所⽰:HOOK hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstDll, 0); 第⼀个参数表⽰挂钩类型,是⼀个低级键盘钩⼦。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于 Hook·使用 SetWindowsHookEx 进行消息 HOOK 一、基本概念:
钩子(Hook), 是 Windows 消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗 口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函 数之前处理它。钩子机制允许应用程序截获处理 window 消息或特定事件。 钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出, 在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数 即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传 递。
4、系统钩子与线程钩子:
SetWindowsHookEx()函数的最后一个参数决定了此钩子是系统钩子还是线程钩子。 线程勾子用于监视指定线程的事件消息。 线程勾子一般在当前线程或者当前线程派生的线程内。 系统勾子监视系统中的所有线程的事件消息。因为系统勾子会影响系统中所有的应用程序,所 以勾子函数必须放在独立的动态链接库 (DLL) 中。系统自动将包含 "钩子回调函数"的 DLL 映射到 受钩子函数影响的所有进程的地址空间中,即将这个 DLL 注入了那些进程。 几点说明: (1)如果对于同一事件(如鼠标消息)既安装了线程勾子又安装了系统勾子,那么系统会自动先 调用线程勾子,然后调用系统勾子。 (2)对同一事件消息可安装多个勾子处理过程,这些勾子处理过程形成了勾子链。当前勾子处理 结束后应把勾子信息传递给下一个勾子函数。 (3)勾子特别是系统勾子会消耗消息处理时间,降低系统性能。只有在必要的时候才安装勾子, 在使用完毕后要及时卸载。
南邮王下邀月熊_HOOK 学习笔记之 Windows 消息 HOOK
装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果。 钩子在使用完之后需要用 UnHookWindowsHookEx()卸载, 否则会造成麻烦。 释放钩子比较简单, UnHookWindowsHookEx()只有一个参数。函数原型如下: UnHookWindowsHookEx ( HHOOK hhk; ); 函数成功返回 TRUE,否则返回 FALSE。
3、实例:
#pragma data_seg("mydata") HHOOK hook=NULL; //安装的鼠标勾子句柄 #pragma data_seg() #pragma comment(linker,"/SECTION:mydata,RWS") extern "C" _declspec (dllexport) bool SetHook() { hook=SetWindowsHookEx(WH_SHELL,ShellProc,glhInstance,0); if(NULL==hook) { ::MessageBox(NULL,"SetWindowsHookEx!","Error!",MB_ICONERROR); return false; } ::MessageBox(NULL,"注册表实时监控开启成功!","通知",MB_OK); return true; } extern "C" _declspec (dllexport) bool UnSetHook() { bool ret=false; if(hook) { ret=UnhookWindowsHookEx(hook); if(!ret) { ::MessageBox(NULL,"UnhookWindowsHookEx!","Error!",MB_ICONERROR); return false; } return true; } return false;
南邮王下邀月熊_HOOK 学习笔记之 Windows 消息 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。 // 可以很简单的设定其为本应用程序的实例句柄。可以使用 AfxGetInstanceHandle()获取当 //前句柄 DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。 // 如果为 0,钩子子程与所有的线程关联,即为全局钩子。 ); 函数成功则返回钩子子程的句柄,失败返回 NULL。 以上所说的钩子子程与线程相关联是指在一钩子链表中发给该线程的消息同时发送给钩子子 程,且被钩子子程先处理。 在钩子子程中调用得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递, 那么它必须调用另外一个 SDK 中的 API 函数 CallNextHookEx 来传递它,以执行钩子链表所指的 下一个钩子子程。这个函数成功时返回钩子链中下一个钩子过程的返回值,返回值的类型依赖于 钩子的类型。这个函数的原型如下: LRESULT CallNextHookEx ( HHOOK hhk; int nCode; WPARAM wParam; LPARAM lParam; ); hhk 为当前钩子的句柄,由 SetWindowsHookEx()函数返回。 NCode 为传给钩子过程的事件代码。 wParam 和 lParam 分别是传给钩子子程的 wParam 值,其具体含义与钩子类型有关。 钩子函数也可以通过直接返回 TRUE 来丢弃该消息,并阻止该消息的传递。否则的话,其他安
南邮王下邀月熊_HOOK 学习笔记之 Windows 消息 HOOK
} LRESULT CALLBACK ShellProc(int nCode, WPARAM wParam,LPARAM lParam) { if(nCode==HSHELL_WINDOWCREATED) // HOOK 的目的只在于映射进 DLL,这里后 面的处理也可以, { PID=GetCurrentProcessId(); // 但是这里只做 API 注入,就不用了 hProcess = OpenProcess(PROCESS_ALL_ACCESS,0, PID); Init(); Inject(); } return CallNextHookEx(hook,nCode,wParam,lPara表和钩子子程:
每一个 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 代码,但是它们的典型值是包含了关于发送或者接收消息 的信息。
三、钩子类型
每一种类型的 Hook 可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可 以利用的 Hook 类型。 1、WH_CALLWNDPROC 和 WH_CALLWNDPROCRET Hooks WH_CALLWNDPROC 和 WH_CALLWNDPROCRET Hooks 使你可以监视发送到窗口过程的消 息。系统在消息发送到接收窗口过程之前调用 WH_CALLWNDPROC Hook 子程,并且在窗口过程 处理完消息之后调用 WH_CALLWNDPROCRET Hook 子程。 WH_CALLWNDPROCRET Hook 传递指针到 CWPRETSTRUCT 结构,再传递到 Hook 子程。 CWPRETSTRUCT 结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联