常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战.
更新时间:2026-02-16 10:01:19
常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战.
常见注入技术第四讲:setwindowshookex全局钩子注入,以及在32位qq上的实战操作。
PS: 以上是操作部分,接下来是原理介绍。
一丶需要了解的API 使用全局钩子注入,我们需要了解几个Windows API。这些API并不复杂。
- 设置钩子API
在Windows操作系统中,通过使用SetWindowsHookEx API函数可以实现安装或取消特定类型的钩子(如监视窗口过程或消息队列)。此API参数如下: - `int idHook`:指定所要设置的钩子类型,它可以是模拟窗口过程或消息队列监控。 - `HOOKPROC lpfn`:根据钩子类型的参数,需要提供不同的回调函数接口。 - `HINSTANCE hMod`:指定用于创建该DLL实例的句柄,即钩子所对应的动态链接库(DLL)的句柄。 - `DWORD dwThreadId`:设置挂钩的目标线程ID。若为零,则使用全局钩子。调用SetWindowsHookEx API会返回一个钩子过程句柄,该句柄可以被用于以后执行其他与该钩子相关的操作。
- 获取模块句柄API
```c++ HMODULE WINAPI GetModuleHandle(_In_opt_ LPCTSTR lpModuleName) { // 获取指定模块的实例句柄 return (HMODULE) // 示例代码,实际应用中需替换为具体实现 // 当前进程当前DLL或EXE实例句柄 } ```
- 取消设置钩子API
BOOL WINAPI UnhookWindowsHookEx( _In_ HHOOK hhk 参数一是 SetWindowHookEx的返回值,即钩子过程句柄。); 返回值: 返回值是BOOL类型,表示设置是否成功或失败。登录后复制
- 继续调用钩子链中的钩子过程。
在Windows系统中,`CallNextHookEx`函数是用于执行高级用户自定义钩子处理过程的。它接受三个参数: `_In_opt_ HHOOK hhk`:表示保存的钩子过程,即由`SetWindowsHookEx`函数返回的值。 `_In_ int nCode`:根据`SetWindowsHookEx`设置的钩子回调产生的不同nCode代码。例如,如果是鼠标消息,则nCode是鼠标消息;如果是键盘消息,则nCode是键盘消息。 `_In_ WPARAM wParam`和`_In_ LPARAM lParam`:附加参数,分别根据钩子回调类型有不同的意义。比如,如果是鼠标消息,可能会代表鼠标的x位置;如果是键盘消息,则可能是键代码。在Windows操作系统中,当用户点击特定窗口时,可以设置高级自定义处理程序来控制这些操作的详细行为。通过调用`CallNextHookEx`函数,您可以实现这一功能,并根据需要对钩子回调产生的数据进行解析和处理。
- 钩子回调
钩子回调由SetWindowsHookEx的第一参数指定。如设WH_CBT,则为CBT回调。详情参阅MSDN。

LRESULT CALLBACK CBTProc( _In_ int nCode, _In_ WPARAM wParam, _In_ LPARAM lParam);登录后复制
二丶全局钩子注入步骤 从上面的几个API来看,注入过程并不复杂。以下是注入的具体步骤:
- 调用SetWindowsHookEx设置钩子。
- 在设置过程中,需要一个回调,所以我们填入一个回调。
在回调函数中调用CallNextHookEx函数是一种常见的编程技巧。如果未使用此函数,则意味着你设置了一个钩子而没有撤销它,这可能导致程序出错。这种做法实际上是在按需返回结果。
- 取消钩子设置。
步骤就四步。那么我们开始:
1.建立DLL工程。可以使用VC++6.0或VS系列。这里不再赘述,建立DLL工程很简单,如果不会,可以在网络上搜索。
- 工程中添加一个HOOK.h的头文件,以及一个HOOK.cpp的实现文件。
- 编写代码。
HOOK.h中的代码:
#pragma once #define MYWINDAPIEXPORT __declspec(dllexport) HHOOK g_HookProc; //定义为全局HOOK,返回钩子过程 void MYWINDAPIEXPORT SetHook; //设置HOOK钩子。我们的启动函数,导出函数,外部设置HOOK void MYWINDAPIEXPORT UnHook; //取消设置HOOK LRESULT CALLBACK MyProc(int nCode, WPARAM wParam, LPARAM lParam); //设置HOOK过程中需要的回调函数 登录后复制
HOOK.cpp的代码:
#include
上面的.h + .cpp就是我们的代码实现,还需外程调用Export和Inport方法。
因为SetHook和UnHOOK导出函数是在DLL中使用的,所以我们想要使用这两个函数有两种方法:
使用静态调用,只需在项目中加入.h文件及对应.lib,即可实现高效代码加载。
动态加载库文件时,使用LoadLibrary和GetProcAddress这两个API,前者用于获得DLL的实例句柄,后者则从实例句柄中寻找到指定函数的地址,实质上就是得到该函数的“入口”函数指针。
这里推荐一种新方法。如果你选择另一种方法,同样可行。不过,为了保证函数名称的一致性,你的代码必须包含extern C声明以确保外联的准确性和一致性。此外,在编写接口时,请记得使用GetProcAddress填充函数名,这将有助于你成功地获取到所需的函数指针。
新建MFC工程:
- 添加HOOK.h头文件。
- 使用宏命令包含我们的DLL的lib #pragma comment(lib,"xxxx.lib")
- 在Hook按钮点击位置调用导出函数SetHOOK。
- 在UnHOOK按钮点击位置,调用导出函数UnHOOK。
- 界面:

- 我们原有的HOOK.H文件。

- 静态使用的lib库。

- 按钮点击里面的函数调用。

- 使用工具查看是否注入了DLL,推荐使用Pchunter工具。

可以看到已经注入了。
由于我们编写的是的DLL文件,因此在注入时所使用的代码必须是;如果使用的是的DLL文件,则需注入对应的版本程序。详细信息可参阅MSDN中的SetWindowsHookEx。
三丶原理讲解 上面讲了这么多操作,原理应该不是太懂。
实际上,SetWindowsHookEx在应用程序执行时为我们增加了额外的一层保护,通过提供回调地址,可以确保及时处理可能出现的操作。此时,我们可以选择性地进行事件处理。
比如:
A函数 -> B函数 -> C函数。正常执行流程是A函数调用B,B调用C。
而我们添加了一层:
A -> 我们(利用CallNextHookEx决定是否调用下一个过程) -> B -> C
A -> 我们(不是的情况下) 不调用B。
DLL怎么注入的疑问?
上图我们写了这么多,并没有针对QQ或者其他32位程序注入DLL。为什么会注入了DLL。
原理:
原理如下:我们的窗口程序通过调用DLL中的SetWindowsHookEx函数来注册一个钩子。这项功能使我们能够对整个系统的任何程序发出响应。具体来说,如果应用程序被触发了某个回调,我们的DLL将自动加载并插入到其内部。这样一来,我们可以利用这个HOOK机制在需要的位置注入DLL模块。
以上就是常见注入手法第四讲,SetWindowsHookEx全局钩子注入.以及注入QQ32位实战.的详细内容,更多请关注其它相关文章!
