0x00目的

通过编码了解钩子的实现原理和类型以及钩子的应用。本文中挂钩代码实现了在IE上监控IE浏览器的打开和获取键盘输入内容的功能。通过代码的演示功能,让读者知道如何防止windows操作系统上的钩子。

0x01所需知识

一个

吊钩技术简介

Hook是Windows消息处理机制的一个平台,应用程序可以在其上设置子进程来监控指定窗口中的某些消息,被监控的窗口可以由其他进程创建。当消息到达时,它在目标窗口处理函数之前被处理。挂钩机制允许应用程序拦截和处理窗口消息或特定事件。

钩子实际上是一个处理消息的程序段,通过系统调用挂入系统。每当发送特定的消息时,钩子子程在到达目的窗口之前捕获该消息,也就是说,钩子函数首先获得控制权。此时,钩子函数可以处理消息,继续传递消息而不进行处理,或者强制消息传递结束。

Windows有两种挂钩,一种是线程专用挂钩,另一种是系统级挂钩。特定的线程钩子只监视指定的线程,而全局系统钩子可以监视系统中的所有线程。无论是特定线程钩子还是全局系统钩子,钩子都是通过SetWindowsHookEx设置的。对于特定的线程钩子,钩子的功能可以包含在。请使用. exe或. dll。但是对于全局系统钩子,钩子函数必须包含在一个单独的dll中,所以当我们想要捕获键盘响应时,我们必须创建一个动态链接库。但是,当hook函数获得控制权并处理相关事件时,如果想要消息持续传输,就必须调用另一个函数:CallN。xtHookEx .由于系统必须处理每条消息,钩子程序增加了处理负担,降低了系统性能。鉴于此,windows ce不支持钩子程序。因此,当程序结束并退出时,应该释放钩子并调用函数UnhookWindowsHookEx。

2

钩子技术的实现

编写钩子程序有三个步骤:定义钩子函数、安装钩子、卸载钩子。

2.1定义挂钩功能

钩子函数是一种特殊的回调函数。钩子监控的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是不同的。以鼠标挂钩函数为例说明挂钩函数的原型:

LRESULT回调HookProc

参数wParam和lParam包含挂钩消息的信息,如鼠标位置、状态、键盘按键等。NCode包含有关消息本身的信息,例如是否移出消息队列。我们首先在hook函数中实现自定义函数,然后调用CallNextHookEx函数。将钩子信息传递给钩子链中的下一个钩子函数。CallNextHookEx。具有以下原型:

LRESULT callnexthookx

参数hhk是挂钩手柄。NCode、wParam、lParam都是钩子函数。当然,可以通过直接返回TRUE来丢弃消息,从而防止消息被传递。

2.2安装挂钩

程序初始化时,调用函数SetWindowsHookEx安装钩子。其功能的原型是:

HHOOK SetWindowsHookEx

参数idHook表示钩子类型,一一对应钩子函数类型。例如,WH _键盘表示安装了键盘挂钩,WH _鼠标表示安装了鼠标挂钩,以此类推。

Lpfn是钩子函数的地址。

HMod是钩子函数所在的实例的句柄。对于线程钩子,此参数为空;;对于系统钩子,这个参数是钩子函数所在的DLL句柄。

DwThreadId指定钩子监视的线程的线程号。对于全局钩子,该参数为空。

SetWindowsHookEx返回安装的钩子的句柄。

2.3卸载钩

当吊钩不再使用时,必须及时卸载。只需调用函数:

bool unhook windows hookex就够了。

通常把“钩子”做成动态链接库DLL,好处是可以在系统的每个进程中访问。你可以把DLL想象成一种仓库,提供一些可以直接使用的变量、函数、类。在DLL发展史上,经历了“无库-静态链接库-动态链接库”的时代。静态链接库和动态链接库都是共享代码的方式。如果使用静态链接库,不管你喜不喜欢,lib中的指令都会直接包含在最终生成的EXE文件中。但是如果使用了DLL,则不需要包含在最终的EXE文件中,并且这个独立于EXE的DLL文件可以在EXE文件执行时动态引用和卸载。静态链接库和动态链接库的另一个区别是,静态链接库不能再包含其他动态或静态链接库,而动态链接库也可以包含其他动态或静态链接库。

挂钩类型

3.1.按事件分类

有以下几种常见类型

7、WH _记者记录钩

WH日志记录钩子用于监视和记录输入事件。通常,这个钩子可以用来记录连续的鼠标和键盘事件,然后使用WH _日志回放钩子来回放它们。WH日志记录钩子是一个全局钩子,它不能像线程特定的钩子一样使用。WH_JOURNALRECORD是一个全系统的本地钩子,不会在任何旅行地址空之间注入。

8、WH _键盘钩

在一个应用程序中,WH _键盘钩子用于监视WM_KEYDOWN和WM_KEYUP消息,这些消息通过getmessage或peekmessage函数返回。您可以使用此钩子来监视输入到消息队列中的键盘消息。

9、WH _键盘_LL钩

WH键盘钩监控输入线程消息队列的键盘消息。

10、WH _鼠标挂钩

WH鼠标挂钩监控从GetMessage或PeekMessage函数返回的鼠标消息。使用此挂钩监控输入消息队列的鼠标消息。

11、WH _鼠标_LL钩

WH鼠标钩监控进入线程消息队列的鼠标消息。

12.WH _微软过滤器和WH _微软过滤器挂钩

WH_MSGFILTER和WH _ SYMSGFILTER钩子使我们能够监控菜单、滚动条、消息框和对话框消息,并发现用户使用ALT+TAB或ALT+ESC来切换窗口。WH_MSGFILTER钩子只能监视传递到菜单、滚动条和消息框的消息,以及传递到由安装了钩子子进程的应用程序创建的对话框的消息。WH_SYSMSGFILTER钩子监控所有应用程序消息。WH_MSGFILTER和WH _ SYMSGFILTER钩子使我们能够在模式循环期间过滤消息,这相当于在主消息循环中过滤消息。WH_MSGFILTER钩子可以通过调用CallMsgFilter函数直接调用。通过使用该函数,应用程序可以在模式循环期间使用与主消息循环中相同的代码来过滤消息。

13、WH _壳牌吊钩

Shell应用程序可以使用WH_SHELL钩子来接收重要的通知。当外壳应用程序处于活动状态,顶层窗口被创建或破坏时,系统调用WH _外壳钩子子例程。

WH壳牌总共有5分钟:

只要一个顶层的、无人值守的窗口被生成、工作或破坏;

任务栏需要重画按钮时;

当系统需要显示关于任务栏的程序的最小化形式时;

当前键盘布局状态改变时;

当用户按Ctrl+Esc执行任务管理器时。

传统上,shell应用程序不接收WH_SHELL消息。因此,在应用程序能够接收到WH_SHELL消息之前,应用程序必须调用SystemParametersInfo函数来注册自己。

以上是13种常用的挂钩类型!

3.2根据使用范围分类

主要有线钩和系统钩:

以上函数初始化二维数组,为后面的键盘输入做准备。

卸载功能比较简单,卸载两个挂钩功能。接下来实现两个重要功能,即键盘挂钩处理功能和窗口消息处理功能。首先,看窗口消息处理功能

转到c盘根目录查看生成文本中的信息,如下

如您所见,获得了用户的输入。如果测试时输入太多,下一次会写文本,主要看代码中2D数组的定义。

这个代码会在IE浏览器打开时监控输入,所以即使没有网络也可以测试,比如如下:

0x04:面临的问题

在使用钩子技术的时候,我们会面临一些实际的问题,比如试图在第三方的流程中注入一个钩子,结果证明是这样的。或者挂钩监听事件失败,主要是执行进程权限不足。在编码演示过程中,你会发现调试模式下成功率很高,而Release版本则会出现失败。主要问题是调试模式是debug模式,允许用户有更高的权限,而release模式是Release模式,在debug模式下没有高权限。

针对这个问题,给出了两种常用的方法。一种是执行程序,根据实际环境中的某个漏洞,提取权利。这种方法通常针对某些CVE漏洞,根据漏洞获取系统权限。这里涉及到一些CVE漏洞,因此不再赘述。

另一种方法来自《windows Core Programming》一书,书中给出了一个代码赋权的例子。代码如下:

0x05摘要

这次我讲解了钩子技术在windows安全中的应用。希望读者可以在自己的环境中演示,禁止使用这些技术做违法的事情。所以读者对自己危害网络安全的行为负责,与和田志辉和我本人无关。我在此声明!

和田微信官方账号开始原创投稿!!!

大家都有不错的技术原创文章。

重奖|和田原创贡献奖来了!

1.《钩子 浅谈钩子技术在windows 操作系统上的安全应用》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《钩子 浅谈钩子技术在windows 操作系统上的安全应用》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/shehui/1679230.html