SSDT結構簡記
SSDT的全稱是System Services DescriptorTable,系統服務描述符表 在ntoskrnl.exe匯出KeServiceDescriptorTable 這個表
typedefstructServiceDescriptorTable{
PVOID ServiceTableBase; //System Service DispatchTable的基地址
PVOIDServiceCounterTable(0);
//包含著SSDT中每個服務被呼叫次數的計數器。這個計數器一般由sysenter 更新。
unsigned int NumberOfServices;//由ServiceTableBase 描述的服務的數目。
PVOID ParamTableBase;//包含每個系統服務引數位元組數表的基地址-系統服務參數列
}
開啟雙擊除錯
dd KeServiceDescriptorTable
80553fa0 80502b8c 00000000 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的表項
dd 80502b8c (當然也可以 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 8
804ff72ce850ed0300 call nt!KeReleaseInStackQueuedSpinLockFromDpcLevel+0x95d(8053e481)
804ff731 c21000 ret 10h
nt!ZwOpenProcessToken:
804ff734b87b000000 mov eax,7Bh
804ff739 8d542404 lea edx,[esp+4]
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一定是一個到處函式
程式碼
相關文章
- 系統呼叫篇——SSDT
- SSDT表概念詳解
- JVM虛擬機器記憶體結構簡析JVM虛擬機記憶體
- 資料結構中樹形結構簡介資料結構
- 資料結構學習筆記-簡單選擇排序資料結構筆記排序
- 資料結構簡介資料結構
- 硬碟結構簡介 (轉)硬碟
- 簡易資料結構資料結構
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- 記憶體結構記憶體
- Oracle體系結構之-記憶體結構Oracle記憶體
- CPU簡介(2)內部結構簡析
- ffmpeg資料結構簡介資料結構
- postgre目錄結構簡介
- JVM結構的簡單梳理JVM
- Redis資料結構簡介Redis資料結構
- 資料結構簡單題資料結構
- Oracle 邏輯結構簡介Oracle
- 《Python 簡明教程》讀書筆記系列四 —— 資料結構Python筆記資料結構
- Java虛擬機器系列之Java記憶體結構簡介Java虛擬機記憶體
- 資料結構簡單要點總結資料結構
- 【PG體系結構】PG體系結構簡單說明
- PostgreSQL:記憶體結構SQL記憶體
- oracle 記憶體結構Oracle記憶體
- JVM記憶體結構JVM記憶體
- 資料結構筆記資料結構筆記
- 【黑蘋果教程】筆記本對DSDT/SSDT打補丁實現背光控制蘋果筆記
- JVM的基本結構和JVM的記憶體結構JVM記憶體
- Oracle體系結構之記憶體結構(SGA、PGA)Oracle記憶體
- Oracle例項的程式結構和記憶體結構Oracle記憶體
- 簡述常見資料結構資料結構
- Innodb undo之 undo結構簡析
- html文件結構簡單介紹HTML
- 簡述oracle資料庫結構Oracle資料庫
- 棧鏈式結構簡單操作
- 【基礎篇記憶體結構】oracle10g記憶體結構(一)記憶體Oracle
- Go 筆記之程式結構Go筆記
- InnoDB記錄儲存結構