- 注册时间
 - 2010-6-12
 
- 最后登录
 - 2019-9-29
 
- 在线时间
 - 53 小时
 
 
 
 
 
终身VIP会员 
    
	- 魔鬼币
 - 55183 
 
 
 
 | 
 
标 题: SSDT Hook的妙用-对抗ring0 inline hook 
作 者: 堕落天才 
 
1,SSDT 
     SSDT即系统服务描述符表,它的结构如下(参考《Undocument Windows 2000 Secretes》第二章): 
 
     typedef struct _SYSTEM_SERVICE_TABLE 
     { 
       PVOID   ServiceTableBase;        //这个指向系统服务函数地址表 
       PULONG  ServiceCounterTableBase; 
       ULONG   NumberOfService;         //服务函数的个数,NumberOfService*4 就是整个地址表的大小 
       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(没有导出)。两者的区别是,KeServiceDescriptorTable仅有ntoskrnel一项,KeServieDescriptorTableShadow包含了ntoskrnel以及win32k。 
 
   一般的Native API的服务地址由KeServiceDescriptorTable分派,gdi.dll/user.dll的内核API调用服务地址由KeServieDescriptorTableShadow分派。 
 
    还有要清楚一点的是win32k.sys只有在GUI线程中才加载,一般情况下是不加载的,所以要Hook KeServieDescriptorTableShadow的话,一般是用一个GUI程序通过IoControlCode来触发(想当初不明白这点,蓝屏死机了N次都想不明白是怎么回事)。 
 
 |   
 
 
 
 |