系統服務調度表SSDT及SSSDT Shadow

來源:互聯網
上載者:User

系統服務:由作業系統提供的一組函數(核心功能),API可以間接或者直接的調用系統服務。作業系統以動態連結程式庫(DLL)的形式提供API。
SSDT:系統服務調度表(System  Service  Dispatch Table),該表可以基於系統服務編號進行索引,來定位函數記憶體位址。
SSPT:系統服務參數表(System  Service  Parameter  Table),指定系統服務函數的參數位元組數。
系統有2個SSDT表, 一個是KeServiceDescriptorTable(ntoskrnl.exe匯出),一個是KeServieDescriptorTableShadow(ntoskrnl.exe未匯出)。兩者的區別是,KeServiceDescriptorTable僅有ntoskrnel.exe中的函數一項,KeServieDescriptorTableShadow包含了ntoskrnel.exe以及win32k.sys中包含的函數。一般的ntdll.dll中的Native API的函數地址由KeServiceDescriptorTable指派,gdi.dll/user.dll的核心API調用服務地址由KeServieDescriptorTableShadow指派。

1)KeServiceDescriptorTable是核心匯出的一張表,該表含有一個指標指向SSDT中包含Ntoskrnl.exe實現的核心服務,還包含一個指標指向SSPT。
KeServiceDescriptorTable結構如下:
typedef struct _ServiceDescriptorEntry {  
  unsigned int *ServiceTableBase;        //SSDT基址
  unsigned int *ServiceCounterTableBase; //SSDT中服務被調用次數的計數器
  unsigned int NumberOfServices;         //SSDT服務個數
  unsigned char *ParamTableBase;         //SSPT基址
}SSDT, *PSSDT;

下面是在windbg進行實驗:
lkd> dd KeServiceDescriptorTable   //匯出表
80563520  804e58b0 00000000 0000011c 805120cc
80563530  00000000 00000000 00000000 00000000
80563540  00000000 00000000 00000000 00000000
80563550  00000000 00000000 00000000 00000000
80563560  00000002 00002710 bf80c339 00000000
80563570  baecda80 f753c4a0 8a09655c 807120c0
80563580  00000000 00000000 ffea8ad6 ffffffff
80563590  52841216 01ca0418 00000000 00000000
lkd> dd 804e58b0               //SSDT基址
804e58b0  80591bfb 80585358 805e1f35 805dbc4a
804e58c0  805e1fbc 80640ce4 80642e75 80642ebe
804e58d0  805835aa 80650be3 806404a3 805e1787
804e58e0  806387ba 80586fa3 805e08e8 8062f462
804e58f0  805d9781 80571edd 805e8258 805e939e
804e5900  804e5ec4 80650bcf 805cd537 804ed822

lkd> dd 805120cc     //SSPT基址
805120cc  2c2c2018 44402c40 1818080c 0c040408
805120dc  08081810 0808040c 080c0404 2004040c
805120ec  140c1008 0c102c0c 10201c0c 20141038
805120fc  141c2424 34102010 080c0814 04040404
8051210c  0428080c 1808181c 1808180c 040c080c
8051211c  100c0010 10080828 0c08041c 00081004
8051212c  0c080408 10040828 0c0c0404 28240428
8051213c  0c0c0c30 0c0c0c18 0c10300c 0c0c0c10

2)KeServiceDescriptorTableShadow是核心未匯出的另一張表,包含Ntoskrnel.exe和win32k.sys服務函數。某些網遊通過掛鈎按鍵相關函數(NtUserSendInput)防止類比按鍵、(NtUserFindWindowEx)防止搜尋視窗、Anti_Virus通過掛鈎視窗相關的函數(NtUserPostMessage 、 NtUserQueryWindow)來防止被關閉。KeServiceDescriptorTableShadow實際上是SSDT結構 數組,也就是KeServiceDescriptorTableShadow是一組系統描述表。XP SP3下組數是4。在XP系統下,KeServiceDescriptorTableShadow表位於KeServiceDescriptorTable表上方,位移0x40處。
下面是windbg進行實驗:
lkd> dd KeServiceDescriptorTableShadow  
805634e0  804e58b0 00000000 0000011c 805120cc         //SSDT表 Ntoskrnel.exe
805634f0  bf99a000 00000000 0000029b bf99ad10         //SSDT Shdow表 Win32k.sys
80563500  00000000 00000000 00000000 00000000
80563510  00000000 00000000 00000000 00000000
80563520  804e58b0 00000000 0000011c 805120cc       //KeServiceDescriptorTable 表
80563530  00000000 00000000 00000000 00000000
80563540  00000000 00000000 00000000 00000000
80563550  00000000 00000000 00000000 00000000
由於KeServiceDescriptorTableShadow表屬於未匯出,因此我們需要定位地址。
定位未匯出函數和結構的思想就是利用已匯出函數和結構,暴力搜尋記憶體空間。
方法一、依據KeServiceDescriptorTable的地址和兩者之間的位移
方法二、搜尋KeAddSystemServiceTable匯出函數
方法三、搜尋線程的ServiceTable指向
方法四、MJ提出的搜尋有效記憶體位址

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.