找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 11130|回复: 10

【紫水晶首发】VB小子玩转驱动程序(8):SSDT与Shadow SSDT

 火... [复制链接]

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-27 18:25:43 | 显示全部楼层 |阅读模式

VB小子玩转驱动程序(8):SSDT与Shadow SSDT

作者:胡文亮



注1:本文只适合并针对初级的VB编程爱好者阅读,请所谓的“大牛”飘过。

注2:本文可能会有技术性错误,但是我尽可能保证本文的正确性。

注3:欢迎各位转载,转载最好注明出处和作者。

  这两张名词经常被提及,而一般初学者却不知道是什么意思,我在这里简单解释一下。
  SSDT,英文全名System Services Descriptor Table,中文全名系统服务描述符表。
  Shadow SSDT,亦可称SSSDT,英文全名Shadow System Services Descriptor Table,中文直译“阴影系统服务描述表”。:funk:
  这两位兄弟权力很大,全部用户态的函数调用都要经过他们手中来实现。因为我们在用户态所调用的函数,都没有真正实现相应的功能,真正实现的函数功能的,都是Ring 0的Native API。所谓“Ring 0的Native API”,就是在ntoskrnl.exe和win32k.sys中的那些以NtXXX开头的API(有些没有导出),而不是ntdll.dll中以NtXXX开头的API。
  正可谓“绝对的权力产生绝对的腐败”,SSDT和SSSDT两兄弟是那种“一朝权在手,便把钱来收”的家伙。这两兄弟有很多路标,这些路标分别指向相应NtXXX函数的地址。但如果SSDT和SSSDT两兄弟收取了黑钱,就允许别人修改那些路标,指向行贿人(驱动程序)自己的函数地址。这就是所谓的SSDT HOOK。下面举个生活中的例子:
  张三要去告状(OpenProcess),他来到京城,在“京城政府机构地址引导中心”(SSDT)询问去哪里告状,结果京城政府机地址构指导中心的人收了黑钱,没有告诉张三真正的的“衙门”(NtOpenProcess的地址)在哪里,而是告诉了张三行贿人(驱动程序)设置的“伪衙门”(简称Fake_NtOpenProcess)的地址,结果张三就稀里糊涂的去了那里。到了“伪衙门”,那里的工作人员就问张三要告谁。假如张三要告的人不是行贿人要保护的人,“伪衙门”的人就会把张三的告状信(参数)转交“真衙门”(NtOpenProcess的地址),然后把“真衙门”反馈的情况再转告张三(成不成也不知道,反正是给了张三一个真实的交代)。如果张三要告的人就是行贿人要保护的人,那里的工作人员就会直接告诉张三,这个人你告不了,张三就会很郁闷的离开。假如那个行贿人心黑手狠,就会篡改张三的告状信(参数),把张三要告的人改成张三自己(比如张三的PID是1234,原来要告的人的PID是8888,结果行贿人把张三要告的人的PID改成1234,换句话说就成了张三自己告自己),再把经过篡改的参数提交给真衙门。
  张三回去一琢磨,心想肯定是受骗了,于是他打开京城地图(内核文件),找到了真衙门的地址,然后很生气地把那路标给改成了正确的地址,这样别人就再也不会受骗上当了(这就是所谓的恢复SSDT)。
  当然恢复SSDT也是可以,张三可以带着地图(内核文件中的数据)径直走到真衙门(NtOpenProcess的地址)里(这就是所谓的动态调用函数)。
  如果张三后台够硬,就根本不用找衙门告状,直接去朝廷找刑部的人申冤,也行(这就是所谓的自己实现内核函数,比如用PsLookupProcessByProcessId + ObOpenObjectByPointer模拟实现NtOpenProcess)。
  Shadow SSDT也类似,不过他们管的东西不同罢了。SSDT管的是与系统相关的函数(kernel32.dll、ntdll.dll),而Shadow SSDT管的是图形、用户相关的函数(gdi32.dll、user32.dll)。
  说了这么多,估计大家也听糊涂了,我还是摘抄一段百度百科上的解释吧:
  SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表就是一个把ring3的Win32API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。
  通过修改此表的函数地址可以对常用windows函数及API进行hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块 。

  附件里是Hook NtSetInformationFile的例子(手头上找不到Hook NtOpenProcess的例子),原理是一样的,大家凑合着看吧。

文件防删.rar

72.04 KB, 下载次数: 6544

src

评分

参与人数 2水晶币 +30 +100 收起 理由
马大哈 + 10 + 100
xiaoly99 + 20

查看全部评分

如果附件无法下载,请点击这里

1

主题

11

回帖

0

精华

铜牌会员

积分
123
发表于 2010-1-28 11:07:57 | 显示全部楼层
膜拜SSDT call

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-28 19:06:16 | 显示全部楼层
这个例子很生动
喜欢这样的

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-28 20:11:45 | 显示全部楼层
.c的那个文件呢?

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-28 20:30:45 | 显示全部楼层
这个驱动是用c++写的。
如果附件无法下载,请点击这里

0

主题

8

回帖

0

精华

初来乍到

积分
18
发表于 2010-7-10 14:02:58 | 显示全部楼层
这个例子很生动
喜欢这样的

2

主题

2

回帖

0

精华

初来乍到

积分
13
发表于 2010-7-23 09:37:17 | 显示全部楼层
还没看怎么明白。

0

主题

74

回帖

0

精华

银牌会员

积分
436
发表于 2010-8-19 01:34:17 | 显示全部楼层
这个要学习下,谢谢楼主啦

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-8-19 08:41:58 | 显示全部楼层
大力支持!!
我就是嗷嗷叫的老马了......

1

主题

48

回帖

0

精华

金牌会员

积分
978
发表于 2012-6-23 18:13:20 | 显示全部楼层
例子很生动{:soso_e113:}

0

主题

6

回帖

0

精华

初来乍到

积分
8
发表于 2012-7-2 09:06:41 | 显示全部楼层
还没看怎么明白
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表