SSDT 是什么

本文详细介绍了SSDT(System Services Descriptor Table)的概念、作用及其内存组织方式,阐述了其在系统服务调用过程中的重要性,并通过WinDbg工具展示SSDT的具体内容和结构,揭示了其在Windows系统中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

  通过修改此表的函数地址可以对常用windows函数及API进行hook,从而实现对一些关心的系统动作进行过滤、监控的目的。一些HIPS、防毒软件、系统监控、注册表监控软件往往会采用此接口来实现自己的监控模块,
  目前极个别病毒确实会采用这种方法来保护自己或者破坏防毒软件,但在这种病毒进入系统前如果防毒软件能够识别并清除它将没有机会发作.
  什么是SSDT?较为正式一些的诠释是System Service Descriptor Table(系统服务描述符表)
  那么到底这个描述表是用来干什么的?他在内存中是如何组织的呢?
  首先,SSDT的结构:
  引用:
  typedef struct _SYSTEM_SERVICE_TABLE
  {
  PVOID ServiceTableBase; //这个指向系统服务函数地址表
  PULONG ServiceCounterTableBase;
  ULONG NumberOfService; //服务函数的个数
  ULONG ParamTableBase;
  }SYSTEM_SERVICE_TABLE,*PSYSTEM_SERVICE_TABLE;
  typedef struct _SERVICE_DESCRIPTOR_TABLE
  {
  SYSTEM_SERVICE_TABLE ntoskrnel; //ntoskrnl.exe的服务函数
  SYSTEM_SERVICE_TABLE win32k; //win32k.sys的服务函数,(gdi.dll/user.dll的内核支持)
  SYSTEM_SERVICE_TABLE NotUsed1;
  SYSTEM_SERVICE_TABLE NotUsed2;
  }SYSTEM_DESCRIPTOR_TABLE,*PSYSTEM_DESCRIPTOR_TABLE;
  实际上内核中存在两个系统服务描述符表,一个是KeServiceDescriptorTable(由ntoskrnl.exe导出),一个是KeServieDescriptorTableShadow(没有导出)。
  从上述结构中,我们可以看出,KeServieDescriptorTableShadow不但包含了ntoskrnel项,而且还包含了win32k项,而KeServiceDescriptorTable仅仅包含一个ntoskrnel项。
  我们用WinDbg看看,到底这个KeServiceDescriptorTable是什么东西。
  引用:
  lkd> dd KeServiceDescriptorTable
  80553380 81f61008 00000000 0000013d 81e62358
  80553390 00000000 00000000 00000000 00000000
  805533a0 00000000 00000000 00000000 00000000
  805533b0 00000000 00000000 00000000 00000000
  805533c0 00002710 bf80c217 00000000 00000000
  805533d0 f8951a80 f80839e0 81f433a8 806e0f40
  805533e0 00000000 00000000 00000000 00000000
  805533f0 83740440 01c8eac3 00000000 00000000
  我们可以看出,函数表基地址为81f61008,存在0000013d个服务项
  我们继续看看81f61008地址的内存块内,到底放了些什么。
  引用:
  lkd> dd 81f61008
  81f61008 80599746 805e6914 805ea15a 805e6946
  81f61018 805ea194 805e697c 805ea1d8 805ea21c
  81f61028 8060b880 8060c5d2 805e1cac 805e1904
  81f61038 805ca928 805ca8d8 8060bea6 805ab334
  81f61048 8060b4be 8059dbbc 805a5786 f8807de8
  81f61058 804ffed0 8060c5c4 8056be64 805353f2
  81f61068 80604b90 805b19c0 805ea694 80619a56
  81f61078 805eeb86 80599e34 80619caa 805996e6
  这里面的数据到底表示什么呢?实际上,这表示的是一个入口地址。我们对其中一个地址进行反汇编看看
  引用:
  lkd> u 80599746
  nt!NtConnectPort+0x60:
  80599746 689c000000 push 9Ch
  8059974b 6820a14d80 push offset nt!FsRtlLegalAnsiCharacterArray+0x1680 (804da120)
  80599750 e8abebf9ff call nt!wctomb+0x45 (80538300)
  80599755 64a124010000 mov eax,dword ptr fs:[00000124h]
  8059975b 8a8040010000 mov al,byte ptr [eax+140h]
  80599761 884590 mov byte ptr [ebp-70h],al
  80599764 84c0 test al,al
  80599766 0f84b9010000 je nt!NtConnectPort+0x23f (80599925)
  SSDT到底是什么呢?打一个比方,SSDT相当于系统内部API的指向标,作用就是告诉系统,需要调用的API在什么地方。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值