首页
社区
课程
招聘
[原创]一种枚举系统热键的思路及代码实现(Win7&Win10)
发表于: 2020-7-7 00:36 14416

[原创]一种枚举系统热键的思路及代码实现(Win7&Win10)

2020-7-7 00:36
14416

现在使用全局快捷键的软件越来越多,经常遇到快捷键被占用的情况,想找出被谁占用了,网上找了一些工具,不过都不支持新版本的Win10。于是自己写了一个(支持Win7到最新的Win10 2004 32/64位,XP就不考虑了),本文顺带记录一下分析思路。

众所周知,注册热键需要调用RegisterHotKey,首先看一下函数原型:

简单跟一下RegisterHotKey函数,到ntdll!NtUserRegisterHotKey,看一下NtUserRegisterHotKey函数原型:

可以看到Native的参数和上层API一致,往下则是Shadow SSDT,进入win32k,Win7/Win8/8.1还是win32k.sys,Win10已拆分成win32k/win32kfull/win32kbase三个模块,其中NtUserRegisterHotKey是win32kfull的导出函数。

打开IDA,定位到NtUserRegisterHotKey函数,其调用RegisterHotKey如下:

IDA推导的参数显示有问题,跟一下参数来源,不难知道RegisterHotKey参数1是hWnd,参数2是NULL,参数3是id,参数4是fsModifiers,参数5是vk。

继续跟进RegisterHotKey,直接F5,有两段代码需要注意:

第一段很意图很明显,通过FindHotKey查找热键是否已经注册。

第二段则是若HotKey未找到,则从Win32kPool中分配HotKey数据结构,并填充相应的字段,最后加入Hash表gphkHashTable中。接下来看看结构的填充方式以及Hash表的Index如何计算的。

v19则是HotKey结构体,对照RegisterHotKey参数,很容易分析出下面的偏移代表的字段:

最终可得到结构如下:

至此,热键数据结构已经分析清楚,本文目的是枚举热键,因此关键问题是如何定位gphkHashTable,通常能想到两种方式:

思考片刻,想了一种搜索思路,既然gphkHashTable是全局Hash表,位于DATA段,0x80个Bucket,里面全是HotKey结构,那么可以校验HotKey的vk%0x7F得到Index来检查合法性。其次win32k的DATA段大小也比较合理,因此搜索范围也不大。如果能将表填充完,过滤出内核地址,再配合校验Hash表的HotKey的合法性,应该就能搜索到。

RegHotkey的代码都是一些内存结构运算,依赖少,因此可以注册0x80个vk从1到0x80的vk值来填满Hash表,如果注册成功就记录,枚举完后再取消注册,做清理工作。

如果找到Hash表,删除热键就很简单了,找到对应的HotKey,常规摘单链节点的操作即可。

由于代码全在内核层实现(WDK7601),并且调用者不是GUI线程、Win7注册热键的函数未导出,因此调用RegHotKey会繁琐点,整体流程如下:

下面分段解析,由于热键操作必须访问win32k session空间,而且ThreadInfo还必须存在,因此光Attach到GUI进程是不行的,最简单的方式就插APC到GUI线程。

接着获取NtUser*Hotkey相关函数,注册热键填充Hash表后,后面就可以开始搜索搜索Hash表了,HotKey是由win32k从NonPagedPool中分配,因此用MmIsAddressValid检查无须担心换页问题,具体代码如下:

递归解析Hash表,Dump出系统热键,代码如下所示:

注意:发现输入法的快捷键没有注册到系统热键中,应该是自己管理的,因此这种方式不能被检测到,如果有快捷键占用而没找到,则优先检查输入法设置。

驱动效果如下图所示:

图形化工具下载地址:https://github.com/BlackINT3/OpenArk,点击内核--进入内核模式--查看系统热键:

Thanks for reading...

本文未考虑XP,感兴趣的可以参看其它同学的文章。

 
 
 
 
 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-7-7 10:33 被BlackINT3编辑 ,原因:
上传的附件:
收藏
免费 8
支持
分享
最新回复 (19)
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
2020-7-7 06:51
0
雪    币: 1378
活跃值: (3067)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
有点意思
2020-7-7 08:39
0
雪    币: 6076
活跃值: (5480)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
4
感谢分享,收藏了
2020-7-7 09:47
0
雪    币: 26588
活跃值: (63252)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
5
感谢分享哦~
2020-7-7 09:54
0
雪    币: 6054
活跃值: (12594)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
6
楼主写的ARK工具一直都挺攒的,感谢
2020-7-7 10:06
0
雪    币: 1074
活跃值: (3876)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
支持一下
2020-7-7 10:15
0
雪    币: 12315
活跃值: (5839)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8

代码读完,楼主思路很清晰,赞一个

我觉得因为输入法基本对所有进程都注入了模块,所以也没注册系统热键的必要

最后于 2020-7-7 11:16 被hhkqqs编辑 ,原因:
2020-7-7 10:42
0
雪    币: 300
活跃值: (2452)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark
2020-7-7 11:21
0
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
感谢分享~
2020-7-7 14:04
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
感谢分享~
2020-7-8 14:34
0
雪    币: 0
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢分享~
2020-7-8 14:35
0
雪    币: 259
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
一直不理解是怎么识别热键冲突的,似乎有点头绪了,用户层可以做热键冲突识别么
2020-7-9 17:47
0
雪    币: 6664
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持下,学习了
2020-7-10 06:42
0
雪    币: 603
活跃值: (4223)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
mark
2020-7-12 17:24
0
雪    币: 4359
活跃值: (4338)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark  枚举系统热键 
2020-7-12 21:00
0
雪    币: 19
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
感谢分享
2020-7-14 07:58
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
感谢分享
2020-7-14 09:49
0
雪    币: 1378
活跃值: (3067)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
看帖不仔细.(°ー°〃),差点就错过了这么精致的 ARK 工具.这工具太方便了.
2020-7-24 17:48
0
雪    币: 3736
活跃值: (3867)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
感谢分享!
2020-7-29 20:36
0
游客
登录 | 注册 方可回帖
返回
//