首页
社区
课程
招聘
[原创]The Age-Old Art of SSDT Hooking(But Bypass Most ARK Tools...)
发表于: 2009-1-11 22:07 13759

[原创]The Age-Old Art of SSDT Hooking(But Bypass Most ARK Tools...)

2009-1-11 22:07
13759

前天看到一篇同样标题的文章(我转载到其他地方也被BS),但后来被作者删了,我也来一篇共勉一下。

    SSDT HOOK是个很古老的话题了,基本上是ring0 rookit入门的第一课。我们先来重温一下系统服务表结构:
   

typedef struct _SERVICE_DESCRIPTOR_TABLE_SHADOW 
{
	SERVICE_DESCRIPTOR_TABLE  ntoskrnl;  //ntoskrnl.exe
	SERVICE_DESCRIPTOR_TABLE  win32k;    //win32k.sys 
  SERVICE_DESCRIPTOR_TABLE  NotUse1;   //未使用
	SERVICE_DESCRIPTOR_TABLE  NotUse2;   //未使用
}SERVICE_DESCRIPTOR_TABLE_SHADOW,*PSERVICE_DESCRIPTOR_TABLE_SHADOW;
inc     large dword ptr fs:638h //<--这里是用来纪录system calls的,没太大用处,可以替换掉
mov     esi, edx
mov     ebx, [edi+0Ch]          //<--edi保存的就是服务表中的ntoskrnl或者win32k
xor     ecx, ecx
mov     cl, [eax+ebx]
mov     edi, [edi]
mov     ebx, [edi+eax*4]
sub     esp, ecx
shr     ecx, 2
mov     edi, esp
cmp     esi, ds:_MmUserProbeAddress
//上面代码是XP系统的,其他windows系统也有类似代码

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

收藏
免费 7
支持
分享
最新回复 (19)
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
2
太强了,学习
2009-1-11 22:09
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
直接挂了int 2e跟sysenter然后在自己的处理函数里面把eax加上0x2000再转跳到原始的处理函数中不结了?
2009-1-11 22:21
0
雪    币: 214
活跃值: (24)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
你试试R.K.U会不会报“强奸”
2009-1-11 22:36
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
那你修改KiSystemService在code hooks里面不也得露出来?
不让rku报指针被修改无非是把int 2e & sysenter hook从修改idt/寄存器改为inline 而已。
2009-1-11 22:40
0
雪    币: 214
活跃值: (24)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
"特别,上面花那么大力气修改inc  large dword ptr fs:638h指令就是避免了长跳转,使R.K.U无法发现代码已经被修改。"  R.K.U是检测不到的,已经证实。
2009-1-11 23:12
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
膜拜ing.......
2009-1-11 23:36
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看不懂也支持
2009-1-11 23:48
0
雪    币: 311
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好文,学习ing.
2009-1-12 00:12
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很淫荡。。。。
2009-1-12 09:47
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
那就是rku的问题了,你用is扫一下应该能扫到
2009-1-12 11:49
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
12
呵呵,思路不错. 一般的ARK不会在意这种没有跳转的修改.
2009-1-12 12:29
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
强,学习了,确实是一个技巧
利用SSDT后面的2个表
这样KiSystemService中就不用跳转了,知道偏移了,就直接把第一句改成Add edi,0x20(只占2个字节)即可。
如果是利用自己自制的表的话,免不了要跳转,因为mov edi,0xaaaaaaa 占6个字节,直接改代码肯定不行的
2009-1-12 13:52
0
雪    币: 230
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了,思路很新颖
2009-1-12 13:54
0
雪    币: 400
活跃值: (1339)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
原来是这个意思~ 学习~
2009-1-12 19:21
0
雪    币: 471
活跃值: (4228)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
16
学习一下小技巧,可能用的到
2009-1-15 12:48
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
尝试过你给的方法之后有两个问题要请教。
第一,我按照你的方法修改函数KiSystemService里面那一行汇编代码的话,立即出现蓝屏。不知道是怎么回事。那一行汇编代码的地址我用的是绝对地址,通过windbg获得的。地址应该是对的,因为我可以把代码正确Copy到别的地方。
第二,据我所知,对于Win2000可以采用你这种方法,对于WinXP好像就不行了,因为WinXP中Windows native API的调用是通过KiFastCallEntry来实现的。
2009-7-16 20:48
0
雪    币: 303
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
2009-7-17 20:37
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
值得学习....
2009-7-17 20:51
0
雪    币: 38
活跃值: (551)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
20
不错,确实是好文。不过有点小问题。
某些邪恶的程序会把ssdt复制一份出来并且添加了自己的系统调用,肯定是必蓝无疑。
没有记错的话,在执行 call  ebx就挂了。
2009-10-23 15:08
0
游客
登录 | 注册 方可回帖
返回
//