專利名稱:一種Windows操作系統(tǒng)下鉤子的防御方法
技術(shù)領(lǐng)域:
本發(fā)明涉及惡意軟件,具體涉及一種針對Windows操作系統(tǒng)下的用戶級及內(nèi)核級鉤子 的防御方法,屬于信息安全技術(shù)領(lǐng)域。
背景技術(shù):
Windows操作系統(tǒng)是目前使用最為廣泛的計算機(jī)操作系統(tǒng),根據(jù)調(diào)査,世界上有超過 90%的個人計算機(jī)以及大約66%的服務(wù)器使用的是Windows操作系統(tǒng),由于Windows的 廣泛使用,使得它成為遭受黑客和病毒攻擊最嚴(yán)重的操作系統(tǒng),也使得它的安全問題成為 用戶及計算機(jī)安全研究人員關(guān)注的焦點(diǎn)。最新的Windows操作系統(tǒng)為Windows Vista,該 操作系統(tǒng)由微軟公司于2006年11月發(fā)布,在之后的一年多時間里,微軟公司致力于Vista 系統(tǒng)的推廣,Vista系統(tǒng)的使用人數(shù)正在并將持續(xù)增長。但是,盡管微軟公司對包括Vista 在內(nèi)的眾多操作系統(tǒng)的安全進(jìn)行改進(jìn),但這些操作系統(tǒng)仍然存在著較大的安全隱患。目前 我國計算機(jī)用戶基本上使用的是Windows操作系統(tǒng),以XP系統(tǒng)最為普遍,Vista系統(tǒng)在我 國的使用量也將會大幅度增加,所以更應(yīng)對其安全問題足夠重視。
惡意軟件最常采用的技術(shù)是鉤子技術(shù)。"鉤子技術(shù)"指惡意程序通過篡改操作系統(tǒng)提供 的系統(tǒng)服務(wù)函數(shù)地址入口,使得當(dāng)正常程序調(diào)用這些系統(tǒng)服務(wù)時,被迫去執(zhí)行惡意程序設(shè) 置的函數(shù),改變操作系統(tǒng)的執(zhí)行路徑,從而使惡意軟件達(dá)到破壞系統(tǒng)和竊取用戶信息的目 的。這些惡意程序所設(shè)置的系統(tǒng)服務(wù)函數(shù)的入口地址,稱為"鉤子"。在惡意軟件rootkit( — 種惡意軟件使用的具有"隱形"能力的工具包、庫或者程序代碼,用來隱藏或偽裝惡意軟件 使用的文件、目錄和進(jìn)程)中,更是大量地使用了鉤子技術(shù),達(dá)到隱藏惡意軟件和攻擊者 蹤跡的效果。
在Windows操作系統(tǒng)中,根據(jù)運(yùn)行環(huán)境的不同,鉤子可以分為用戶級鉤子和內(nèi)核級鉤子。
1.用戶級鉤子在Windows系統(tǒng)中,大多數(shù)進(jìn)程都依賴于三個子系統(tǒng)Win32、 POSIX和OS\2子系 統(tǒng),這些子系統(tǒng)由一些文件組成,它們以地址表的形式提供了一組應(yīng)用程序編程接口 (API),用戶進(jìn)程可以通過地址表中的函數(shù)入口地址調(diào)用API請求操作系統(tǒng)的服務(wù),所以 這些地址表所在的文件是惡意軟件攻擊的極佳目標(biāo)。根據(jù)地址表的不同,惡意軟件使用的 鉤子可以分為導(dǎo)入地址表鉤子、導(dǎo)出地址表鉤子、內(nèi)聯(lián)函數(shù)鉤子、系統(tǒng)可執(zhí)行文件及DLL 鉤子等,惡意軟件一般在用戶態(tài)下替換或修改包含這些地址表的文件來設(shè)置這些鉤子。如 果能保證這些文件不被修改或替換,就可以達(dá)到防御用戶級鉤子的目的。 2.內(nèi)核級鉤子
當(dāng)用戶進(jìn)程調(diào)用API進(jìn)入Windows內(nèi)核后,通過系統(tǒng)服務(wù)描述符表(System Service Descriptor Table, SSDT),中斷描述符表(Interrupt Descriptor Table, IDT)等跳轉(zhuǎn)表進(jìn)一 步調(diào)用不同的內(nèi)核系統(tǒng)服務(wù)函數(shù),所以惡意程序通過修改內(nèi)核中的這些跳轉(zhuǎn)表來設(shè)置不同 種類的內(nèi)核鉤子。在Windows內(nèi)核中,惡意軟件使用的鉤子主要有
* IDT鉤子
IDT中包含了異常和中斷處理函數(shù)的入口地址,惡意軟件修改IDT,把系統(tǒng)的處理程 序替換為其提供的非法程序。* SSDT鉤子
SSDT記錄著所有內(nèi)核系統(tǒng)服務(wù)函數(shù)的入口地址,惡意軟件通過修改SSDT表項(xiàng)而改 變內(nèi)核系統(tǒng)服務(wù)函數(shù)的處理過程。
* IRP函數(shù)表鉤子
IRP函數(shù)是驅(qū)動程序用來處理用戶各種請求的,例如讀、寫、査詢等。IRP函數(shù)表里 記錄這IRP函數(shù)的入口地址,攻擊者也可以替換IRP函數(shù)表的一些表項(xiàng)達(dá)到惡意目的。
在Windows操作系統(tǒng)中,攻擊者需要在操作系統(tǒng)的內(nèi)核態(tài)(即Windows ring0級別) 執(zhí)行設(shè)置內(nèi)核級鉤子的操作, 一般會將惡意程序?qū)崿F(xiàn)成驅(qū)動程序和某些服務(wù)的形式,通過 Windows提供的LoadDriver等系統(tǒng)服務(wù)將這些惡意程序以內(nèi)核模塊的形式加載到Windows 內(nèi)核中運(yùn)行。這些惡意程序在內(nèi)核態(tài)獲得運(yùn)行機(jī)會之后,修改跳轉(zhuǎn)表來完成設(shè)置鉤子的操 作。如果能夠保證這些惡意軟件不被加載到內(nèi)核中執(zhí)行,就可以達(dá)到防御內(nèi)核級鉤子的目 的。
目前防范惡意軟件的基本方法是事后檢測,即在惡意軟件安裝到系統(tǒng)甚至造成危害之 后再進(jìn)行檢測,而缺乏對于惡意軟件的事先防御,即能夠察覺惡意軟件進(jìn)入系統(tǒng),并阻止其進(jìn)一步的行為。本發(fā)明則針對這個不足,提出一種主動防御的解決的方法。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有技術(shù)中存在的問題,提供一種Windows操作系統(tǒng)下鉤子的 防御方法。本發(fā)明方法包括對用戶級和內(nèi)核級鉤子的主動防御,可對計算機(jī)惡意軟件進(jìn)行 有效的防護(hù)。
整體而言,本發(fā)明方法包括下列步驟,如圖1所示
a) 獲得Windows系統(tǒng)提供的系統(tǒng)服務(wù)名稱;
b) 通過調(diào)試工具査看所述系統(tǒng)的Win32子系統(tǒng)映像文件,獲取所述系統(tǒng)服務(wù)對應(yīng)的 服務(wù)號;
c) 根據(jù)所述系統(tǒng)服務(wù)號,在系統(tǒng)服務(wù)描述符表中找到所述系統(tǒng)服務(wù)的函數(shù)入口地址, 并將所述函數(shù)入口地址保存至內(nèi)存;
d) 重新編寫系統(tǒng)服務(wù)函數(shù);
e) 以所述新的系統(tǒng)服務(wù)函數(shù)的入口地址替換步驟c所述函數(shù)入口地址。 具體而言,本發(fā)明包含兩個部分用戶級鉤子防御方法以及內(nèi)核級鉤子防御方法。 用戶級鉤子的防御方法包含以下步驟
a) 獲得Windows系統(tǒng)提供的操作文件的系統(tǒng)服務(wù)名稱;
所述操作文件的系統(tǒng)服務(wù)(系統(tǒng)服務(wù)的操作對象是文件)包括NtCreateFile, NtDeleteFile, NtOpenFile和NtWriteFile等。
b) 利用調(diào)試的方法分析Windows系統(tǒng)中的Win32子系統(tǒng)映像文件,獲取a)所獲得的
系統(tǒng)服務(wù)對應(yīng)的服務(wù)號。
本步驟使用windbg或IDA等調(diào)試工具査看Win32子系統(tǒng)映像文件ntdll.dll以獲取系統(tǒng) 服務(wù)對應(yīng)的服務(wù)號。
c) 根據(jù)系統(tǒng)服務(wù)號,在系統(tǒng)服務(wù)描述符表中找到這些系統(tǒng)服務(wù)的函數(shù)入口地址,并 將它們保存到內(nèi)存中。
d) 編寫新的系統(tǒng)服務(wù)函數(shù)來替換原有的系統(tǒng)服務(wù)函數(shù),新系統(tǒng)服務(wù)函數(shù)的運(yùn)行流程 如下
i. 判斷所述系統(tǒng)服務(wù)所操作的文件是否是需要保護(hù)的系統(tǒng)文件;
ii. 如果是,則禁止修改;如果否,則使用c)中保存的系統(tǒng)服務(wù)函數(shù)入口地址調(diào)用原來的系統(tǒng)服務(wù)函數(shù),執(zhí)行所述系統(tǒng)服務(wù)的文件操作。
e)將新系統(tǒng)服務(wù)函數(shù)的入口地址寫入系統(tǒng)服務(wù)描述符表的相應(yīng)表項(xiàng)中,替換原有的 系統(tǒng)服務(wù)函數(shù)的入口地址。
另外,內(nèi)核級鉤子的防御方法包含以下步驟
a) 獲得Windows系統(tǒng)提供的操作內(nèi)核模塊的系統(tǒng)服務(wù)的名稱;
所述操作內(nèi)核模塊的系統(tǒng)服務(wù)(系統(tǒng)服務(wù)的操作對象是內(nèi)核模塊)包括NtLoadDriver 和NtSetSystemlnformation等。
b) 利用調(diào)試的方法分析Windows系統(tǒng)中的Win32子系統(tǒng)映像文件,獲取a)所獲得的 系統(tǒng)服務(wù)的服務(wù)號。
本步驟使用windbg或IDA等調(diào)試工具査看Win32子系統(tǒng)映像文件ntdll.dll,以獲取系 統(tǒng)服務(wù)對應(yīng)的服務(wù)號。
c) 根據(jù)系統(tǒng)服務(wù)號,在系統(tǒng)服務(wù)描述符表中找到這些系統(tǒng)服務(wù)的函數(shù)入口地址,并 將它們保存到內(nèi)存中。
d) 編寫新的系統(tǒng)服務(wù)函數(shù)來替換原有的系統(tǒng)服務(wù)函數(shù),新系統(tǒng)服務(wù)函數(shù)的運(yùn)行流程 如下
i. 使用c)中保存的系統(tǒng)服務(wù)函數(shù)入口地址調(diào)用替換前的系統(tǒng)服務(wù)函數(shù),執(zhí)行加載內(nèi) 核模塊的操作;
ii. 加載完內(nèi)核模塊之后,當(dāng)發(fā)現(xiàn)該模塊第一次運(yùn)行時,掃描上文所述的系統(tǒng)服務(wù)描 述表是否被其修改;
iii. 如果是,卸載該模塊,并復(fù)原其對內(nèi)核跳轉(zhuǎn)表所做的修改;否則,繼續(xù)運(yùn)行。
e) 將新系統(tǒng)服務(wù)函數(shù)的入口地址寫入系統(tǒng)服務(wù)描述符表的相應(yīng)表項(xiàng)中,替換原系統(tǒng) 服務(wù)函數(shù)的入口地址。
本發(fā)明根據(jù)不同種類鉤子的特點(diǎn),分別在用戶態(tài)和內(nèi)核態(tài)進(jìn)行鉤子防御,具有兩個優(yōu) 點(diǎn), 一是對鉤子進(jìn)行全面的防御;二是在惡意軟件剛進(jìn)入系統(tǒng)時覺査到并阻止其進(jìn)一步的 行為,防止惡意軟件造成大的破壞。
圖1表示本發(fā)明鉤子防御方法的示意7圖2表示惡意軟件調(diào)用系統(tǒng)服務(wù)函數(shù)設(shè)置用戶級鉤子的示意圖; 圖3表示本發(fā)明實(shí)施例1用戶級鉤子的防御方法的示意圖; 圖4表示惡意軟件調(diào)用系統(tǒng)服務(wù)函數(shù)設(shè)置內(nèi)核級鉤子的示意圖; 圖5表示本發(fā)明實(shí)施例2內(nèi)核級鉤子的防御方法的示意具體實(shí)施例方式
下面通過實(shí)施例結(jié)合附圖對本發(fā)明作更詳細(xì)的描述。 實(shí)施例l:用戶級鉤子防御方法
圖2描述了惡意軟件調(diào)用系統(tǒng)服務(wù)函數(shù)設(shè)置用戶級鉤子的過程(在此以修改系統(tǒng)文件 的情況為例),該過程包括
1、 調(diào)用NtOpenFile打開要修改的系統(tǒng)文件,在文件中找到要修改的API、導(dǎo)入地址 表表項(xiàng)、導(dǎo)出地址表表項(xiàng)。
2、 調(diào)用NtWriteFile修改該系統(tǒng)文件中的API以及導(dǎo)入地址表和導(dǎo)出地址表中的入口 地址。
3、 修改后的系統(tǒng)文件是包含了惡意API和非法函數(shù)入口地址的系統(tǒng)文件。 針對這一過程,本實(shí)施例通過下述方法實(shí)現(xiàn)對用戶級鉤子的防御,如圖3所示
1 、使用調(diào)試工具IDA pro査看Win32子系統(tǒng)映像文件ntdll.dll中NtWriteFile對應(yīng)的
服務(wù)號。
所有的系統(tǒng)服務(wù)函數(shù)的第一條指令為mov eax, <Index>,其中〈Index〉即為該系統(tǒng)服務(wù) 的系統(tǒng)服務(wù)號,以NtWriteFile為例
moveax, 163h NtWriteFile movedx, 7FFE0300h call dword ptr [edx] retn 24h
其中,163h即為系統(tǒng)服務(wù)NtWriteFile的系統(tǒng)服務(wù)號。 以下步驟通過編寫程序完成。
2、根據(jù)系統(tǒng)服務(wù)號在系統(tǒng)服務(wù)描述符表中找到修改文件的系統(tǒng)服務(wù)函數(shù)入口地址。
(1) 首先利用數(shù)據(jù)結(jié)構(gòu)KeServiceDescriptorTable或KeServieDescriptorTableShadow獲得
系統(tǒng)服務(wù)描述符表的基地址,例如
extern PSSDT KeServiceDescriptorTable/
pBase = KeServiceDescriptorTable-〉pvSSDTBase;
(2) 根據(jù)系統(tǒng)服務(wù)號獲得系統(tǒng)服務(wù)函數(shù)的入口地址,獲取方式為* ( (PU:LONG) address) = * ( pBase + ulndex * sizeof (SSDTItem) )
3、 保存獲得的系統(tǒng)服務(wù)函數(shù)入口地址到內(nèi)存中。
4、 重新編寫該系統(tǒng)服務(wù)函數(shù),以NtWriteFile為例
MyNtWriteFile(path):
if (path屬于需要保護(hù)的系統(tǒng)文件) 拒絕操作;
NtWriteFile (path),.
5、 修改系統(tǒng)服務(wù)描述符表中該表項(xiàng)的權(quán)限為可寫。
只需要將該內(nèi)存區(qū)域的描述符改為MDL—MAPPED—TO_SYSTEM—VA,之后即可對該 內(nèi)存區(qū)域進(jìn)行修改。
6、 將5編寫的系統(tǒng)服務(wù)函數(shù)的入口地址寫入系統(tǒng)服務(wù)描述符表的相應(yīng)表項(xiàng)中。 實(shí)施例2:內(nèi)核級鉤子防御方法
圖4描述了惡意軟件調(diào)用系統(tǒng)服務(wù)函數(shù)設(shè)置用戶級鉤子的過程,該過程包括
1、 將設(shè)置鉤子的程序編寫為Windows驅(qū)動程序的形式。
2、 調(diào)用NtLoadDriver或NtSetSystemInformation將編寫好的驅(qū)動程序加載到Windows內(nèi)核。
3、 設(shè)置鉤子的驅(qū)動程序在內(nèi)核中運(yùn)行,將內(nèi)核中的系統(tǒng)服務(wù)描述符表、中斷描述符 表、irp函數(shù)表中的入口地址修改為惡意軟件提供的函數(shù)的入口地址。
針對這一過程,本實(shí)施例通過和實(shí)施例1相似的方法實(shí)現(xiàn)對內(nèi)核級鉤子的防御,如圖 5所示,其和實(shí)施例1方法的區(qū)別僅在于以下兩點(diǎn)
1. 本實(shí)施例所針對的系統(tǒng)服務(wù)是操作內(nèi)核模塊的系統(tǒng)服務(wù),包括NtLoadDriver和 NtSetSystemlnformation 。
2. 重新編寫的系統(tǒng)服務(wù)函數(shù),運(yùn)行流程如下(以NtLoadDriver為例)
MyNtLoadDriver (module):
NtljOadDrivei: (module) hile (掃描SSDT各個表項(xiàng)item), if (item被module修改)
NtUnLiOadDriver (module) 恢復(fù)item; end if end while
9
權(quán)利要求
1.一種Windows操作系統(tǒng)下鉤子的防御方法,所述方法包括a)獲得Windows系統(tǒng)提供的系統(tǒng)服務(wù)名稱;b)通過調(diào)試工具查看所述系統(tǒng)的win32子系統(tǒng)映像文件,獲取所述系統(tǒng)服務(wù)對應(yīng)的服務(wù)號;c)根據(jù)所述系統(tǒng)服務(wù)號,在系統(tǒng)服務(wù)描述符表中找到所述系統(tǒng)服務(wù)的函數(shù)入口地址,并將所述函數(shù)入口地址保存至內(nèi)存;d)重新編寫系統(tǒng)服務(wù)函數(shù);e)以所述新的系統(tǒng)服務(wù)函數(shù)的入口地址替換步驟c所述函數(shù)入口地址。
2. 如權(quán)利要求l所述的Windows操作系統(tǒng)下鉤子的防御方法,其特征在于,步驟a所述 系統(tǒng)服務(wù)是操作文件的系統(tǒng)服務(wù)。
3. 如權(quán)利要求2所述的Windows操作系統(tǒng)下鉤子的防御方法,其特征在于,所述系統(tǒng)服 務(wù)包括NtCreateFile, NtDeleteFile, NtOpenFile和NtWriteFile。
4. 如權(quán)利要求2所述的Windows操作系統(tǒng)下鉤子的防御方法,其特征在于,步驟b所述 調(diào)試工具是windbg或IDA調(diào)試工具。
5. 如權(quán)利要求2所述的Windows操作系統(tǒng)下鉤子的防御方法,其特征在于,步驟d所述 新的系統(tǒng)服務(wù)函數(shù)的運(yùn)行流程為i. 判斷所述系統(tǒng)服務(wù)所操作的文件是否是需要保護(hù)的系統(tǒng)文件;ii. 如果是,則禁止修改;如果否,則使用步驟c所保存的函數(shù)入口地址調(diào)用系統(tǒng)服務(wù) 函數(shù),執(zhí)行所述系統(tǒng)服務(wù)的文件操作。
6. 如權(quán)利要求l所述的Windows操作系統(tǒng)下鉤子的防御方法,其特征在于,步驟a所述 系統(tǒng)服務(wù)是操作內(nèi)核模塊的系統(tǒng)服務(wù)。
7. 如權(quán)利要求6所述的Windows操作系統(tǒng)下鉤子的防御方法,其特征在于,所述系統(tǒng)服 務(wù)包括NtLoadDriver和NtSetSystemInformation。
8. 如權(quán)利要求6所述的Windows操作系統(tǒng)下鉤子的防御方法,其特征在于,步驟b所述調(diào)試工具是windbg或IDA調(diào)試工具。
9.如權(quán)利要求7所述的Windows操作系統(tǒng)下鉤子的防御方法,其特征在于,步驟d所述 新的系統(tǒng)服務(wù)函數(shù)的運(yùn)行流程為i. 使用步驟c所保存的函數(shù)入口地址調(diào)用系統(tǒng)服務(wù)函數(shù),加載內(nèi)核模塊;ii. 內(nèi)核模塊加載后,若所述內(nèi)核模塊第一次運(yùn)行,則掃描所述系統(tǒng)服務(wù)描述表是否 被所述內(nèi)核模塊修改;iii. 如果是,則卸載所述內(nèi)核模塊,并復(fù)原所述修改;如果否,則繼續(xù)運(yùn)行。
全文摘要
本發(fā)明公開了一種Windows操作系統(tǒng)下鉤子的防御方法,屬于信息安全技術(shù)領(lǐng)域。本發(fā)明方法包括a)獲得Windows系統(tǒng)提供的系統(tǒng)服務(wù)名稱;b)通過調(diào)試工具查看所述系統(tǒng)的win32子系統(tǒng)映像文件,獲取所述系統(tǒng)服務(wù)對應(yīng)的服務(wù)號;c)根據(jù)所述系統(tǒng)服務(wù)號,在系統(tǒng)服務(wù)描述符表中找到所述系統(tǒng)服務(wù)的函數(shù)入口地址,并將所述函數(shù)入口地址保存至內(nèi)存;d)重新編寫系統(tǒng)服務(wù)函數(shù);e)以所述新的系統(tǒng)服務(wù)函數(shù)的入口地址替換步驟c所述函數(shù)入口地址。本發(fā)明可根據(jù)不同種類鉤子的特點(diǎn),分別在用戶態(tài)和內(nèi)核態(tài)進(jìn)行鉤子防御,具有兩個優(yōu)點(diǎn),一是對鉤子進(jìn)行全面的防御;二是在惡意軟件剛進(jìn)入系統(tǒng)時覺查到并阻止其進(jìn)一步的行為,防止惡意軟件造成大的破壞。
文檔編號G06F21/22GK101620660SQ200910090179
公開日2010年1月6日 申請日期2009年7月31日 優(yōu)先權(quán)日2009年7月31日
發(fā)明者白光冬, 霞 趙, 耀 郭, 陳向群 申請人:北京大學(xué)