首页
社区
课程
招聘
[原创]ROOTKIT 核心技术——利用 NT!_MDL(内存描述符链表)突破 SSDT(系统服务描述符表)的只读访问限制 PART I
发表于: 2018-4-13 19:48 10252

[原创]ROOTKIT 核心技术——利用 NT!_MDL(内存描述符链表)突破 SSDT(系统服务描述符表)的只读访问限制 PART I

2018-4-13 19:48
10252






根据上图我们有了思路:首先设法获取当前运行线程的 _KTHREAD 结构,然后即可逐步定位到 KiServiceTable,它就是我们最终
hook 的对象!鉴于 ServiceTable 是一枚指针,持有另一枚指针 KeServiceDescriptorTable 的地址
(亦即 “指向指针的指针”,往后我会不加以区分  “持有” 与  “指向” 术语),而 KiServiceTable 则是一个函数指针数组;
在 Rootkit 源码中,它们可以分别用三个全局变量(在驱动的入口点 DriverEntry()之外声明 )表示,如下图,我使用了
“自注释” 的变量名,很易于理解;而且我把星号紧接类型保留字后面,避免与 “解引” 操作混淆(所以星号是一个重载的运算符):



————————————————————————————————————————————————————————

1 kd> u PsGetCurrentThread
 2 
 3 nt!PsGetCurrentThread:
 4 83c6cd19 64a124010000    mov     eax,dword ptr fs:[00000124h]
 5 83c6cd1f c3              ret
 6 83c6cd20 90              nop
 7 83c6cd21 90              nop
 8 83c6cd22 90              nop
 9 83c6cd23 90              nop
10 83c6cd24 90              nop
11 nt!KeReadStateMutant:
12 83c6cd25 8bff            mov     edi,edi
13 
14 
15 kd> u KeGetCurrentThread
16 
17 nt!PsGetCurrentThread:
18 83c6cd19 64a124010000    mov     eax,dword ptr fs:[00000124h]
19 83c6cd1f c3              ret
20 83c6cd20 90              nop
21 83c6cd21 90              nop
22 83c6cd22 90              nop
23 83c6cd23 90              nop
24 83c6cd24 90              nop

老生常谈,fs 寄存器通常用来存放  “段选择符”,“段选择符”  用来索引 GDT 中的一个  “段描述符”,后者有一个  “段基址”  属性,也就是 KPCR(Kernel Processor Control Region,内核处理器控制区域)结构(nt!_KPCR)的起始地址;nt!_KPCR偏移 0x120 字节处是一个 nt!_KPRCB 结构,后者偏移 0x4 字节处的  “CurrentThread”  字段就是一个 _KTHREAD 结构,每次线程切换都会更新该字段,这就是 fs:[00000124h] 简洁的背后隐藏的强大设计思想!
注意,PsGetCurrentThread() 返回一枚指向 _ETHREAD 结构的指针(亦即  “PETHREAD”,如你所见,微软喜欢在指针这一概念上大玩  “头文字 P” 游戏),而

 _ETHREAD 结构的首个字段 Tcb 就是一个 _KTHREAD 实例——这意味着,我们无需计算额外的偏移量,只要考虑那个 ServiceTable 的偏移量 0xbc 即可,如下图: 




而我们需要在这枚指针上执行加法运算,移动它到 ServiceTable 字段处,所以不能声明一个 PETHREAD 变量来存储 PsGetCurrentThread() 的返回值,因为  “指针加上数值 n ” 会把指针当前持有的地址加上( n * 该指针所指的数据类型大小 )个字节—— 表达式 


1 PETHREAD ethread_ptr += 0xbc;

实际上把起始地址加上了 0xbc * sizeof(ETHREAD) 个字节,远远超出了我们的预期。。。。怎么办呢?好办,声明一个字节型指针来保存 PsGetCurrentThread() 的返回值,同时把返回值强制转型为一致的即可!如此一来,表达式


1 BYTE* byte_ptr += 0xbc;

1 kd> u PsGetCurrentThread
 2 
 3 nt!PsGetCurrentThread:
 4 83c6cd19 64a124010000    mov     eax,dword ptr fs:[00000124h]
 5 83c6cd1f c3              ret
 6 83c6cd20 90              nop
 7 83c6cd21 90              nop
 8 83c6cd22 90              nop
 9 83c6cd23 90              nop
10 83c6cd24 90              nop
11 nt!KeReadStateMutant:
12 83c6cd25 8bff            mov     edi,edi
13 
14 
15 kd> u KeGetCurrentThread
16 
17 nt!PsGetCurrentThread:
18 83c6cd19 64a124010000    mov     eax,dword ptr fs:[00000124h]
19 83c6cd1f c3              ret
20 83c6cd20 90              nop
21 83c6cd21 90              nop
22 83c6cd22 90              nop
23 83c6cd23 90              nop
24 83c6cd24 90              nop





1 PETHREAD ethread_ptr += 0xbc;

实际上把起始地址加上了 0xbc * sizeof(ETHREAD) 个字节,远远超出了我们的预期。。。。怎么办呢?好办,声明一个字节型指针来保存 PsGetCurrentThread() 的返回值,同时把返回值强制转型为一致的即可!如此一来,表达式


1 BYTE* byte_ptr += 0xbc;

1 PETHREAD ethread_ptr += 0xbc;


1 BYTE* byte_ptr += 0xbc;

1 BYTE* byte_ptr += 0xbc;









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

最后于 2018-4-13 20:49 被shayi编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (12)
雪    币: 119
活跃值: (313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2018-4-13 21:50
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
3
关掉写保护就完事了
2018-4-13 23:06
0
雪    币: 49
活跃值: (118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
围观围观
2018-4-14 09:06
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢楼主分享
2018-4-14 10:13
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
6
hzqst 关掉写保护就完事了
真是言简意赅啊
2018-4-14 19:44
0
雪    币: 8224
活跃值: (1296)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享,感叹一下学习的路
2018-4-15 09:59
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
2018-4-15 22:33
0
雪    币: 81
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
9
hzqst 关掉写保护就完事了
实现要优雅
2018-4-16 09:18
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
hzqst 关掉写保护就完事了
还能好好聊天吗 
2018-4-16 09:51
0
雪    币: 190
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
写得很好,很详细
2020-5-28 20:24
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
666
2020-5-28 22:25
0
雪    币: 1862
活跃值: (4146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好文 学到了
2023-2-27 12:55
0
游客
登录 | 注册 方可回帖
返回
//