日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

1 《Undocumented Windows 2000 Secrets》翻譯 --- 第五章( 二 )


圖5-1. KeServiceDescriptorTable的結(jié)構(gòu)圖
typedef NTSTATUS (NTAPI*NTPROC)();
typedef NTPROC* PNTPROC;
#define NTPROC_ sizeof(NTPROC)
typedef struct _SYSTEM_SERVICE_TABLE
{
PNTPROC ;ServiceTable;// array of entry points
PDOWRD; CounterTable;// array of usage counters
DWordServiceLimit;;// number of table entries
PBYTE; ;;ArgumentTable; ;// array of byte counts
}
SYSTEM_SERVICE_TABLE,
*PSYSTEM_SERVICE_TABLE,
**PPSYSTEM_SERVICE_TABLE;
//-----------------------------------------------------------------------------------------------------------
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
SYSTEM_SERVICE_TABLE ntoskrnl// ntoskrnl.exe ( native api )
SYSTEM_SERVICE_TABLE win32k;;// win32k.sys (gdi/user support)
SYSTEM_SERVICE_TABLE Table3;;// not used
SYSTEM_SERVICE_TABLE Table4;;// not used
}
SYSTEM_DESCRIPTOR_TABLE,
*PSYSTEM_DESCRIPTOR_TABLE,
**PPSYSTEM_DESCRIPTOR_TABLE;
列表5-1. SERVICE_DESCRIPTOR_TABLE結(jié)構(gòu)的定義
Windows 2000還提供了另一個服務(wù)描述符表參數(shù)塊----KeServiceDescriptorTableShadow 。不過,KeServiceDescriptorTable已經(jīng)由ntoskrnl.exe公開的導(dǎo)出了,因此,內(nèi)核模式的驅(qū)動程序可以很容易的訪問它,而KeServiceDescriptorTableShadow則不行 。在Windows 2000下,KeServiceDescriptorTableShadow緊隨KeServiceDescriptorTable之后,但是你不能在Windows NT中以這樣的方法找到它,因為,這一規(guī)則并不使用于Windows NT ??赡茉赪indows 2000的后續(xù)版本的中,這種方法也不行 。這兩個參數(shù)塊的不同之處在于:KeServiceDescriptorTableShadow中的第二個項被系統(tǒng)使用了,用來指向內(nèi)部的W32pServiceTable和w32pArgumentTable結(jié)構(gòu),Win32的內(nèi)核模式組件Win32K.sys使用這兩個結(jié)構(gòu)來分派自己的API調(diào)用,如圖5-2所示 。KiSystemService()通過檢查EAX中索引值的第12和13位來確認(rèn)是不是應(yīng)該由Win32K.sys處理API調(diào)用 。如果這兩個位都是0,則是由ntoskrnl.exe處理的Native API調(diào)用,因此KiSystemService()使用第一個SDT 。如果第12位為1并且第13位為0,KiSystemService()使用第二個SDT,這個SDT并沒有被當(dāng)前系統(tǒng)使用 。這意味著Native API調(diào)用的索引值的潛在范圍是:0x0000 --- 0x0FFFF,Win32K.sys調(diào)用使用的索引范圍是:0x1000 --- 0x1FFF 。因此,0x2000 --- 0x2FFF和0x3000 --- 0x3FFF保留給剩下的兩個SDT 。在Windows 2000中,Native API服務(wù)表包含248個項,Win32K.sys表包含639個項 。
圖5-2. KeServiceDescriptorTableShadow的結(jié)構(gòu)圖
Russinovich和Cogswell的獨具特色的方法是:通過簡單的向KiServiceTable數(shù)組中放入一個不同的處理例程來hook所有API調(diào)用 。這個處理例程最終會調(diào)用位于ntoskrnl.exe中的原始處理例程,但它有機(jī)會察看一下被調(diào)用函數(shù)的輸入/輸出參數(shù) 。這個方法非常強(qiáng)大卻又如此簡單 。因為所有用戶模式的線程必須經(jīng)過這個“針眼”才能獲得Native API的服務(wù),安裝一個全局hook來簡單的替換一個函數(shù)指針的方法,在啟動一個新的進(jìn)程和線程的情況下,也能很穩(wěn)定的工作 。這并不需要一種通訊機(jī)制來通知新加入或?qū)⒁瞥倪M(jìn)程/線程 。
不幸的是,系統(tǒng)服務(wù)表在不同Windows NT版本上不相同 。表5-1比較了Windows NT/2000的KiServiceTable 。很顯然,不僅是處理例程的號碼從211增加到了248,而且新的處理例程并不是直接添加到列表的末尾,而是被插入到了各個地方!因此,一個服務(wù)函數(shù)索引,如0x20在Windows 2000中指向NtCreateFile(),而在Windows NT中卻指向NtCreateProfile() 。所以,通過操作服務(wù)函數(shù)表進(jìn)行hook的API調(diào)用監(jiān)控器必須小心的檢查它所在的Windows NT的版本 。這可以通過如下幾個方式來完成:
l 一種可能性是,檢查由ntoskrnl.exe導(dǎo)出的公開變量:NtBuildNumber,就像Russinovich和Cogswell在他們的原文中所作的那樣 。Windows NT 4.0為所有Service Pack提供的Build Number是:1381 。Windows 2000的當(dāng)前Build Number是:2195 ??磥碛邢M@個版本號在Windows NT的早期版本中很穩(wěn)定 。

推薦閱讀