【摘 要】隨著技術(shù)的發(fā)展,計算機系統(tǒng)已經(jīng)通過特定程序可實現(xiàn)任意操作,微軟的windows是使用最廣泛的系統(tǒng)之一,其中,Rootkit技術(shù)在windows下最常見的實現(xiàn)方式當(dāng)屬驅(qū)動級的內(nèi)存技術(shù)對抗,它被廣泛的應(yīng)用于游戲保護,殺毒軟件防護等方面。
【關(guān)鍵詞】對抗 驅(qū)動 Windows API Hook
一、Intel X86處理器
Intel的X86處理器是通過Ring級別來控制訪問權(quán)限的,級別共分4層,從Ring0到Ring3(后面簡稱R0,R1,R2,R3)。R0層擁有最高的權(quán)限,R3層擁有最低權(quán)限。而現(xiàn)在的操作系統(tǒng),包括Windows和Linux都沒有采用4層權(quán)限,而只是使用了2層—R0層和R3層,分別用來存放操作系統(tǒng)數(shù)據(jù)和應(yīng)用程序數(shù)據(jù)。
二、用戶模式和內(nèi)核模式
Windows從總體上分為內(nèi)核模式(Kernel Mode)和用戶模式(User Mode),Windows將內(nèi)核模式運行在CPU的R0層,而將用戶模式運行在CPU的R3層。而驅(qū)動程序一旦加載,就運行在R0層,就擁有了和操作系統(tǒng)同樣的權(quán)限,可以做任何事情。
三、WIN32子系統(tǒng)
Win32是Windows的一個子系統(tǒng),還有另外的子系統(tǒng)如OS/2、POSIX、WOW等。不同的子系統(tǒng)系統(tǒng)提供了不同的編程接口,即API,一般說的API指的就是Win32 API。Win32子系統(tǒng)是最純正的Windows子系統(tǒng),提供了大量的API函數(shù),程序員只需要熟練的使用這些API就可以寫出Windows應(yīng)用程序,當(dāng)然程序員也可以考慮第三方庫,如VC提供的MFC,但這些庫不過是在應(yīng)用程序和Win32子系統(tǒng)中間加了一層封裝而以,沒有本質(zhì)的區(qū)別。Windows API 分為三類 分別是USER函數(shù),GDI函數(shù),和KERNEL函數(shù)。USER函數(shù)(user32.dll):這類函數(shù)管理窗口,菜單,對話框和控件;GDI函數(shù)(gdi32.dll):這類函數(shù)在物理設(shè)備上執(zhí)行繪圖操作;KERNEL函數(shù)(kernel32.dll):這類函數(shù)管理非GUI資源,如進程、線程和同步服務(wù)等。
四、Native API(Ntdll.dll)
大部分Win32子系統(tǒng)的API都是通過Native API實現(xiàn)的。Native API的函數(shù)一般都是在Win32 API上加上Nt兩個字母。Native API 是可由用戶模式和內(nèi)核模式程序調(diào)用的NT系統(tǒng)服務(wù)集接口,它們直接由操作系統(tǒng)實現(xiàn)。
五、SSDT
SSDT的全稱是System Services Descriptor Table,系統(tǒng)服務(wù)描述符表。這個表就是一個把R3的Win32 API和R0的內(nèi)核API聯(lián)系起來。SSDT并不僅僅只包含一個龐大的地址索引表,它還包含著一些其它有用的信息,諸如地址索引的基地址、服務(wù)函數(shù)個數(shù)等。系統(tǒng)服務(wù)是由操作系統(tǒng)提供的一個函數(shù)集,這些函數(shù)可以幫助調(diào)用者實現(xiàn)系統(tǒng)的各種功能。用戶態(tài)的應(yīng)用程序可以通過API函數(shù)間接地調(diào)用系統(tǒng)服務(wù)。在內(nèi)核態(tài)中,系統(tǒng)通過服務(wù)描述符表尋找相應(yīng)系統(tǒng)服務(wù)函數(shù)。在系統(tǒng)中有2個描述符表(SYSTEM_DESCRIPTOR_TABLE 結(jié)構(gòu)):(1)KeServiceDescriptorTable,由ntosknl.exe導(dǎo)出,主要為KERNEL32和ADVAPI32中的API提供服務(wù);(2)KeServiceDescriptorTable Shadow,未被導(dǎo)出,主要完成USER32/GUI32中的請求。每個描述符表由4個連續(xù)的系統(tǒng)服務(wù)表(System Service Table, SST)的表項組成,每項可以描述一組服務(wù)。每組服務(wù)由一個系統(tǒng)服務(wù)分發(fā)表(System Service Dispatch Table, SSDT)和一個系統(tǒng)服務(wù)參數(shù)表(System Service Parameter Table, SSPT)組成,分別對服務(wù)的入口地址和所需參數(shù)進行索引。每個服務(wù)有一個服務(wù)序號,系統(tǒng)根據(jù)這個序號查找2個表,最終可找到相應(yīng)的服務(wù)函數(shù)和參數(shù)信息。
六、sysenter和sysexit指令
從R3切換到R0層,早期的操作系統(tǒng)一般通過中斷來實現(xiàn),如Linux下的 int 80h,Windows NT和Windows2000下的 int 2Eh。而在Windows XP以后則使用了快速系統(tǒng)調(diào)用sysenter和sysexist來進行系統(tǒng)調(diào)用和返回。
七、驅(qū)動文件
亦為PE格式的一種,含有用戶模式驅(qū)動、文件系統(tǒng)驅(qū)動等,各類驅(qū)動配合操作系統(tǒng)內(nèi)核組成了龐大的windows系統(tǒng),用戶層應(yīng)用程序調(diào)用API,該API對應(yīng)用程序提供的參數(shù)進行校驗再將所有東西轉(zhuǎn)化為unicode,然后調(diào)用ntdll.dll中的KiFastSystemCall函數(shù)切換入內(nèi)核,如將服務(wù)序號放入eax、將存放參數(shù)的用戶棧指針放入edx,再切換到內(nèi)核態(tài)。當(dāng)程序的處理流程進入R0之后,系統(tǒng)會根據(jù)服務(wù)號(eax)在SSDT這個系統(tǒng)服務(wù)描述符表中查找對應(yīng)的表項,這個找到的表項就是系統(tǒng)服務(wù)函數(shù)的真正地址。之后,系統(tǒng)會根據(jù)這個地址調(diào)用相應(yīng)的系統(tǒng)服務(wù)函數(shù),并把結(jié)果原路返回給ntdll.dll中的API。在調(diào)用sysenter或int 2Eh之后,Windows系統(tǒng)將會捕獲你的這個調(diào)用,然后進入ring0層,調(diào)用內(nèi)核服務(wù)函數(shù)NtOpenProcess。由此,如果驅(qū)動程序在內(nèi)核態(tài)Hook住了NtOpenProcess函數(shù),通過對傳入?yún)?shù)的進行過濾,如果是被保護的程序則返回參數(shù)為0,即可實現(xiàn)對程序的簡單保護。
八、SSDT HOOK的簡單實現(xiàn)
(環(huán)境 Windows XP sp3 32bit)驅(qū)動層代碼t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;SSDT_Adr=(PLONG)(t_addr+0x23*4); //SSDT表索引值0x23(即NtOpenProcess)SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;RealNtOpenAddress = *SSDT_Adr; //保留原始地址RealNtOpenProcess = ( NTOPENPROCESS *)RealNtOpenAddress; __asm //去掉頁面保護。在驅(qū)動入口DriverEntry()派遣函數(shù)中調(diào)用Hook(),從exe文件中傳入進程PID,設(shè)置SSDT Hook,實現(xiàn)對進程的簡單保護。
九、結(jié)語
在內(nèi)核下存在著我們看不到的戰(zhàn)爭,隨著技術(shù)的發(fā)展,先前頗為流行的窗口掛鉤、inline hook、API掛鉤、進程注入等技術(shù)已然成為昨日黃花,大有逐漸淡出之勢,取而代之的,則是更狠毒、更為赤裸裸的詞匯:驅(qū)動、隱藏進程、Rootkit……驅(qū)動級的對抗技術(shù)如今已被廣泛應(yīng)用到了殺毒軟件的主動防御、各種軟件的自我保護以及游戲的保護、反外掛等技術(shù)中去。如360的驅(qū)動加載攔截,就是創(chuàng)建了一個LoadImage()的系統(tǒng)回調(diào)函數(shù),用XueTr刪除后發(fā)現(xiàn)其他程序加載驅(qū)動后360就無再提示,進入了Ring0態(tài)可以完成任何操作,如結(jié)束掉殺毒軟件等為下一步利用計算機做準(zhǔn)備;將合理利用驅(qū)動還可以實現(xiàn)提示用戶有惡意程序結(jié)束掉可信賴的程序,并給出程序名稱與路徑等關(guān)鍵信息,為進一步查殺病毒提供了便利;監(jiān)視注冊表;監(jiān)視磁盤讀??;系統(tǒng)還原等。正因為Ring0如此重要的地位,使其成了兵家必爭之地,可以說誰搶占了先機,凌駕Ring3之上,誰就在這場戰(zhàn)爭中增加了勝算。
參考文獻:
[1]《天書夜讀-從匯編語言到Windows內(nèi)核編程》.電子工業(yè)出版社 2009
[2]《Windows驅(qū)動開發(fā)技術(shù)詳解》.電子工業(yè)出版社 2009
[3]《內(nèi)核態(tài)下的系統(tǒng)服務(wù)掛鉤對抗》.計算機工程 2010
[4]《多態(tài)技術(shù)加殼軟件的實現(xiàn)》.甘肅科技 2010