系统调用004 SSDT
文章目錄
- 前言
- KeServiceDescriptorTable
- SSDT
- SSDT Shadow
前言
之前我們了解到通過KTHREAD結(jié)構(gòu)體0xE0的位置可以找到系統(tǒng)服務(wù)表,這個位置是我們通過逆向得出的。實際上,WIndows提供了一個導(dǎo)出的全局變量,通過這個導(dǎo)出的全局變量,我們就可以直接訪問系統(tǒng)服務(wù)表。
KeServiceDescriptorTable
用IDA打開ntkrnlpa.exe,在導(dǎo)出表里搜索KeServiceDescriptorTable
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VNWev1KB-1577109726658)(assets/1577104403189.png)]
這個是Windows的內(nèi)核模塊導(dǎo)出的全局變量,我們可以在windbg中直接查看這個全局變量
kd> dd KeServiceDescriptorTable 83fb09c0 83ec4d9c 00000000 00000191 83ec53e4 83fb09d0 00000000 00000000 00000000 00000000 83fb09e0 83f236af 00000000 026b2372 000000bb 83fb09f0 00000011 00000100 5385d2ba d717548f 83fb0a00 83ec4d9c 00000000 00000191 83ec53e4 83fb0a10 99016000 00000000 00000339 9901702c 83fb0a20 00000000 00000000 83fb0a24 00000340 83fb0a30 00000340 85cd76d8 00000007 00000000實際上這其實是一個結(jié)構(gòu)體,這個結(jié)構(gòu)體就叫SSDT
SSDT
SSDT 的全稱是 System Services Descriptor Table,系統(tǒng)服務(wù)描述符表。SSDT這個結(jié)構(gòu)包含四個成員,里面的每一個成員都是一個系統(tǒng)服務(wù)表的結(jié)構(gòu)體。
第一個成員是ntoskrl.exe導(dǎo)出的系統(tǒng)服務(wù)表,另外三個成員是空的
我們在windbg中查看一下SSDT的第一個成員
kd> dd 83ec4d9c 83ec4d9c 840c0c28 83f0740d 84050b68 83e6b88a 83ec4dac 840c24ff 83f443fa 84132b05 84132b4e 83ec4dbc 840453bd 8414c368 8414d5c1 8403bb95 83ec4dcc 840ccb35 84125963 84078a56 840486cc 83ec4ddc 83fde928 84117898 8402f14e 84071a62 83ec4dec 840bddf1 8401f238 92731f94 8403cc0c 83ec4dfc 840ce5bc 8403f28f 840ce39c 840c6afc 83ec4e0c 840510f0 84112657 840c3ec9 840ce7ee這里面的每一個成員都是一個內(nèi)核函數(shù)地址
kd> u 840c0c28 nt!SeReleaseSecurityDescriptor+0x923: 840c0c28 8bff mov edi,edi 840c0c2a 55 push ebp 840c0c2b 8bec mov ebp,esp 840c0c2d 64a124010000 mov eax,dword ptr fs:[00000124h] 840c0c33 66ff8884000000 dec word ptr [eax+84h] 840c0c3a 56 push esi 840c0c3b 57 push edi 840c0c3c 6a01 push 1SSDT Shadow
問題在于SSDT這個結(jié)構(gòu)只包含第一張ntoskrl.exe導(dǎo)出的系統(tǒng)服務(wù)表,不包含第二張win32k.sys導(dǎo)出的系統(tǒng)服務(wù)表。那么我們?nèi)绻胍薷牡诙埾到y(tǒng)服務(wù)表的函數(shù),該通過什么方式找到它呢?
也可以通過一個全局變量,這個全局變量叫KeServiceDescriptorTableShadow(SSDT Shadow)。這個全局變量是未導(dǎo)出的,需要通過其他方式來查找(通常是使用內(nèi)存搜索的方式)
KeServiceDescriptorTableShadow的結(jié)構(gòu)和SSDT完全一樣,也有四個成員,第一個成員是ntoskrl.exe導(dǎo)出的第一張系統(tǒng)服務(wù)表,第二個成員是win32k.sys導(dǎo)出的第二張系統(tǒng)服務(wù)表。
但如果你直接訪問Win32k.sys導(dǎo)出的第二張系統(tǒng)服務(wù)表的函數(shù)地址時,會發(fā)現(xiàn)里面的函數(shù)地址都是無效的。
這是因為Win32k.sys導(dǎo)出的第二張系統(tǒng)服務(wù)表只有在當(dāng)前進程訪問的GDI相關(guān)的API的時候,里面的函數(shù)地址表才會掛載到物理內(nèi)存上。如果進程沒有用到GDI相關(guān)的API,那么第二張系統(tǒng)服務(wù)表里面的函數(shù)地址表就不會掛載到物理內(nèi)存,那么里面的函數(shù)也無效。
物理內(nèi)存上。如果進程沒有用到GDI相關(guān)的API,那么第二張系統(tǒng)服務(wù)表里面的函數(shù)地址表就不會掛載到物理內(nèi)存,那么里面的函數(shù)也無效。
總結(jié)
以上是生活随笔為你收集整理的系统调用004 SSDT的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统调用003 系统服务表
- 下一篇: 进程线程001 进程线程结构体和KPCR