SSDT結構簡記

2021-06-16 19:16:16 字數 2897 閱讀 5655

ssdt

的全稱是system services descriptortable,系統服務描述符表 在ntoskrnl.exe匯出keservicedescriptortable

這個表typedefstructservicedescriptortable 

開啟雙擊除錯

dd keservicedescriptortable

80553fa080502b8c00000000 0000011c 80503000

80553fb0 00000000 00000000 00000000 00000000

80553fc0 00000000 00000000 00000000 00000000

80553fd0 00000000 00000000 00000000 00000000

80553fe0 00002710 bf80c0b6 00000000 00000000

80553ff0 f8b97a80 f8339b60 8201ca90 806e2f40

80554000 00000000 00000000 00000000 00000000

80554010 3aeb00c0 01cd83a3 00000000 00000000

第一列顯示的時記憶體位址,也就是keservicedescriptortable在記憶體裡面的位址,這個不管

加黑的那個就是這個結構體的第乙個值,也就是servicetablebase的值,這裡存放ssdt的表項

dd80502b8c(當然也可以 ddpoi[keservicedescriptortable])

80502b8c 8059a948 805e7db6 805eb5fc 805e7de8

80502b9c 805eb636 805e7e1e 805eb67a 805eb6be

80502bac 8060cdfe 8060db50 805e31b4 805e2e0c

80502bbc 805cbde6 805cbd96 8060d424 805ac5ae

80502bcc 8060ca3c 8059edbe 805a6a00 805cd8c4

80502bdc 80500828 8060db42 8056ccd6 8053600e

80502bec 806060d4 805b2c3a 805ebb36 8061ae56

80502bfc 805f0028 8059b036 8061b0aa 8059a8e8

這裡就是表項了..

命令ddpoi[keservicedescriptortable]+0n17*4 l 1

80502bd0 8059edbe

這個是檢視序號17的值,0n表示17是十進位制表示,l 1表示只列出乙個

這個17嘛就是索引號了。。

如何獲取每個函式的索引號?(一般來說xp系統的索引號都不會變)

1.使用kd工具直接檢視。

2.使用od檢視傳入eax的值就是索引號。比如openprocess就是7a=122 zwopenprocess

3.windbg直接u zwopenprocess

804ff720b87a000000  

mov  

eax,7ah

804ff725 8d542404 

lea  

edx,[esp+4]

804ff729 9c 

pushfd

804ff72a 6a08 

push 

8804ff72ce850ed0300  

call  

nt!kereleaseinstackqueuedspinlockfromdpclevel+0x95d(8053e481)

804ff731 c21000 

ret  

10hnt!zwopenprocesstoken:

804ff734b87b000000  

mov  

eax,7bh

804ff739 8d542404 

lea  

edx,[esp+4]

如何通過api獲取openprocess在系統中的原始位址?(上面查到的時當前的位址,如果被hook,跟起源位址可能不一樣,所以可以比較這兩個值來判斷是不是被hook了)

ntkernelapi 

pvoid

mmgetsystemroutineaddress(

in punicode_string systemroutinename

);

**
unicode_string old_ntopenprocess;
ulong old_addr;
old_addr=(ulong)mmgetsystemroutineaddress(&old_ntopenprocess);//取得ntopenprocess的位址
kdprint(("取得原函式ntopenprocess的值為 %x",old_addr));
如何獲取當前的ssdt中的位址?
rtlinitunicodestring(&old_ntopenprocess,l"ntopenprocess");//當然 

ntopenprocess一定是乙個到處函式
**

ulong ssdt_ntopenprocess_cur_addr;

//讀取ssdt表中 ntopenprocess當前位址keservicedescriptortable

//[[keservicedescriptortable

]+0x7a*4] 

__asm

ssdt函式索引號 SSDT索引號的獲取

系統服務描述符表,system service dispatch table,ssdt windows在核心層提供了兩張表,分別為ssdt system service descriptor table,系統服務描述表 和shadow ssdt 使用者層的api實現,實際是層簡單的包裝,最終都是轉到...

ssdt 表結構及hook的一般理解

0 kd dd keservicedescriptortable 8055d700 80505460 00000000 0000011c 805058d4 8055d710 00000000 00000000 00000000 00000000 8055d720 00000000 00000000 ...

系統呼叫004 SSDT

之前我們了解到通過kthread結構體0xe0的位置可以找到系統服務表,這個位置是我們通過逆向得出的。實際上,windows提供了乙個匯出的全域性變數,通過這個匯出的全域性變數,我們就可以直接訪問系統服務表。用ida開啟ntkrnlpa.exe,在匯出表裡搜尋keservicedescriptort...