HoviDelphic 发表于 2010-1-27 18:25:43

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

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的例子),原理是一样的,大家凑合着看吧。

cttnbcj 发表于 2010-1-28 11:07:57

膜拜SSDT call

ok100fen 发表于 2010-1-28 19:06:16

这个例子很生动
喜欢这样的

ok100fen 发表于 2010-1-28 20:11:45

.c的那个文件呢?

HoviDelphic 发表于 2010-1-28 20:30:45

这个驱动是用c++写的。

bigwahaha 发表于 2010-7-10 14:02:58

这个例子很生动
喜欢这样的

luojian909 发表于 2010-7-23 09:37:17

还没看怎么明白。

huzhao23 发表于 2010-8-19 01:34:17

这个要学习下,谢谢楼主啦

马大哈 发表于 2010-8-19 08:41:58

大力支持!!

siuwai 发表于 2012-6-23 18:13:20

例子很生动{:soso_e113:}

qqq111 发表于 2012-7-2 09:06:41

还没看怎么明白
页: [1]
查看完整版本: 【紫水晶首发】VB小子玩转驱动程序(8):SSDT与Shadow SSDT