首页
社区
课程
招聘
[原创]高版本64位Win10(RS2或更高)下枚举消息钩子的一种思路
发表于: 2020-9-1 15:57 14744

[原创]高版本64位Win10(RS2或更高)下枚举消息钩子的一种思路

2020-9-1 15:57
14744

    首先是参考文章:

https://bbs.pediy.com/thread-14600.htm (作者:一块三毛钱)

https://bbs.pediy.com/thread-55453.htm (作者:炉子)

    这里先简单回顾一下前人的枚举思路:一块三毛钱采用的是枚举所有线程并取ETHREAD的THREADINFO,同时枚举16种钩子类型iHookType,调用win32k.sys中未导出函数PVOID PhkFirstValid(PTHREADINFO pti, int iHookType)获得保存钩子信息的结构体tagHOOK的首地址,随后循环调用PVOID PhkNextValid(tagHOOK*)以枚举所有的消息钩子。炉子的思路是获取user32.dll中与win32k.sys的共享变量gSharedInfo,遍历gSharedInfo->aheList的数组成员_HANDLEENTRY,总数为gSharedInfo->psi->cHandleEntries,若成员_HANDLEENTRY的bType为5,则其为消息钩子,_HANDLEENTRY的phead成员即为钩子对应的内核tagHOOK结构体首地址。

    鉴于炉子的方法相对简便,本文的研究思路以炉子的方法作为基础展开。

    首先介绍枚举方案中涉及的关键结构体:tagHOOK和_HANDLEENTRY。

    tagHOOK结构体成员在64位Win10下没有变化,其简要结构为

    在Win10 RS1(14393)及之前的64位Windows系统,_HANDLEENTRY结构为:

    按照炉子的方法,只要取出其中的phead成员即为内核tagHOOK结构体的首地址,然而Win10 RS2(15063)中,微软为了修复GDI Object Leak,将_HANDLEENTRY中的phead和pOwner成员移除了,以下分别是14393和15063下gSharedInfo->aheList的_HANDLEENTRY数组:

    新的HANDLEENTRY结构也没有写进符号文件,笔者水平有限,只能得到新的HANDLEENTRY大概长这样:

    

    第一眼看过去,似乎新版HANDLEENTRY没有提供多少查找tagHOOK结构体的线索。笔者决定跟一下gSharedInfo在内核的变动,值得一提的是,Windows 10下gSharedInfo从win32k.sys移到了win32kbase.sys中。

    经过一番查找,笔者发现win32kbase!HMValidateHandle引用了gSharedInfo->aheList的成员,传入的句柄参数取低16位即为aheList数组的索引,同时该索引也参与到取内核结构体地址的运算。在Win10 RS2中伪代码如下:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-9-1 16:34 被hhkqqs编辑 ,原因:
收藏
免费 5
支持
分享
最新回复 (13)
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
应用层枚举不了,只能上驱动枚举
2020-9-2 03:07
0
雪    币: 12352
活跃值: (5874)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
yy虫子yy 应用层枚举不了,只能上驱动枚举
这个确实,就算有驱动,也要废点时间分析,毕竟涉及到的不少结构体信息从符号文件剔除了
2020-9-2 09:25
0
雪    币: 914
活跃值: (2463)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
4
海不错
2020-9-3 18:02
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5

楼主强!

笔记本修好了!我准备用另一个笔记本,搭建虚拟机环境专门调试WIN10系列,
我上I tell you下载WIN10,x64的下载很快,但x86的慢得很,半天下载不下来。能否提供个速度快点的WIN10 x86的链接?我想都下载下来!

最后于 2020-11-30 17:57 被低调putchar编辑 ,原因:
2020-11-30 17:24
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感谢分享!
2020-11-30 20:54
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7

WIN10用32位的还是比较少!看你们WIN10调试得这么精彩,我已经迫不及待了,先把下载的64位装起快照好再说,内核版本号:以前的10240太老了,我准备用新下的。趁项目间歇期有时间就把环境搭建好,方便以后研究!

最后于 2020-11-30 23:48 被低调putchar编辑 ,原因:
2020-11-30 23:47
0
雪    币: 12352
活跃值: (5874)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
低调putchar 楼主强!笔记本修好了!我准备用另一个笔记本,搭建虚拟机环境专门调试WIN10系列,我上I tell you下载WIN10,x64的下载很快,但x86的慢得很,半天下 ...
我也是在这个网站下的,我是用百度网盘离线下载然后用油猴插件提取链接,用Internet Download Manager下,基本不低于1M/s
2020-12-1 00:27
0
雪    币: 8
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我最近也在做r3的拦截消息钩子注入的防御 还是老样子用了callback中对应的函数地址做挂钩检查注入的dll是否合法 
2020-12-1 01:48
0
雪    币: 126
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
6
2022-10-13 20:12
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
HANDLE ObjectHandle = (HANDLE)(i | (gSharedInfo->aheList[i].wUniq << 0x10));
楼主能帮忙解答以下吗 这一步没看明白, 为啥wUniq 字段和索引凑一块就拿到了句柄
2024-7-26 00:09
0
雪    币: 12352
活跃值: (5874)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
wx_空格ㄨ_797 HANDLE ObjectHandle = (HANDLE)(i | (gSharedInfo->aheList[i].wUniq
因为句柄就是用这个规则生成的,HIWORD==wUniq, LOWORD==Index
2024-7-27 06:01
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
HOOK结构体, 获取到的HOOK结构中数据基本都是对的,但是HookObject->ihmod这个值要么-1要么为1, 这个让我很费解, 我都系统版本是19041, 楼主,出现这种结果,大概原因是什么啊,整了一天没搞明白
2024-8-2 00:31
0
雪    币: 12352
活跃值: (5874)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
wx_空格ㄨ_797 HOOK结构体, 获取到的HOOK结构中数据基本都是对的,但是HookObject->ihmod这个值要么-1要么为1, 这个让我很费解, 我都系统版本是19041, 楼主,出现这种结果,大概原 ...
-1 1都是正常的值吧,取值非负就用RtlQueryAtomInAtomTable拿模块名或者PROCESSINFO::ahmodLibLoaded拿模块基址,首发版的win11这个方法还能用,19041应该也不在话下
2024-8-3 00:34
0
游客
登录 | 注册 方可回帖
返回
//