專(zhuān)利名稱(chēng):一種Windows操作系統(tǒng)下鉤子的檢測(cè)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及惡意軟件,具體涉及一種Windows操作系統(tǒng)下鉤子的檢測(cè)方法,屬于信息 安全技術(shù)領(lǐng)域。
背景技術(shù):
Windows操作系統(tǒng)是目前使用最為廣泛的計(jì)算機(jī)操作系統(tǒng),根據(jù)調(diào)査,世界上有超過(guò) 90%的個(gè)人計(jì)算機(jī)以及大約66%的服務(wù)器使用的是Windows操作系統(tǒng),由于Windows的 廣泛使用,使得它成為了遭受黑客和病毒攻擊最嚴(yán)重的操作系統(tǒng),也使得它的安全問(wèn)題成 為用戶(hù)及計(jì)算機(jī)安全研究人員關(guān)注的焦點(diǎn)。最新的Windows操作系統(tǒng)為Windows Vista, 該操作系統(tǒng)由微軟公司于2006年ll月發(fā)布,在之后的一年多時(shí)間里,微軟公司致力于Vista 系統(tǒng)的推廣,Vista系統(tǒng)的使用人數(shù)正在并將持續(xù)增長(zhǎng)。但是,盡管微軟公司對(duì)包括Vista 在內(nèi)的眾多操作系統(tǒng)的安全進(jìn)行改進(jìn),但這些操作系統(tǒng)仍然存在著較大的安全隱患。目前 我國(guó)計(jì)算機(jī)用戶(hù)基本上使用的是Windows操作系統(tǒng),以XP系統(tǒng)最為普遍,Vista系統(tǒng)在我 國(guó)的使用量也將會(huì)大幅度增加,所以更應(yīng)對(duì)其安全問(wèn)題足夠重視。
目前對(duì)計(jì)算機(jī)上的病毒、木馬等惡意軟件的檢測(cè)方法大致分為三種基于惡意軟件特 征的檢測(cè)、基于惡意軟件行為的檢測(cè)以及基于惡意軟件實(shí)現(xiàn)技術(shù)的檢測(cè)。前兩種方法是目 甜殺毒軟件廣泛采取的方法,但是由于計(jì)算機(jī)惡意軟件的種類(lèi)繁多,行為各異,這兩種方 法難以檢測(cè)出所有的惡意軟件;而且這兩種方法都只能對(duì)已經(jīng)出現(xiàn)并掌握其特征的惡意軟 件進(jìn)行檢測(cè),難以在未知惡意軟件進(jìn)入系統(tǒng)的初期進(jìn)行檢測(cè)。所以針對(duì)惡意軟件實(shí)現(xiàn)技術(shù) 的檢測(cè)逐漸發(fā)展起來(lái)。
惡意軟件最常見(jiàn)的實(shí)現(xiàn)技術(shù)是鉤子技術(shù),通過(guò)使用鉤子技術(shù),惡意軟件可以改變操作 系統(tǒng)正常的執(zhí)行路徑,從而破壞系統(tǒng)或者竊取用戶(hù)信息。在不久前出現(xiàn)的惡意軟件rootkit (一種惡意軟件使用的具有"隱形"能力的工具包、庫(kù)或者程序代碼,用來(lái)隱藏或偽裝惡意 軟件使用的文件、目錄和進(jìn)程)中,更是大量地使用了鉤子技術(shù),達(dá)到隱藏惡意軟件和攻 擊者蹤跡的效果。
根據(jù)運(yùn)行環(huán)境的不同,鉤子可以分為用戶(hù)級(jí)鉤子和內(nèi)核級(jí)鉤子,在Windows操作系統(tǒng)中,主要包含以下種類(lèi)的鉤子。
1. 用戶(hù)級(jí)鉤子
在Windows系統(tǒng)中,大多數(shù)進(jìn)程都依賴(lài)于三個(gè)子系統(tǒng)Win32、 POSIX和OS\2子系 統(tǒng),這些子系統(tǒng)由一些文件組成,它們以地址表的形式提供了一組應(yīng)用程序編程接口 (API),用戶(hù)進(jìn)程可以通過(guò)地址表中的函數(shù)入口地址調(diào)用API請(qǐng)求操作系統(tǒng)的服務(wù),所 以這些地址表所在的文件是惡意軟件攻擊的極佳目標(biāo)。根據(jù)地址表的不同,惡意軟件使用 的鉤子可以分為導(dǎo)入地址表鉤子、導(dǎo)出地址表鉤子、內(nèi)聯(lián)函數(shù)鉤子、系統(tǒng)可執(zhí)行文件及DLL 鉤子等,惡意軟件一般在用戶(hù)態(tài)下替換或修改包含這些地址表的文件來(lái)設(shè)置這些鉤子。
2. 內(nèi)核級(jí)鉤子
當(dāng)用戶(hù)進(jìn)程調(diào)用API進(jìn)入Windows內(nèi)核后,通過(guò)系統(tǒng)服務(wù)描述符表(System Service Descriptor Table, SSDT),中斷描述符表(Interrupt Descriptor Table, IDT)等跳轉(zhuǎn)表進(jìn)一 步調(diào)用不同的內(nèi)核系統(tǒng)服務(wù)函數(shù),所以惡意程序通過(guò)修改內(nèi)核中的這些跳轉(zhuǎn)表來(lái)設(shè)置不同 種類(lèi)的內(nèi)核鉤子。在Windows內(nèi)核中,惡意軟件使用的鉤子主要有
* IDT鉤子
IDT中包含了異常和中斷處理函數(shù)的入口地址,惡意軟件修改IDT,把系統(tǒng)的處理程 序替換為其提供的非法程序。
* SSDT鉤子
SSDT記錄著所有內(nèi)核系統(tǒng)服務(wù)函數(shù)的入口地址,惡意軟件通過(guò)修改SSDT表項(xiàng)而改 變內(nèi)核系統(tǒng)服務(wù)函數(shù)的處理過(guò)程。
* IRP函數(shù)表鉤子
IRP函數(shù)是驅(qū)動(dòng)程序用來(lái)處理用戶(hù)各種請(qǐng)求的,例如讀、寫(xiě)、査詢(xún)等。IRP函數(shù)表里 記錄這IRP函數(shù)的入口地址,攻擊者也可以替換IRP函數(shù)表的一些表項(xiàng)達(dá)到惡意目的。
目前針對(duì)用戶(hù)級(jí)和內(nèi)核級(jí)鉤子的檢測(cè)方法,使用執(zhí)行指令數(shù)分析的技術(shù),這種方法認(rèn) 為如果在跳轉(zhuǎn)表上設(shè)置了鉤子,那么在執(zhí)行某些常規(guī)的系統(tǒng)函數(shù)和庫(kù)函數(shù)時(shí),將會(huì)執(zhí)行額 外的指令。于是這種方法通過(guò)比較待檢測(cè)系統(tǒng)和正常系統(tǒng)在運(yùn)行某個(gè)系統(tǒng)調(diào)用的指令數(shù)差 別來(lái)分析是否被設(shè)置了鉤子。這種基于統(tǒng)計(jì)的方法,存在一定的誤差,并且即使正常系統(tǒng) 多次執(zhí)行某個(gè)系統(tǒng)調(diào)用的指令數(shù)也會(huì)有差別,造成了這種方法的誤差較大。目前也存在對(duì) 內(nèi)核鉤子的檢測(cè)方法,但是基本上只針對(duì)某一種跳轉(zhuǎn)表進(jìn)行檢測(cè),由于鉤子種類(lèi)繁多,這 種方法難以將所有鉤子的檢測(cè)覆蓋全面。單就Windows Vista而言,由于其操作系統(tǒng)發(fā)行時(shí)間較短,目前尤其缺乏對(duì)其進(jìn)行鉤子檢測(cè)的技術(shù)和工具。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有技術(shù)中存在的問(wèn)題,提供一種Windows操作系統(tǒng)下針對(duì)用 戶(hù)級(jí)鉤子的檢測(cè)方法和恢復(fù)方法,從而有效地防護(hù)基于鉤子的計(jì)算機(jī)惡意軟件。同時(shí),本 發(fā)明還提供針對(duì)內(nèi)核級(jí)鉤子的檢測(cè)和恢復(fù)方法。
具體來(lái)說(shuō),本發(fā)明針對(duì)用戶(hù)級(jí)鉤子的檢測(cè)與恢復(fù)方法包括下列步驟(檢測(cè)方法包括步 驟a和b,恢復(fù)方法包括步驟a, b和c):
a) 計(jì)算標(biāo)準(zhǔn)操作系統(tǒng)的一個(gè)或多個(gè)設(shè)定的系統(tǒng)文件的hash值并儲(chǔ)存,若某個(gè)系統(tǒng)文 件存在多個(gè)版本,則分別計(jì)算各個(gè)版本文件的hash值并儲(chǔ)存。
所述"設(shè)定的系統(tǒng)文件"可以是,比如,Windows系統(tǒng)目錄下System32和System目錄 中的全部文件或者一部分重要系統(tǒng)文件。
所述hash值優(yōu)選通過(guò)下列hash算法中的任意一種獲得MD5、 SHA-1、 RIPEMD-160、 或HMAC。
所述hash值優(yōu)選以XML的格式儲(chǔ)存于本地,或通過(guò)http或ftp協(xié)議儲(chǔ)存于遠(yuǎn)程服務(wù)器。
b) 計(jì)算待檢測(cè)操作系統(tǒng)的所述系統(tǒng)文件的hash值,若某個(gè)系統(tǒng)文件的hash值和對(duì)應(yīng) 的步驟a所述一個(gè)或多個(gè)版本的hash值都不相同,則所述系統(tǒng)文件被設(shè)置了鉤子,從而可 以斷定所述待檢測(cè)操作系統(tǒng)被設(shè)置了鉤子。
也就是說(shuō),在本步驟的比較過(guò)程中,只要某個(gè)系統(tǒng)文件的hash值和步驟a中的多版本 hash值中的其中一個(gè)匹配即可;采用這種方式可以有效地避免因系統(tǒng)文件的版本不同帶來(lái) 的問(wèn)題。
為了提高h(yuǎn)ash值比較過(guò)程的效率,可考慮將hash值儲(chǔ)存于同一目錄作順序排列,在 比較時(shí)使用寬度優(yōu)先方式進(jìn)行系統(tǒng)目錄的遍歷。
優(yōu)選將本步驟的檢測(cè)(比較)結(jié)果保存于日志,以供系統(tǒng)管理員進(jìn)行分析。
c) 用標(biāo)準(zhǔn)操作系統(tǒng)的相應(yīng)版本的系統(tǒng)文件替換步驟b所述被設(shè)置了鉤子的系統(tǒng)文件。 同樣優(yōu)選將本步驟的替換結(jié)果保存于日志,以供系統(tǒng)管理員進(jìn)行分析。 本發(fā)明所述Windows操作系統(tǒng)可以是各個(gè)版本的Windows XP操作系統(tǒng)或Windows
Vista操作系統(tǒng)等。其中對(duì)于Windows XP操作系統(tǒng),其版本包括Windows XP HomeEdition(家庭版),Windows XP Professional Edition(專(zhuān)業(yè)版),Windows XP 64-Bit Edition(64 位版);對(duì)于Windows Vista操作系統(tǒng),其版本包括Windows Vista Starter 2007 (初級(jí)版 本),Windows Vista Home Basic (初級(jí)家庭版),Windows Vista Home Premium (增強(qiáng) 家庭版),Windows Vista Ultimate (終極版),Windows Vista Small Business (小型商務(wù) 版),Windows Vista Business (商務(wù)版),Windows Vista Enterprise (企業(yè)版)。
進(jìn)一步,本發(fā)明針對(duì)內(nèi)核級(jí)鉤子的檢測(cè)與恢復(fù)方法包括下列步驟(檢測(cè)方法包括步驟 i-iv,恢復(fù)方法包括步驟i-v):
i. 對(duì)于待檢測(cè)操作系統(tǒng),獲得系統(tǒng)內(nèi)核中已加載的所有模塊的信息,所述信息包括 所述模塊加載到內(nèi)存中的起始地址和終止地址;
優(yōu)選地,通過(guò)使用系統(tǒng)調(diào)用NtQuerySystemlnformation獲得系統(tǒng)內(nèi)核中已加載的所有 模塊的信息。
ii. 獲得系統(tǒng)內(nèi)核中的跳轉(zhuǎn)表的基地址,從而獲得所述跳轉(zhuǎn)表;
優(yōu)選地,通過(guò)系統(tǒng)內(nèi)核未導(dǎo)出的數(shù)據(jù)結(jié)構(gòu)或匯編指令獲得所述內(nèi)核跳轉(zhuǎn)表的基地址。
iii. 遍歷所述跳轉(zhuǎn)表中的各個(gè)表項(xiàng),對(duì)于每個(gè)表項(xiàng),獲得所述表項(xiàng)指向的地址,并根 據(jù)歩驟i所述起始地址和終止地址判斷所述地址所屬的內(nèi)核模塊;
iv. 若所述內(nèi)核模塊不是合法的系統(tǒng)模塊,則所述地址不合法,則所述待檢測(cè)操作系 統(tǒng)被設(shè)置了鉤子,其原因在于系統(tǒng)內(nèi)核中跳轉(zhuǎn)表的每個(gè)表項(xiàng)均指向一些固定的模塊,如 SSDT的表項(xiàng)全部位于ntoskmal.exe內(nèi)核模塊中,irp表的表項(xiàng)指向改irp所屬的驅(qū)動(dòng)程序 等,當(dāng)這樣的指向關(guān)系和常規(guī)不符時(shí),被認(rèn)為是不合法的。
優(yōu)選將本步驟的檢測(cè)結(jié)果保存于日志,以供系統(tǒng)管理員進(jìn)行分析。
v. 通過(guò)系統(tǒng)調(diào)用號(hào)或中斷向量號(hào),在提供系統(tǒng)調(diào)用或中斷處理函數(shù)的系統(tǒng)模塊中獲 得正確的系統(tǒng)調(diào)用或中斷處理函數(shù)的入口地址,并用所述入口地址替換所述表項(xiàng)的不合法 的地址。
同樣優(yōu)選將本步驟的替換結(jié)果保存于日志,以供系統(tǒng)管理員進(jìn)行分析。 在上述步驟ii中,所述跳轉(zhuǎn)表優(yōu)選為系統(tǒng)服務(wù)描述符表(SSDT),中斷描述符表(IDT)
和/或I/O請(qǐng)求包表。當(dāng)所述跳轉(zhuǎn)表為系統(tǒng)服務(wù)描述符表時(shí),步驟ii通過(guò) KeServiceDescriptorTable或KeServieDescriptorTableShadow得到所述系統(tǒng)服務(wù)描述符表的 基地址;當(dāng)所述跳轉(zhuǎn)表為中斷描述符表時(shí),步驟ii通過(guò)sidt指令得到所述中斷描述符表的 基地址;當(dāng)所述跳轉(zhuǎn)表為I/O請(qǐng)求包表,步驟ii通過(guò)IoGetDeviceObjectPointer函數(shù)獲得設(shè)備的對(duì)象指針,然后通過(guò)訪(fǎng)問(wèn)該對(duì)象的MajorFuction數(shù)組獲得I/O請(qǐng)求處理函數(shù)的地址得
到所述I/O請(qǐng)求包表的基地址。
本發(fā)明根據(jù)不同種類(lèi)鉤子的特點(diǎn),分別在用戶(hù)態(tài)和內(nèi)核態(tài)進(jìn)行鉤子檢測(cè)及恢復(fù),具有 兩個(gè)優(yōu)點(diǎn), 一是對(duì)鉤子進(jìn)行全面檢測(cè);二是考慮到用戶(hù)和內(nèi)核交互的整個(gè)過(guò)程,對(duì)這個(gè)過(guò) 程中可能出現(xiàn)的所有類(lèi)型鉤子進(jìn)行檢測(cè),防止惡意軟件通過(guò)在某個(gè)環(huán)節(jié)設(shè)置鉤子來(lái)破壞系統(tǒng)。
圖1表示本發(fā)明實(shí)施例的鉤子檢測(cè)和恢復(fù)設(shè)備結(jié)構(gòu)示意圖2表示用戶(hù)級(jí)鉤子檢測(cè)和恢復(fù)方法流程圖3表示內(nèi)核跳轉(zhuǎn)表結(jié)構(gòu)圖4表示內(nèi)核級(jí)鉤子檢測(cè)和恢復(fù)方法流程圖。
具體實(shí)施例方式
下面結(jié)合附圖,通過(guò)實(shí)施例對(duì)本發(fā)明作進(jìn)一步描述。
圖l表示本發(fā)明實(shí)施例的鉤子檢測(cè)和恢復(fù)設(shè)備結(jié)構(gòu)示意圖。如圖1所示,用戶(hù)級(jí)鉤子 檢測(cè)恢復(fù)模塊、管理模塊和日志模塊運(yùn)行于Windows Vista操作系統(tǒng)用戶(hù)態(tài)(ring 3),內(nèi) 核級(jí)鉤子檢測(cè)恢復(fù)模塊運(yùn)行于操作系統(tǒng)內(nèi)核態(tài)(ring0)。用戶(hù)級(jí)鉤子檢測(cè)恢復(fù)模塊和內(nèi)核 級(jí)鉤子檢測(cè)恢復(fù)模塊分別對(duì)用戶(hù)級(jí)鉤子和內(nèi)核級(jí)鉤子進(jìn)行檢測(cè)和恢復(fù);日志模塊負(fù)責(zé)對(duì)檢 測(cè)和恢復(fù)日志進(jìn)行記錄和管理;管理模塊負(fù)責(zé)加載內(nèi)核鉤子檢測(cè)恢復(fù)模塊到操作系統(tǒng)內(nèi) 核,并接收內(nèi)核鉤子檢測(cè)恢復(fù)模塊的檢測(cè)結(jié)果,將該結(jié)果傳送到日志模塊;管理模塊和內(nèi) 核鉤子檢測(cè)恢復(fù)模塊通過(guò)通信模塊進(jìn)行通信,通信模塊使用DeviceIoControl實(shí)現(xiàn)。
1、用戶(hù)級(jí)鉤子檢測(cè)和恢復(fù)方法
用戶(hù)級(jí)鉤子檢測(cè)和恢復(fù)模塊釆用了 hash (在此以MD5算法為例)來(lái)獲取和校驗(yàn)系統(tǒng) 文件的數(shù)字指紋,使用xml文件來(lái)保存在不同的版本和補(bǔ)丁影響下每個(gè)Windows Vista系 統(tǒng)文件的標(biāo)準(zhǔn)MD5值,并針對(duì)Windows補(bǔ)丁發(fā)布的特點(diǎn)設(shè)計(jì)了 Windows補(bǔ)丁追蹤系統(tǒng)來(lái) 即時(shí)更新最新發(fā)布補(bǔ)丁的MD5值;在發(fā)現(xiàn)系統(tǒng)文件被設(shè)置了鉤子之后,從服務(wù)器下載對(duì) 應(yīng)版本的系統(tǒng)文件對(duì)本地文件進(jìn)行替換。從而實(shí)現(xiàn)用戶(hù)級(jí)鉤子的檢測(cè)和恢復(fù),具體步驟如下
1) 在標(biāo)準(zhǔn)Windows Vista操作系統(tǒng)上選取若干重要的系統(tǒng)文件,使用MD5 hash算法 生成各個(gè)版本系統(tǒng)文件的hash值。此處所述的系統(tǒng)文件,包括C:\Windows\System32和 C:\Windows\System下的所有文件;所述版本包括Windows Vista的各個(gè)版本,如Windows Vista Ultimate , Windows Vista Business等。
在得到所有版本的系統(tǒng)文件MD5值之后,需要將其組織起來(lái)以方便査找,可以使用 XML (全稱(chēng)為extension Markup Language)文件來(lái)存放每一個(gè)系統(tǒng)文件可能的MD5值。
在保存MD5值的xml文件中,應(yīng)該為每個(gè)系統(tǒng)文件建立一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)應(yīng)該包 括如下信息-
系統(tǒng)文件的全路徑名,如C:\WINNT\system\SHELL32.dll。 系統(tǒng)文件可缺失標(biāo)識(shí)yes為可缺失,no為不可缺失。
系統(tǒng)文件MD5值列表即為一個(gè)變長(zhǎng)的列表,把該文件在正常系統(tǒng)中可能出現(xiàn)的所 有MD5列出來(lái)。
根據(jù)以上的描述,設(shè)計(jì)出來(lái)的xml的DTD描述如下 <!ELEMENTfile (path,optional,MD5*) >
〈!ELEMENT path (#PCDATA) > <!—full path name of a system file —> <!ELEMENT optional (#PCDATA) > <! —if this system file is necessary —> <!ELEMENT MD5 (#PCDATA) > <! -- MD5 value of this file —> 根據(jù)該DTD,所生成的xml文件示例如下 <file>
<path>WINDOWS\system32\oobe\msobcomni.dll</path> <optional>yes</optional>
<MD5>727178fd5 89e 15ffc8beceeb03 7d6128</MD5> <MD5>f 1 d4bbae611 ff716b4af73b8affe95d8</MD5> </file>
2) 用戶(hù)級(jí)鉤子檢測(cè)恢復(fù)模塊遍歷上述步驟1所選取的重要系統(tǒng)文件。為了提高M(jìn)D5 值査找效率,將相同目錄下的文件的MD5值順序排列,并使用寬度優(yōu)先策略進(jìn)行搜索。 在遍歷的過(guò)程中,計(jì)算遍歷到的文件的MD5值,然后和從服務(wù)器下載到的標(biāo)準(zhǔn)值進(jìn)行比 較,從而檢測(cè)到被修改的系統(tǒng)文件。結(jié)合圖2,具體檢測(cè)和恢復(fù)的步驟描述如下
(1) 開(kāi)始檢測(cè)前,從服務(wù)器上下載系統(tǒng)文件的標(biāo)準(zhǔn)MD5值文件。
(2) 創(chuàng)建一個(gè)隊(duì)列(TC—Queue)來(lái)保存待處理的目錄,并將要遍歷的根目錄(rootDir)添加到隊(duì)列中。
(3) 如果隊(duì)列為空,則遍歷結(jié)束進(jìn)入(6),否則進(jìn)入(4)處理下一個(gè)目錄。
(4) 取出當(dāng)前隊(duì)列頭的目錄節(jié)點(diǎn)(tempDir),依次取出該目錄所有下一級(jí)元素 (tempElem)(子目錄或文件),取到tempElem就進(jìn)入(5);否則說(shuō)明tempDir已經(jīng)處理
完畢,進(jìn)入(3)繼續(xù)進(jìn)行。
(5) 處理tempElem,如果tempElem是子目錄就進(jìn)入a);否則進(jìn)入a)。
a) 將tempElem加入到TC—Stack中,便于將來(lái)處理;
b) 對(duì)tempElem文件進(jìn)行MD5校驗(yàn),并記錄日志;
c) 如果校驗(yàn)值不符合,刪除此系統(tǒng)文件;
d) 從服務(wù)器下載對(duì)應(yīng)系統(tǒng)文件進(jìn)行替換,恢復(fù)原有系統(tǒng)。
(6) 結(jié)束遍歷,進(jìn)入下一步統(tǒng)計(jì)處理工作。
(7) 以上歩驟的檢測(cè)結(jié)果和替換結(jié)果保存于日志,以供系統(tǒng)管理員進(jìn)行分析。 2、內(nèi)核級(jí)鉤子的檢測(cè)和恢復(fù)方法
內(nèi)核跳轉(zhuǎn)表(如圖3所示)的每個(gè)表項(xiàng)包含一個(gè)地址,這個(gè)地址指向了處理該表項(xiàng)所 在編號(hào)的系統(tǒng)服務(wù)、中斷處理程序等程序的位置。每個(gè)跳轉(zhuǎn)表中的所有地址一般在內(nèi)核的 某個(gè)或若干個(gè)內(nèi)核模塊中,本發(fā)明利用這個(gè)特點(diǎn),通過(guò)分析這些地址的可信性來(lái)分析是否
被設(shè)置了鉤子。
如圖4所示,內(nèi)核級(jí)鉤子的檢測(cè)和恢復(fù)的具體步驟描述如下
1) 管理模塊將內(nèi)核鉤子檢測(cè)恢復(fù)模塊加載到內(nèi)核。將內(nèi)核鉤子檢測(cè)恢復(fù)模塊實(shí)現(xiàn)為 Windows驅(qū)動(dòng)程序形式,使用Windows提供的API將其導(dǎo)入到內(nèi)核執(zhí)行。
2) 初始化內(nèi)核和用戶(hù)通信模塊。通信模塊使用DeviceIoControl接口將內(nèi)核獲得的信
息傳送至用戶(hù)態(tài)。
3) 獲取已加載到內(nèi)核中的模塊的信息。定義一個(gè)結(jié)構(gòu)來(lái)存放系統(tǒng)模塊信息 typedef struct —SYSTEM—MODULE—INFORMATION
PVOID Base; ULONG Size;
CHAR ImageName[256]; 〃模塊名} SYSTEM—MODULE—INFORMATION, *PSYSTEM—MODULE—INFORMATION; 其中Base為模塊導(dǎo)入到內(nèi)存中的基地址,Size為模塊大小,該內(nèi)核模塊位于[Base, Base + Size]之間。
調(diào)用NtQuerySystemlnformation函數(shù)獲得己加載內(nèi)核模塊的信息。
4) 獲得內(nèi)核跳轉(zhuǎn)表的地址。通過(guò)一些Windows內(nèi)核未導(dǎo)出的數(shù)據(jù)結(jié)構(gòu)或某些匯編指 令獲得內(nèi)核跳轉(zhuǎn)表的基地址。如使用Windows內(nèi)核未導(dǎo)出的數(shù)據(jù)結(jié)構(gòu) KeServiceDescriptionTable可以獲得SSDT的基地址;使用sidt指令可以獲得IDT的基地址; 使用IoGetDeviceObjectPointer函數(shù)獲得設(shè)備的對(duì)象指針,然后通過(guò)訪(fǎng)問(wèn)該對(duì)象的 MajorFuction數(shù)組獲得I/O請(qǐng)求處理函數(shù)的地址。
5) 遍歷跳轉(zhuǎn)表的表項(xiàng),分析表項(xiàng)中的地址是否合法,從而可以檢測(cè)出該跳轉(zhuǎn)表是否 被設(shè)置了鉤子。
6) 如果設(shè)置了鉤子,進(jìn)行恢復(fù)的步驟如下
a) 通過(guò)系統(tǒng)調(diào)用號(hào)或中斷向量號(hào),在提供系統(tǒng)調(diào)用或中斷處理函數(shù)的系統(tǒng)模塊中 得出原系統(tǒng)調(diào)用或中斷處理函數(shù)的地址;
b) 用該入口地址替換所述表項(xiàng)中不合法的地址。
7) 將檢測(cè)和替換結(jié)果寫(xiě)入曰志。
權(quán)利要求
1.一種Windows操作系統(tǒng)下鉤子的檢測(cè)方法,包括下列用戶(hù)級(jí)檢測(cè)方法a)計(jì)算標(biāo)準(zhǔn)操作系統(tǒng)的一個(gè)或多個(gè)設(shè)定的系統(tǒng)文件的hash值并儲(chǔ)存,若某個(gè)系統(tǒng)文件存在多個(gè)版本,則分別計(jì)算各個(gè)版本文件的hash值并儲(chǔ)存;b)計(jì)算待檢測(cè)操作系統(tǒng)的所述系統(tǒng)文件的hash值,若某個(gè)系統(tǒng)文件的hash值和對(duì)應(yīng)的步驟a所述一個(gè)或多個(gè)版本的hash值都不相同,則所述系統(tǒng)文件被設(shè)置了鉤子,則所述待檢測(cè)操作系統(tǒng)被設(shè)置了鉤子。
2. 如權(quán)利要求1所述的檢測(cè)方法,其特征在于,所述用戶(hù)級(jí)檢測(cè)方法還包括c) 用標(biāo)準(zhǔn)操作系統(tǒng)的相應(yīng)版本的系統(tǒng)文件替換步驟b所述被設(shè)置了鉤子的系統(tǒng)文件。
3. 如權(quán)利要求1或2所述的檢測(cè)方法,其特征在于,所述設(shè)定的系統(tǒng)文件是系統(tǒng)目錄下 System32和System目錄中的所有文件。
4. 如權(quán)利要求1或2所述的檢測(cè)方法,其特征在于,所述hash值通過(guò)MD5、 SHA-l、 RIPEMD-160或HMAC法計(jì)算。
5. 如權(quán)利要求1或2所述的檢測(cè)方法,其特征在于,步驟a所述hash值以XML的格式儲(chǔ)存。
6. 如權(quán)利要求1或2所述的檢測(cè)方法,其特征在于,步驟a所述hash值儲(chǔ)存于本地,或 通過(guò)http或ftp協(xié)議儲(chǔ)存于遠(yuǎn)程服務(wù)器。
7. 如權(quán)利要求2所述的檢測(cè)方法,其特征在于,將歩驟b的檢測(cè)結(jié)果和步驟c的替換結(jié)果保存于日志。
8. 如權(quán)利要求1或2所述的檢測(cè)方法,其特征在于,所述Windows操攤系統(tǒng)是Windows XP操作系統(tǒng)或Windows Vista操作系統(tǒng)。
9. 如權(quán)利要求1或2所述的檢測(cè)方法,其特征在于,還包括下列內(nèi)核級(jí)檢測(cè)方法i. 對(duì)于待檢測(cè)操作系統(tǒng),獲得系統(tǒng)內(nèi)核中已加載的所有模塊的信息,所述信息包括 所述模塊加載到內(nèi)存中的起始地址和終止地址;ii. 獲得系統(tǒng)內(nèi)核中的跳轉(zhuǎn)表的基地址,從而獲得所述跳轉(zhuǎn)表;iii. 遍歷所述跳轉(zhuǎn)表中的各個(gè)表項(xiàng),對(duì)于每個(gè)表項(xiàng),獲得所述表項(xiàng)中的地址,并根據(jù) 步驟i所述的起始地址和終止地址判斷所述地址所屬的內(nèi)核模塊;W.若所述內(nèi)核模塊不是合法的系統(tǒng)模塊,則所述地址不合法,則所述待檢測(cè)操作系 統(tǒng)被設(shè)置了鉤子。
10. 如權(quán)利要求9所述的檢測(cè)方法,其特征在于,所述內(nèi)核級(jí)檢測(cè)方法還包括V.通過(guò)系統(tǒng)調(diào)用號(hào)或中斷向量號(hào),在提供系統(tǒng)調(diào)用或中斷處理函數(shù)的系統(tǒng)模塊中獲得正確的系統(tǒng)調(diào)用或中斷處理函數(shù)的入口地址,并用所述入口地址替換所述表項(xiàng)的不合法 的地址。
全文摘要
本發(fā)明公開(kāi)了一種Windows操作系統(tǒng)下鉤子的檢測(cè)方法,屬于信息安全技術(shù)領(lǐng)域。本發(fā)明方法包括a)計(jì)算標(biāo)準(zhǔn)操作系統(tǒng)的一個(gè)或多個(gè)設(shè)定的系統(tǒng)文件的hash值并儲(chǔ)存,若某個(gè)系統(tǒng)文件存在多個(gè)版本,則分別計(jì)算各個(gè)版本文件的hash值并儲(chǔ)存;b)計(jì)算待檢測(cè)操作系統(tǒng)的所述系統(tǒng)文件的hash值,若某個(gè)系統(tǒng)文件的hash值和對(duì)應(yīng)的步驟a所述一個(gè)或多個(gè)版本的hash值都不相同,則所述系統(tǒng)文件被設(shè)置了鉤子,則所述待檢測(cè)操作系統(tǒng)被設(shè)置了鉤子。本發(fā)明方法還可包括c)用標(biāo)準(zhǔn)操作系統(tǒng)的相應(yīng)版本的系統(tǒng)文件替換步驟b所述被設(shè)置了鉤子的系統(tǒng)文件。本發(fā)明方法可用于在Windows操作系統(tǒng)下檢測(cè)基于鉤子技術(shù)的惡意軟件。
文檔編號(hào)G06F21/22GK101620659SQ20091008825
公開(kāi)日2010年1月6日 申請(qǐng)日期2009年7月14日 優(yōu)先權(quán)日2009年7月14日
發(fā)明者白光冬, 霞 趙, 耀 郭, 陳向群 申請(qǐng)人:北京大學(xué)