- 注册时间
 - 2010-8-21
 
- 最后登录
 - 2017-5-27
 
- 在线时间
 - 2 小时
 
 
 
 
 
编程入门 
  
	- 魔鬼币
 - 542 
 
 
 
 | 
 
 
xp sp3里面的: 
nt!KeAddSystemServiceTable+0x1a: 
80597810 8d88e03f5580    lea     ecx,nt!KeServiceDescriptorTableShadow (80553fe0)[eax] 
80597816 833900          cmp     dword ptr [ecx],0 
80597819 7546            jne     nt!KeAddSystemServiceTable+0x6b (80597861) 
 
2003 企业版 sp2的: 
nt!KeAddSystemServiceTable+0x1a: 
80915116 8d8840f48980    lea     ecx,nt!KeServiceDescriptorTableShadow (8089f440)[eax] 
8091511c 833900          cmp     dword ptr [ecx],0 
8091511f 7546            jne     nt!KeAddSystemServiceTable+0x6b (80915167) 
 
win7旗舰版sp1的: 
nt!KeAddSystemServiceTable+0x1a: 
83de0022 8d8840dbdb83 lea ecx,nt!KeServiceDescriptorTableShadow (83dbdb40)[eax] 
83de0028 833900 cmp dword ptr [ecx],0 
83de002b 7546 jne nt!KeAddSystemServiceTable+0x6b (83de0073) 
 
上面都是 偏移0x1a,8d88占两个字节,所以在加上2,后面的四个字节就是shadow ssdt的地址了 
 
所以就是 KeAddSystemServiceTable的地址+0x1a(偏移量)+2(汇编指令占用的两个字节) 
 
//SSDT结构体 
typedef struct ServiceDescriptorTable { 
   unsigned int *ServiceTableBase; 
   unsigned int *ServiceCounterTable; 
   unsigned int NumberOfServices; 
   unsigned int *ParamTableBase; 
}ServiceDescriptorTable,*PServiceDescriptorTable; 
 
PServiceDescriptorTable KeServiceDescriptorTableShadow; 
 
NTSYSAPI 
BOOLEAN 
NTAPI 
KeAddSystemServiceTable ( 
       IN PULONG_PTR Base, 
       IN PULONG Count OPTIONAL, 
       IN ULONG Limit, 
       IN PUCHAR Number, 
       IN ULONG Index 
); 
 
PULONG getAddressOfShadowTable() 
{ 
    PULONG p; 
 
    //兼容XP,2003和WIN7 
    //nt!KeAddSystemServiceTable+0x1a: 
    //83de0022 8d8840dbdb83    lea     ecx,nt!KeServiceDescriptorTableShadow (83dbdb40)[eax] 
    //83de0028 833900          cmp     dword ptr [ecx],0 
    //83de002b 7546            jne     nt!KeAddSystemServiceTable+0x6b (83de0073) 
 
    //8d88两个字节,所以+2 
    p = (PULONG)((ULONG)KeAddSystemServiceTable+0x1a+2); 
 
    return (PULONG)(*p); 
} 
 
测试代码: 
DbgPrint("address: 0x%X",getAddressOfShadowTable()); 
KeServiceDescriptorTableShadow = (PServiceDescriptorTable)getAddressOfShadowTable(); 
DbgPrint("num of services:%d",KeServiceDescriptorTableShadow[1].NumberOfServices); 
 
下面是运行结果: 
100.95681000  进入驱动程序入口! 
100.96257782  address: 0x83D74B40 
100.97072601  num of services:825 
 |   
 
 
 
 |