Jirairya

SSDT


SSDT全称为System Service Descriptor Table(系统描述符表),是内核中的一个数据结构,在系统服务调用过程中,最终会在内核态查找此表来找到系统服务函数的地址,因此修改这个表就可以挂住系统服务函数。

SSDT的结构体:

typedef struct _tagSSDT {
    PVOID pvSSDTBase;
    PVOID pvServiceCounterTable;
    ULONG ulNumberOfServices;
    PVOID pvParamTableBase;
} SSDT, *PSSDT; 

SSDT并不仅仅只包含一个庞大的地址索引表,它还包含一些有用的信息,如地址索引的基地址、服务函数的个数等。通过修改此表可以达到对系统重要操作进行过滤和监控。一些 HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块。

在NT4.0的windows操作系统中,默认存在两个系统服务描述符表,这两个描述符表对应了两类不同的系统服务,这两个表为:KeServiceDescriptorTable(SSDT)和KeServiceDescriptorTable(SSDT Shadow)。其中SSDT负责处理来自Ring3层的Kernel32.dll的系统调用。而SSDT Shadow则主要处理来自User32.dll和GDI32.dll的系统调用。同时SSDT在ntoskrnl.exe中是导出的,而SSDT Shadow如其名是未被Windows所导出的,而关于SSDT的全部内容都是通KeServiceDescriptorTable来完成的。

一旦rookit作为设备驱动程序加载后,它可以将SSDT改为指向它所提供的函数,而不是指向Ntoskrnl.exe或Win32k.sys。当应用程序调用内核服务时,系统服务调度程序会根据服务号查找SSDT,并且调用rookit函数。这时,rootkit可以将它想要的任何假信息传回到应用程序,从而有效地隐藏自身以及所用的资源。

SSDT Hook流程 SSDT挂钩效果

SSDT挂钩隐藏:Windows通过ZwQuerySystemInformation()函数查询许多不同类型的信息。例如,Taskmgr.exe通过该函数获取系统上的进程列表。返回的信息类型取决于所请求的SystemInformationClass值


上一篇 基址重定位表

Comments

Content