首页
社区
课程
招聘
[求助]HOOK SSDT中常用SYSTEMSERVICE宏的原理
发表于: 2010-6-5 12:13 4935

[求助]HOOK SSDT中常用SYSTEMSERVICE宏的原理

2010-6-5 12:13
4935
define SYSTEMSERVICE(_func) \
  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_func+1)]

按照一般的解释:“SYSTEMSERVICE宏的参数(姑且称为参数吧)是ntoskrnl.exe导出的函数地址,是一个Zw* 型的函数,返回一个在SSDT表中Nt*型的函数地址。”

而以ZwCreateFile为例:
8042fa70 b820000000       mov     eax,0x20
8042fa75 8d542404         lea     edx,[esp+0x4]
8042fa79 cd2e             int     2e
8042fa7b c22c00           ret     0x2c

则((PUCHAR)_func+1)得到的是函数在SSDT表中的索引(这里是0x20),那么*(PULONG)(0x20)是什么东西?

PS:ServiceTableBase表里面的每一项都是某个NT*函数的地址吗?

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
2
并不是所有SSDT函数都是导出的,使用那个宏的前提就是函数已经被内核导出了,
而以ZwCreateFile为例:
8042fa70 b820000000       mov     eax,0x20
8042fa75 8d542404         lea     edx,[esp+0x4]
8042fa79 cd2e             int     2e
8042fa7b c22c00           ret     0x2c
((PUCHAR)_func+1)的值是8042fa71所以*((PUCHAR)_func+1)是0x20
2010-6-5 14:50
0
雪    币: 247
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
只要zw*的函数导出了,就能获取到nt*的地址
第一句mov     eax,0x20
0x20就是SSDT表中NtCreateFile的索引号
2010-6-5 18:34
0
雪    币: 183
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢
2010-6-5 18:59
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个问题老帖子很多人问,自己搜索下也比问方便哦。学习方法很重要
2010-6-5 19:24
0
游客
登录 | 注册 方可回帖
返回
//