做一个检测钩子程序的工具

PCHunter:Windows钩子检测与系统安全工具 PCHunter是一款在Windows平台下广泛使用的系统优化与调试工具。它能深入到操作系统的底层,为用户提供系统的实时运行状态,以及对进程、模块、服务、句柄、系统信息等多方面的详细查看和分析。系统安全是指保护计算机系统不受威胁、破坏和未经授权的访问。这涉及到保护系统不受恶意软件(例如病毒、木马、间谍软件)的侵害,确保数据的机密性、完整性和可用性。系统安全的重要性在于,它是维护个人隐私、企业信息资产安全以及国家安全的基石。 阅读详情

一、引言

    Windows系统是建立在事件驱动的机制上的,每一个事件就是一个消息,每个运行中的程序,也就是所谓的进程,都维护者一个或多个消息队列,消息队列的个数取决于进程内包含的线程的个数。由于一个进程至少要拥有一个线程,所以进程至少要有一个消息队列。虽然Windows系统的消息分派是以线程为单位的,但并不是所有的线程都有消息队列,一个新创建的线程是没有消息队列的,只有当线程第一次调用GDI或USER32库函数的时候Windows才为线程创建消息队列。消息最终由属于线程的窗口来处理,普通的应用程序只能获取本线程的消息队列中的消息,也就是只能获得系统分派的、属于本线程的消息,换句话说,一个线程在运行过程中是不知道其它线程发生了什么事情的。但是有一类特殊的程序却可以访问其他线程的消息队列,那就是钩子程序。
    编写钩子程序是Windows系统提供给用户的一种对Windows运行过程进行干预的机制,通过钩子程序,Windows将内部流动的消息暴露给用户,使用户能够在消息被窗口管理器分派之前对其进行特殊的处理,比如在调试程序的时候跟踪消息流程。但是,任何事情都有其两面性,一些密码窃取工具就是利用系统键盘钩子截获其他程序的键盘消息,从而获取用户输入的密码,可见非法的钩子程序对计算机信息安全具有极大的危害性。本文针对钩子程序安装和运行的特点,设计了一种检测系统中安装的钩子程序的方案,并开发了一个检测钩子程序的开源软件AntiHook。

二、钩子检测的原理

    在开始分析钩子检测的原理之前先要了解一下钩子程序。Windows系统的钩子程序根据作用范围可以分为两类:一类是只能获取本进程内某个线程消息的局部钩子(Thread Local Hook),另一类是可以获取当前系统中所有线程消息的全局钩子(Global Hook 或 System Hook)。局部钩子可以既可以位于线程相关的exe可执行文件中,也可以位于dll动态链接库中,全局钩子则只能是DLL动态链接库的形式,这是由全局钩子的加载方式所决定的,本文稍后将详细介绍原因。钩子程序根据定义方式与实现目的又可分为键盘钩子、鼠标钩子、系统Shell钩子以及消息过滤钩子等类型,查阅MSDN中关于SetWindowsHookEx()函数的说明可以了解这些不同类型钩子的详细信息。
    对于局部钩子来说,它所能够访问到的消息仅限于它所在的进程中的消息队列,在安装钩子的时候还要指名是要截取哪个线程的消息。与之相对应的全局钩子则没有范围的限制,它可以截取整个桌面环境下所有线程中的消息,用来窃取密码的键盘钩子通常就是将自己安装成全局钩子。安装局部钩子和全局钩子使用的是同一个API函数:SetWindowsHookEx(),只是传递的参数不同,关于这个API函数的用法不是本文的重点,此处就不详细介绍了,对钩子程序感兴趣的朋友可以参考MSDN或其它相关文档。
    一般来讲,应用程序安装的局部线程钩子对其他程序没有影响,而危害比较大的是全局钩子,因为只有全局钩子有能力“染指”其它程序的消息队列,系统的安全检测也以检测全局钩子为主要目的。全局钩子检测的原理其实也非常简单,这是由Windows操作系统加载全局钩子的方式所决定的,所以我们先来了解一下全局钩子的加载方式。
    32位的Windows程序都是运行在保护模式,每一个进程都有独立的进程空间,进程之间不能直接共享内存地址,也就是说,进程之间的资源是严格受保护的,一个进程不能直接访问另一个进程中的资源,当然也包括消息队列。既然Windows保护的如此严格,钩子程序又是如何做到这一点呢,难道它能够凌驾于操作系统之上?当然不是,钩子程序和普通的Windows应用程序一样只能运行在Ring3安全级别上,它的诡秘之处在于Windows对钩子程序的加载方式。当钩子安装程序调用SetWindowsHookEx()函数在系统中安装一个全局钩子后,Windows对钩子程序做的特殊处理就是将其加载到每个应用程序单独的进程空间中。也就是说,系统中每一个程序(包括系统程序)的进程空间中都被Windows“强行”挂接了一个钩子程序(模块)的副本,这就使钩子模块和其它倚赖模块一样运行在这个程序的进程空间之中,如此一来钩子程序就能够访问这个进程中所有线程的消息队列了。图 1 就是Windows加载全局钩子的示意图:
    

图 1 全局钩子加载示意图

本文前面提到,全局钩子必须做成DLL动态链接库的形式,这里就解释了原因--因为全局钩子不是独立运行的程序,它是作为其它程序的一部分被加载运行的。原理就是如此的简单,当一个全局钩子安装后,系统中运行的每个进程都被强行加载了一个钩子程序的模块,这就为检测钩子提供了一个思路,那就是检测程序作为系统中运行的普通程序也会被强行加载钩子模块,只要钩子检测程序能够发现自己进程空间中被强行加载的不明模块,就可以怀疑系统中运行有钩子程序。
    现在的问题是如何使钩子检测程序能够发现加载到自己进程空间中的不明模块。使用API HOOK介入模块的运行,直接分析二进制代码可能是最直接、最有效的方法,但是且不说这种方法容易破坏系统运行的稳定性,单就二进制代码的逻辑分析就不是少量代码能够实现的。那么有没有简单一点的方法呢?其实,绕开这些技术层面上的问题的纠缠,还有更简单的方法能够检测不明模块,那就是“模块比较法”。和普通的Windows应用程序一样,钩子检测程序运行时也需要很多系统模块的支持,这些模块是运行钩子检测程序所必须的,也被认为是安全的模块。而被Windows “强行”加载的钩子模块则不是钩子检测程序运行必须的模块,所以被认为是不明模块。钩子检测程序一旦编译完成,就已经决定了它在运行中需要哪些支持模块,有一点需要注意,那就是模块的名称和数量在Windows 95/98/Me系统下和基于Windows NT技术构建的Windows 2000/XP系统下有很大的不同,但是对于特定的Windows 版本来说是一定的,这也是“模块比较法”的主要理论依据。“模块比较法”的原理就是定期查看钩子检测程序进程中加载的模块列表,将这个列表与安全模块列表做对比,检查是否有不属于安全模块的不明模块被加载到检测程序的进程空间中,如果发现不明模块就发出告警,提示用户作出相应的处理。剩下的问题就是创建安全模块列表并将其保存到程序配置文件中,利用Depends工具或进程模块查看工具可以很容易地获取钩子检测程序所必须的支持模块(安全模块),唯一需要注意的是要在一个“干净”的Windows 系统上执行这些操作。
    似乎可以大功告成了,且慢,好像还有什么问题?对了,那就是钩子模块被加载到进程中的时机问题。并不是所有类型的全局钩子都会立即被Windows加载到其它进程中,根据Windows的调度策略,有一些类型的钩子安装以后立即就会被Windows加载到其它进程中开始运行,比如WH_SHELL和WH_SYSMSGFILTER类型的钩子,而WH_KEYBOARD和WH_MOUSE类型的钩子则不会立即加载,这种类型的钩子是有条件加载的,或者称之为“延时加载”。比如,WH_KEYBOARD类型的钩子只在进程第一次接收到键盘消息的时候才会被加载到进程中,而WH_MOUSE则只在进程有鼠标消息的时候才会被加载到进程中。对于这种类型的全局钩子,如果检测程序只是在后台运行,没有任何键盘或鼠标操作,Windows就不会将其加载到检测程序进程中,检测程序也就不能发现这种类型的钩子,所以对这种类型的钩子程序要特殊处理。笔者在AntiHook的开发过程中发现,只有真正地操作键和鼠标,通过硬件中断产生的键盘和鼠标事件才能促使Windows 向接收事件的进程“挂接”钩子模块,而使用SendMessage或PostMessage发送模拟的WM_KEYDOWN和WM_KEYUP事件不能达到相同的效果。AntiHook为此设计了一个事件采集界面,“邀请”用户进行一些简单的键盘和鼠标操作,协助查找这种有条件加载的钩子程序,这种方法虽然很笨,但是简单有效。

三、钩子检测程序AntiHook介绍

    做为一个后台运行的小程序,AntiHook使用WTL作为应用程序框架。WTL是一个轻量级的应用程序框架,与MFC相比,WTL不依赖额外的程序库,运行时占用的资源也很少,特别适合小程序的构建。AntiHook是一个基于对话框的应用程序,主要功能集中在主对话框中,从图 2 可以看出它的程序结构非常简单,CMainDlg类是整个程序的主界面也是核心类,其它的类模块都从属于CMainDlg,为其提供功能支持或软件界面支持。CPsapiFunc和CToolhelp32Func类用于查询进程模块,这两个类分别适用于Windows 2000/XP系统和Windows 95/98系统,CTrayIconImpl类为CMainDlg提供了系统托盘图标功能,CWzButtonImpl和CButtonHelp类配合向CMainDlg提供了自画按钮功能,CCtrlColor类丰富了CMainDlg的背景颜色和控件文字颜色,CMenuHelp类提供了自画菜单的支持,CColorListCtrl则使CMainDlg使用的列表控件颜色更加好看。


图 2 AntiHook类模块关系图

    软件的主要功能就是在CMainDlg窗口的定时器的驱动下,周期性地遍历程序当前加载的所有模块,通过与配置文件AntiHook.ini中记录的安全模块列表做对比,判断是否加载了不明模块。对于有条件加载的钩子程序,AntiHook设计了一个事件采集界面,“邀请”用户做一些敲击键盘或点击鼠标的操作,通过这些动作触发相应的事件,欺骗Windows将钩子加载到AntiHook的进程空间中,使得AntiHook能够检测到它们的存在。这个事件采集界面并没有什么实质性的代码,它只是一个“小把戏”,用于产生欺骗性的事件。图 3 演示了事件采集窗口的作用,当用户向采集窗口的编辑框输入随意的字符串时,AntiHook检测到了“紫光拼音输入法”模块被加载到自己的进程空间中了。

图 3 事件采集窗口的作用演示

四、总结

    除了本文提到的方法,对付恶意钩子程序还有一种主动进攻的方法,那就是用钩子对付钩子,不过实现起来比较麻烦,需要有系统调试的权限并且不支持Windows 95/98/Me这样的操作系统。本文提到的方法虽然只是一种被动的检测方法,但是实现起来简单,不仅适用于Windows 2000和Windows XP系统,还适用于Windows 95/98。AntiHook工具就是在本文的钩子检测原理指导下开发的,针对操作系统的差异做了区别处理,具有一定的实用性,另外,这个工具还是一个开源软件,软件爱好者还可以遵循GNU的原则对其进行修改、完善。本文的程序和代码下载网址是:http://blog.youkuaiyun.com/orbit/。


代码使用Visual C++ 6.0为开发工具,为了使程序小巧灵活,本人使用了WTL而不是MFC实现软件的界面,所以编译源代码需要安装WTL库。WTL库是微软发布的基于ATL构建的工具库,随源代码一起发布,可以从微软网站下载,也可以从http://www,winmsg.com/cn/orbit.htm下载。本程序使用WTL 7.1,应该也可用WTL 7.5。编译WTL程序需要安装微软的Platform SDK,最好是2002年以后的版本,如果使用Visual Studio 2002或以后的版本可不用安装Platform SDK,因为它们已经包含了Platform SDK。

下载AntiHook软件:http://blog.youkuaiyun.com/images/blog_youkuaiyun.com/orbit/antihook_exe.zip
下载AntiHook源代码:http://blog.youkuaiyun.com/images/blog_youkuaiyun.com/orbit/antihook_src.zip

Delphi开发的SSDT钩子卸载工具包 本文还有配套的精品资源,点击获取 简介:本工具是使用Delphi语言开发的,能够在内核模式下运行,主要用于从系统服务描述表(SSDT)中移除恶意软件设置的钩子。SSDT是Windows内核的关键部分,被恶意软件篡改后会影响系统功能。工具包含对Windows API的低级访问、内存泄漏检测、DLL加载配置以及安全相关API的封装。这对于系统安全维护和恶意软件检测具有重要意义。... 阅读详情

相关推荐

钩子检测程序,钩子查看程序

这是一个钩子检测,枚举程序,可以发现系统中安装了哪些钩子.然后你就可以卸载它了.这个rar包含原EnumHook工程,但原工程是用RadAsm2.2.1.1汉语增强版编译的,是汇编源代码,我将它重写成c++源码,这样就有利于进一步的开发了.

Android anti-hook技术

原文出处:http://d3adend.org/blog/?p=589 Stab 1: 检查是否安装hook框架,例如xposed或Substrate PackageManager packageManager = context.getPackageManager(); List applicationInfoList = packageManager.getInstalled

fzs4idiot的博客 1362

钩子查看器

该工具可以查看系统的钩子,应用程序使用的内核接口等,非常实用

设置了全局钩子,但是发现有的程序钩不到,这个问题可能的一个原因

问题:     使用SetWindowsHookEx设置了

iSeeSong 作者的专栏 3275

枚举全局钩子_如何列出当前windows中所有的钩子hook

枚举全局钩子_如何枚举系统中所有的钩子hook

pi/4QPSK调制解调原理

文章目录1. π/4\pi/4π/4QPSK 信号的调制原理2. 匹配滤波器与成形滤波器 1. π/4\pi/4π/4QPSK 信号的调制原理 减小相位突变量的QPSK由偏置键控QPSK(OK-QPSK)和 π/4\pi/4π/4偏置的QPSK( π/4\pi/4π/4QPSK)。由于 π/4\pi/4π/4QPSK是用差分相位编码产生的(因此也叫做 π/4\pi/4π/4DQPSK),能有效地进行差分解调和鉴频器解调,在一些不易提取相干载波的场合很有用。 在常规的QPSK中,输入数据经过串/并变换后,分成

gemengxia的博客 2万+

开发一个检测钩子程序的工具

一、引言 Windows系统是建立在事件驱动的机制上的,每一个事件就是一个消息,每个运行中的程序,也就是所谓的进程,都维护者一个或多个消息队列,消息队列的个数取决于进程内包含的线程的个数。由于一个进程至少要拥有一个线程,所以进程至少要有一个消息队

Chinawash 专栏 3198

基于PID算法的循迹小车

这一期为创客们带来基于PID算法的循迹小车制作 1.标准赛道示意图: (该赛道包含了:左直角、右直角、十字路口等路况) 2.灰度传感器安装示意图: (可根据实际情况调节各传感器之间的间距) 3.硬件原理图: 4.控制逻辑: 5.程序如下: #define leftA_PIN 7 #define leftB_PIN 6 #define left_Pwm_PIN 5 #define STBY...

qq_44343584的博客 4万+

发一个自己编的WINDOWS钩子枚举程序

 发一个自己编的WINDOWS钩子枚举程序本程序检测的是windows消息钩子,而并非SSDT钩子.钩子检查可以发现一些常见的木马程序,如利用键盘钩子盗取密码的木马等.运行时会释放出一个驱动文件EnumHook.sys 到系统drivers目录然后加载运行.本程序不支持WIN98,XPSP1和 WIN2000下有些钩子模块可能无法取得.由于每个钩子都会在全局对象句柄表中分配一个表项,包

编程爱好者 1476

HTTPS接口测试翻车实录:为什么浏览器能访问而curl报证书错误?

本文深入分析了HTTPS接口测试中浏览器访问正常而curl报证书错误的典型问题。通过对比浏览器、Postman和curl的工具行为差异,结合Nginx日志与Wireshark抓包,揭示了问题根源在于网络架构中HTTPS请求被意外“降级”为HTTP传输,导致SSL握手失败。文章重点探讨了curl工具严格验证机制暴露的`Peer's Certificate issuer is not recognized`错误,并提供了网络配置修正方案与标准化测试流程。

u9v0w的博客 278

晶晨S905L3S/S905L3SB芯片刷机实战:BL加载工具与线刷固件全解析

本文针对晶晨S905L3S/S905L3SB芯片电视盒子刷机时常见的2%失败问题,提供了两种核心解决方案。一是使用已集成特殊通信协议的专用版USB Burning Tool(如V2.2.5/V2.2.7),二是采用旧版工具配合独立的BootLoader加载工具。文章详细解析了两种方案的原理、操作步骤、固件选择及常见问题排查,旨在帮助用户成功完成刷机,让老旧设备焕发新生。

weixin_29238147的博客 1107

qt鼠标键盘钩子类设计

说明 什么是钩子? Windows系统程序的运行是建立在消息传递机制的基础之上的,几乎所有的程序活动都由消息来驱动。钩子机制可以看作是一个消息的中转站,控制系统发出消息的处理和传递。利用钩子,我们可以截获系统发给应用程序的消息,并且在经过处理后决定是否将消息再发给下一个应用程序。 在qt程序中,一般使用事件系统进行鼠标、按键输入的检测,但是这是有个前提条件的,就是需要聚焦在主界面或里面的对象中。 如果聚焦不在软件上面,其他地方点击鼠标或按下键盘则无法检测,这时候就需要用到Windows下的钩子技术,使用

weixin_42887343的博客 2396

三维点云孔洞修复(附Python代码和公共点云数据集链接)

(1)物体自身缺失(2)物体自身形状复杂,很多凹凸面不够规则甚至存在空腔,空腔内部无法被三维激光扫描仪扫描到(3)物体部分区域对激光扫描不敏感,未被扫描上(4)扫描仪的扫描稳定性。

yanghl1215的博客 6949

检测并屏蔽钩子

最近在写一个检测并屏蔽钩子的程序。

sansecao的专栏 484

Autosar配置——导入DBC后配置SecOC同步报文和同步请求报文

在Autosar中,安全性是一个重要的考虑因素,而SecOC(Secure On-Board Communication)是一种用于保护通信数据完整性和安全性的安全机制。在上述示例中,我们配置了同步报文和同步请求报文的属性。接下来,我们需要在Autosar中配置同步报文和同步请求报文。同步报文用于在通信双方之间同步SecOC状态,而同步请求报文用于请求SecOC的状态信息。通过以上配置,我们成功地导入了DBC文件,并在Autosar系统中配置了SecOC同步报文和同步请求报文。希望以上信息对您有所帮助!

CyberSphinx的博客 649

FastAPI 高级特性:同异步路由函数、依赖注入与后台任务

在现代 Web 开发中,高效的性能和简洁的代码结构是至关重要的。FastAPI 作为一个现代、快速(高性能)的 Web 框架,凭借其对异步编程的原生支持和直观的依赖注入系统,迅速成为开发者的热门选择。在本文中,将深入探讨 `FastAPI` 中的几个核心概念:同异步函数的区别、`Depends` 依赖以及后台任务。

qq_43629857的博客 203

windows钩子、SetWindowsHookEx函数的使用

Windows 钩子技术相关

zyq031010的博客 5513

JavaSwing_1.1: FlowLayout(流式布局)

FlowLayout,流式布局管理器。按水平方向依次排列放置组件,排满一行,换下一行继续排列。

谢TS的博客 7万+
上一篇: 使用Rational PureCoverage测试代码覆盖率
下一篇: 深入浅出单实例Singleton设计模式
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值