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