本發(fā)明屬于計(jì)算機(jī)操作系統(tǒng)內(nèi)核安全
技術(shù)領(lǐng)域:
:,具體涉及一種基于虛擬化技術(shù)針對(duì)linux內(nèi)核的輕量級(jí)結(jié)構(gòu)化的保護(hù)方法及裝置。
背景技術(shù):
::隨著計(jì)算機(jī)系統(tǒng)越來(lái)越廣泛的使用,計(jì)算機(jī)系統(tǒng)的安全問(wèn)題被廣泛關(guān)注。計(jì)算機(jī)系統(tǒng)的安全有多個(gè)層次和方面,而在傳統(tǒng)的軟件棧中操作系統(tǒng)內(nèi)核是處于最底層,是整個(gè)計(jì)算機(jī)系統(tǒng)的基礎(chǔ),因此操作系統(tǒng)內(nèi)核安全尤為重要。linux操作系統(tǒng)內(nèi)核是極其龐大和復(fù)雜的,對(duì)其進(jìn)行全方位保護(hù)需要的開銷極大,并且保護(hù)方案難以實(shí)現(xiàn)和確保全面性。已有的技術(shù)多是針對(duì)抵御特定類型的攻擊和防護(hù)特定類型的結(jié)構(gòu),提供單一側(cè)面的內(nèi)核保護(hù)。技術(shù)實(shí)現(xiàn)要素:本發(fā)明要解決的技術(shù)問(wèn)題是以較小的性能代價(jià)提升linux內(nèi)核整體的安全性而不僅僅是某個(gè)單一側(cè)面的保護(hù)。為了解決上述問(wèn)題,本發(fā)明提出了一種基于虛擬化技術(shù)針對(duì)linux內(nèi)核的輕量級(jí)結(jié)構(gòu)化的保護(hù)方法,包括:將linux內(nèi)核結(jié)構(gòu)化為兩個(gè)部分——關(guān)鍵保護(hù)結(jié)構(gòu)和非關(guān)鍵保護(hù)結(jié)構(gòu)。對(duì)關(guān)鍵保護(hù)結(jié)構(gòu)進(jìn)行重點(diǎn)保護(hù),而對(duì)非關(guān)鍵保護(hù)結(jié)構(gòu)進(jìn)行可選擇性保護(hù)。對(duì)于linux內(nèi)核結(jié)構(gòu)化的劃分,本發(fā)明以linux安全模塊(linuxsecuritymodule,lsm)為基礎(chǔ),將其作為關(guān)鍵保護(hù)結(jié)構(gòu)的重點(diǎn),然后以此展開,將與lsm密切相關(guān)的結(jié)構(gòu)都作為關(guān)鍵保護(hù)結(jié)構(gòu)。這些結(jié)構(gòu)包括lsm框架中的security_hook_heads、各個(gè)安全模塊中的security_hook_list、系統(tǒng)調(diào)用表sys_call_table與ia32_sys_call_table、中斷向量表idt_table與debug_idt_table以及trace_idt_table、內(nèi)核中所有代碼和與前述結(jié)構(gòu)相關(guān)的頁(yè)表項(xiàng)。本方法監(jiān)控針對(duì)上述關(guān)鍵保護(hù)結(jié)構(gòu)的修改動(dòng)作。監(jiān)控的原則包括:通過(guò)清除虛擬機(jī)擴(kuò)展頁(yè)表(extendpagetable,ept)里受保護(hù)數(shù)據(jù)結(jié)構(gòu)相關(guān)頁(yè)表項(xiàng)中的寫權(quán)限位,防止security_hook_heads、security_hook_list、系統(tǒng)調(diào)用表、中斷向量表被更改。通過(guò)清除ept里內(nèi)核代碼(包括內(nèi)核模塊代碼)相關(guān)頁(yè)表項(xiàng)中的寫權(quán)限位,捕捉對(duì)內(nèi)核代碼的更改行為,對(duì)更改進(jìn)行檢測(cè)。當(dāng)檢測(cè)認(rèn)為符合內(nèi)核中任意特性對(duì)內(nèi)核代碼的修改行為后,模擬指令使對(duì)內(nèi)核代碼的修改生效。通過(guò)清除與受保護(hù)頁(yè)表項(xiàng)相關(guān)的ept里的頁(yè)表項(xiàng)中的寫權(quán)限,捕捉對(duì)受保護(hù)頁(yè)表項(xiàng)的修改,檢查修改是否保證了其映射不被改變以及權(quán)限設(shè)置滿足代碼完整性的要求。對(duì)經(jīng)過(guò)檢查的修改經(jīng)過(guò)指令模擬,完成相應(yīng)的修改。本發(fā)明還提供了一種linux內(nèi)核輕量級(jí)結(jié)構(gòu)化保護(hù)裝置,包括:?jiǎn)?dòng)模塊,用于本裝置的啟動(dòng)過(guò)程和初始化的管理。當(dāng)linux內(nèi)核啟動(dòng)完畢且各個(gè)啟動(dòng)階段應(yīng)該別加載的模塊加載完畢之后,本專利提出的裝置將以模塊的形式進(jìn)入到內(nèi)核當(dāng)中執(zhí)行。本裝置將建立虛擬化的執(zhí)行環(huán)境,然后將當(dāng)前在物理機(jī)上運(yùn)行的操作系統(tǒng)內(nèi)核遷移到剛建立的虛擬機(jī)中去,接著通過(guò)這個(gè)虛擬機(jī)對(duì)操作系統(tǒng)內(nèi)核進(jìn)行監(jiān)控。虛擬機(jī)管理模塊,用于維護(hù)虛擬機(jī)的虛擬執(zhí)行環(huán)境,提供本裝置到虛擬機(jī)的切換,處理虛擬機(jī)切換到本裝置后的虛擬機(jī)狀態(tài)記錄以及根據(jù)虛擬機(jī)退出原因進(jìn)行任務(wù)分發(fā),維護(hù)和更改ept中權(quán)限設(shè)置。保護(hù)結(jié)構(gòu)管理模塊,用于記錄被保護(hù)結(jié)構(gòu)在虛擬機(jī)中的虛擬地址和物理地址以及虛擬地址與物理地址的關(guān)系,管理被保護(hù)結(jié)構(gòu)的增加與刪除,維護(hù)保護(hù)結(jié)構(gòu)與策略函數(shù)關(guān)系。本發(fā)明所述“策略函數(shù)”是指保護(hù)結(jié)構(gòu)權(quán)限違背后需要采取的應(yīng)對(duì)措施,包括但不限于數(shù)據(jù)策略、代碼策略和頁(yè)表策略。指令解析與模擬模塊,用于對(duì)機(jī)器指令進(jìn)行解析,輔助策略函數(shù)判斷指令會(huì)對(duì)內(nèi)存產(chǎn)生的修改,模擬指令讓指令生效。數(shù)據(jù)策略模塊,用于對(duì)被保護(hù)的數(shù)據(jù)變更進(jìn)行攔截。代碼策略模塊,用于對(duì)被保護(hù)的代碼變更進(jìn)行檢查,判定修改的合法性,攔截非法的修改,模擬合法的修改以使修改生效。頁(yè)表策略模塊,用于對(duì)被保護(hù)的頁(yè)表項(xiàng)變更進(jìn)行檢查,判定修改的合法性,攔截非法的修改,模擬合法的修改以使修改生效。與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是:本發(fā)明能夠以較小的性能代價(jià)提升linux內(nèi)核整體的安全性,而不僅僅是某個(gè)單一側(cè)面的保護(hù)。本發(fā)明將內(nèi)核保護(hù)的范圍縮小到了關(guān)鍵保護(hù)結(jié)構(gòu),降低了保護(hù)的對(duì)象規(guī)模,減小了性能開銷。同時(shí)與已有的技術(shù)只針對(duì)特定的攻擊或者具有特定語(yǔ)義的結(jié)構(gòu),本發(fā)明對(duì)代碼、數(shù)據(jù)和控制流的完整性都進(jìn)行了保護(hù),實(shí)現(xiàn)更加全面的防護(hù)。附圖說(shuō)明圖1是頁(yè)表項(xiàng)分類示意圖;圖2是指令更改過(guò)程圖;圖3是安裝本發(fā)明的系統(tǒng)與原生系統(tǒng)的性能對(duì)比圖。具體實(shí)施方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)表達(dá)得更加清楚明白,下面將結(jié)合本發(fā)明實(shí)施實(shí)例中的附圖,對(duì)本發(fā)明再作進(jìn)一步詳細(xì)的說(shuō)明。顯然,所描述的實(shí)施例只是本發(fā)明的一部分實(shí)例,而不是全部的實(shí)施例?;诒景l(fā)明的實(shí)施例,本領(lǐng)域普通技術(shù)人員凡是采用本發(fā)明的設(shè)計(jì)結(jié)構(gòu)和思想而在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。本文是基于針對(duì)intelx86_64架構(gòu)的linux系統(tǒng)的方案,其中所涉及的現(xiàn)有的系統(tǒng)調(diào)用、結(jié)構(gòu)、函數(shù)、處理器特性、寄存器的名稱在本領(lǐng)域均習(xí)慣使用英文,對(duì)于沒(méi)有公認(rèn)中文釋義的名稱,使用中文反而有可能讓本領(lǐng)域技術(shù)人員迷惑;且這些名稱在linux系統(tǒng)和intel處理器中均有特定含義,技術(shù)人員能夠明確各名稱所表示的內(nèi)容,而不會(huì)產(chǎn)生誤解。因此本文中所涉及的linux系統(tǒng)和intel處理器中現(xiàn)有的、無(wú)公認(rèn)中文翻譯的名稱均使用英文表示。本發(fā)明的一個(gè)實(shí)施例描述關(guān)鍵保護(hù)數(shù)據(jù)的保護(hù)方法,對(duì)關(guān)鍵保護(hù)數(shù)據(jù)的修改進(jìn)行攔截;本發(fā)明的又一個(gè)實(shí)施例表述對(duì)頁(yè)表的保護(hù),對(duì)正常的頁(yè)表項(xiàng)修改企圖進(jìn)行檢查后模擬指令完成修改動(dòng)作;本發(fā)明的又一個(gè)實(shí)施例描述內(nèi)核代碼的保護(hù)方法,對(duì)非法的代碼修改企圖進(jìn)行檢查后攔截修改以及對(duì)正常的代碼修改企圖進(jìn)行檢查后模擬指令完成修改動(dòng)作。實(shí)施例一、一種對(duì)關(guān)鍵保護(hù)數(shù)據(jù)的保護(hù)方法,包括:101、在本裝置啟動(dòng)階段,本裝置將初始化執(zhí)行環(huán)境,并將關(guān)鍵保護(hù)數(shù)據(jù)和內(nèi)核代碼(包括內(nèi)核模塊代碼)在內(nèi)的關(guān)鍵保護(hù)結(jié)構(gòu)的地址范圍、相應(yīng)的ept頁(yè)表權(quán)限與各關(guān)鍵保護(hù)結(jié)構(gòu)的策略函數(shù)加入到保護(hù)結(jié)構(gòu)管理模塊中。102、保護(hù)結(jié)構(gòu)管理模塊獲得各個(gè)關(guān)鍵保護(hù)數(shù)據(jù)結(jié)構(gòu)和內(nèi)核代碼以及可加載內(nèi)核模塊代碼的虛擬地址范圍,然后遍歷內(nèi)核頁(yè)表找到這些虛擬地址范圍對(duì)應(yīng)的保護(hù)結(jié)構(gòu)的物理地址范圍,將這些物理地址范圍與各個(gè)相關(guān)的保護(hù)結(jié)構(gòu)關(guān)聯(lián)起來(lái),同時(shí)在遍歷的過(guò)程中找到與關(guān)聯(lián)這些虛擬地址范圍與物理地址范圍的頁(yè)表項(xiàng),并將這些頁(yè)表項(xiàng)對(duì)應(yīng)的物理地址范圍和與之相關(guān)的保護(hù)結(jié)構(gòu)關(guān)聯(lián)起來(lái)。103、保護(hù)結(jié)構(gòu)管理模塊根據(jù)獲得的ept頁(yè)表權(quán)限并通過(guò)虛擬機(jī)管理模塊的設(shè)置,遍歷頁(yè)表得到的保護(hù)結(jié)構(gòu)物理地址范圍所對(duì)應(yīng)的ept頁(yè)表項(xiàng)中的權(quán)限。所有的保護(hù)結(jié)構(gòu)的ept頁(yè)表項(xiàng)權(quán)限都清除了寫權(quán)限。當(dāng)虛擬機(jī)中一個(gè)對(duì)系統(tǒng)調(diào)用表的修改發(fā)生時(shí),這個(gè)修改由于ept中權(quán)限設(shè)置使得虛擬機(jī)切換到宿主機(jī)上,從而虛擬機(jī)管理模塊獲得執(zhí)行。104、虛擬機(jī)管理模塊從虛擬機(jī)控制結(jié)構(gòu)vmcs中獲取虛擬機(jī)退出原因,然后根據(jù)出錯(cuò)原因調(diào)用相應(yīng)的處理函數(shù),從而eptviolation處理函數(shù)得以執(zhí)行。該函數(shù)從vmcs獲得獲取錯(cuò)誤發(fā)生的物理地址,然后根據(jù)物理地址找到對(duì)應(yīng)的保護(hù)結(jié)構(gòu)和類型信息,然后調(diào)用與保護(hù)結(jié)構(gòu)關(guān)聯(lián)的策略函數(shù)。系統(tǒng)調(diào)用表是屬于關(guān)鍵保護(hù)數(shù)據(jù),因此其策略函數(shù)不做任何判定,直接拒絕這次修改,然后通報(bào)此次篡改行為。實(shí)施例二、一種對(duì)頁(yè)表的保護(hù)方法,包括:本實(shí)施例在本裝置的啟動(dòng)階段與實(shí)施例一中步驟101、102和103相同。根據(jù)頁(yè)表項(xiàng)對(duì)應(yīng)結(jié)構(gòu)的不同,本專利將頁(yè)表項(xiàng)進(jìn)行了分類,如圖1所示(其中pgd表示全局頁(yè)目錄,pmd表示中間目錄,pte表示頁(yè)表項(xiàng),pa表示物理地址),包括:代碼相關(guān)頁(yè)表項(xiàng),如果一個(gè)頁(yè)表項(xiàng)參與了到某一個(gè)內(nèi)核代碼頁(yè)(包括內(nèi)核模塊代碼頁(yè))的地址轉(zhuǎn)換,那么這個(gè)頁(yè)表項(xiàng)就被稱為代碼相關(guān)頁(yè)表項(xiàng)。代碼無(wú)關(guān)數(shù)據(jù)相關(guān)頁(yè)表項(xiàng),如果一個(gè)頁(yè)表項(xiàng)不是代碼相關(guān)頁(yè)表項(xiàng)且參與了被保護(hù)數(shù)據(jù)頁(yè)的地址轉(zhuǎn)換,那么這個(gè)頁(yè)表項(xiàng)便稱為代碼無(wú)關(guān)數(shù)據(jù)相關(guān)頁(yè)表項(xiàng)。受限頁(yè)表項(xiàng),如果一個(gè)頁(yè)表頁(yè)中包含代碼相關(guān)頁(yè)表項(xiàng),那么這個(gè)頁(yè)表頁(yè)中不為代碼相關(guān)頁(yè)表項(xiàng)或是代碼無(wú)關(guān)數(shù)據(jù)相關(guān)頁(yè)表項(xiàng)的頁(yè)表項(xiàng)被稱為受限頁(yè)表項(xiàng)。非受限頁(yè)表項(xiàng),如果一個(gè)頁(yè)表頁(yè)中不包含代碼相關(guān)頁(yè)表項(xiàng)而包含代碼無(wú)關(guān)數(shù)據(jù)相關(guān)頁(yè)表項(xiàng),那么這個(gè)頁(yè)表頁(yè)中不為代碼無(wú)關(guān)數(shù)據(jù)相關(guān)頁(yè)表項(xiàng)的頁(yè)表項(xiàng)被成為非受限頁(yè)表項(xiàng)。用戶相關(guān)頁(yè)表項(xiàng),如果一個(gè)頁(yè)表項(xiàng)存在于一個(gè)pgd中且是用于用戶空間地址翻譯,那么這個(gè)頁(yè)表項(xiàng)就被稱為用戶相關(guān)頁(yè)表項(xiàng)。非受控頁(yè)表項(xiàng),如果一個(gè)頁(yè)表項(xiàng)不屬于上述所有類型,那么這個(gè)頁(yè)表項(xiàng)被成為非受控頁(yè)表項(xiàng)。除了非受控頁(yè)表項(xiàng)以外,所有的頁(yè)表項(xiàng)所在的物理頁(yè)對(duì)應(yīng)的ept頁(yè)表項(xiàng)都將清除寫權(quán)限。當(dāng)一個(gè)非非受控頁(yè)表項(xiàng)的頁(yè)表項(xiàng)修改發(fā)生時(shí),由于ept中權(quán)限設(shè)置使得虛擬機(jī)切換到宿主機(jī)上,虛擬機(jī)管理模塊獲得執(zhí)行。同步驟104,頁(yè)表對(duì)應(yīng)的策略函數(shù)得以執(zhí)行。頁(yè)表策略函數(shù)首先根據(jù)錯(cuò)誤物理地址找到頁(yè)表項(xiàng)對(duì)應(yīng)的一個(gè)或多個(gè)保護(hù)結(jié)構(gòu)或者報(bào)告有對(duì)應(yīng)的保護(hù)對(duì)象。對(duì)于有保護(hù)結(jié)構(gòu)對(duì)應(yīng)的頁(yè)表項(xiàng),如果任一保護(hù)結(jié)構(gòu)是內(nèi)核代碼或是內(nèi)核模塊代碼,策略函數(shù)認(rèn)定其為代碼相關(guān)頁(yè)表,否則認(rèn)定為代碼無(wú)關(guān)數(shù)據(jù)相關(guān)頁(yè)表項(xiàng)。對(duì)于沒(méi)有保護(hù)結(jié)構(gòu)對(duì)應(yīng)的頁(yè)表項(xiàng),本裝置首先根據(jù)物理地址范圍對(duì)應(yīng)的類型判斷頁(yè)表項(xiàng)是否處于pgd,對(duì)于處于pgd中的頁(yè)表項(xiàng)判斷是否屬于用戶程序使用的用戶地址空間,即是頁(yè)表項(xiàng)是否處于pgd前256項(xiàng),如果頁(yè)表項(xiàng)是pgd中的前256項(xiàng),則頁(yè)表項(xiàng)為用戶相關(guān)頁(yè)表項(xiàng),否則繼續(xù)判斷該頁(yè)表項(xiàng)所在頁(yè)中的其它頁(yè)表項(xiàng)是否有代碼相關(guān)頁(yè)表項(xiàng),如果有則為受限頁(yè)表項(xiàng),否則為非受限頁(yè)表項(xiàng)。對(duì)于代碼無(wú)關(guān)數(shù)據(jù)相關(guān)頁(yè)表項(xiàng),本專利確保其保存的下一級(jí)物理地址不變以及權(quán)限位總是可讀、可寫、不可執(zhí)行。對(duì)于代碼相關(guān)頁(yè)表項(xiàng),本專利確保其保存的下一級(jí)物理地址不變以及權(quán)限位可讀、可寫、可執(zhí)行。對(duì)于受限頁(yè)表項(xiàng),本專利確保其權(quán)限位可讀、可寫、不可執(zhí)行。對(duì)于全局頁(yè)目錄表pgd中的用戶相關(guān)頁(yè)表項(xiàng),本專利確保其權(quán)限為用戶可訪問(wèn)。對(duì)非受控頁(yè)表項(xiàng),本專利不做任何限制。策略函數(shù)通過(guò)指令解析與模擬模塊得到此次修改期望的結(jié)果,然后將之與頁(yè)表項(xiàng)原始值進(jìn)行對(duì)比。當(dāng)檢查頁(yè)表項(xiàng)的修改不滿足上述要求時(shí),策略函數(shù)判定此次修改為非法篡改,并通報(bào)篡改行為;當(dāng)檢查頁(yè)表項(xiàng)的修改滿足上述要求時(shí),策略函數(shù)根據(jù)當(dāng)前rip寄存器獲取代碼位置,并從vmcs中獲取代碼長(zhǎng)度,然后交給指令解析與模擬模塊。指令解析與模擬模塊,將期望的結(jié)果真實(shí)地寫入到頁(yè)表項(xiàng)對(duì)應(yīng)的物理地址上去。指令模擬成功后,修改虛擬機(jī)的rip值成下一條指令的地址,然后虛擬機(jī)管理模塊將恢復(fù)虛擬機(jī)執(zhí)行環(huán)境,最后切換虛擬機(jī)中執(zhí)行。實(shí)施例三、一種對(duì)內(nèi)核代碼的保護(hù)方法,包括:本實(shí)施例在本裝置的啟動(dòng)階段與實(shí)施例一中步驟101、102和103相同。當(dāng)一個(gè)對(duì)內(nèi)核代碼的修改發(fā)生時(shí),由于ept中權(quán)限設(shè)置使得虛擬機(jī)切換到宿主機(jī)上,虛擬機(jī)管理模塊獲得執(zhí)行。同步驟104,代碼策略函數(shù)得以執(zhí)行。代碼策略函數(shù)從指令解析與模擬模塊中得到希望修改的新指令,并將修改提交給若干判定函數(shù)進(jìn)行判定。statickeys判定器判定此次修改是否為內(nèi)核statickeys特性完成。該判定器在__jump_table中查找,此次修改的位置是否與某個(gè)jump_entry結(jié)構(gòu)中的code域里存儲(chǔ)的地址相對(duì)應(yīng)。如果不是,則判定器認(rèn)定此次修改不是合法的;否則,判定器繼續(xù)對(duì)修改的內(nèi)容進(jìn)行檢查。401、正常的修改過(guò)程如圖2,因此在指令修改的過(guò)程中有三個(gè)合法的狀態(tài)。狀態(tài)s1表示當(dāng)前指令為nop指令;狀態(tài)s2表示當(dāng)前指令是int3指令;狀態(tài)s3表示當(dāng)前指令是jump指令。s1和s3只能通過(guò)s2轉(zhuǎn)移得到。s2可以轉(zhuǎn)移到任意狀態(tài),包括它自身,也可以從任意狀態(tài)轉(zhuǎn)移到。當(dāng)本方法探測(cè)到轉(zhuǎn)換前是s1時(shí),本方法檢查是否是在首字節(jié)寫入int3指令。如果是,本方法寫入int3指令,并記錄這次指令替代。當(dāng)本方法探測(cè)到轉(zhuǎn)換前是s2時(shí),本方法需要檢查是否有相關(guān)的指令替代被記錄過(guò)。如果記錄表明s2轉(zhuǎn)移到s2,根據(jù)記錄本方法知道這次指令替換的方向。對(duì)于nop指令替換成jump指令,本方法檢查替換后的地址是否是jump_entry記錄的目標(biāo)。對(duì)于jump指令替換成nop指令,本方法檢查替換后的地址是否是nop指令的后半部分。如果記錄表明s2轉(zhuǎn)移到s1時(shí),本方法檢查待寫入的字節(jié)是否為nop的首字節(jié)。如果記錄表明s2轉(zhuǎn)移到s1時(shí),本方法檢查寫入的字節(jié)是否是jump指令的首字節(jié)。當(dāng)本方法探測(cè)到轉(zhuǎn)換前是s3時(shí),本方法檢查是否首字節(jié)寫入int3指令。如果檢查不被通過(guò),本方法便認(rèn)為不是合法的修改。kgdb判定器判定此次修改是否為內(nèi)核kgdb特性完成。該判定器檢查新的指令是否為int3指令,如果是,則記錄下該次修改的位置和原始指令字節(jié),并判定為合法,否則查找是否記錄過(guò)該位置的指令修改,在有記錄的情況下比較新的指令和記錄的指令是否相同,只有在記錄且相同的情況下認(rèn)定修改合法。ftrace判定器判定此次修改是否為內(nèi)核ftrace特性完成。該判定器首先通過(guò)內(nèi)核符號(hào)表查找修改的地址是否處于函數(shù)的第一條指令中,如果不是則該判定器認(rèn)定此次修改非法,否則對(duì)修改的內(nèi)容進(jìn)行檢查。402、本判斷與401大致相同,主要是用call指令而不是jump指令。在指令修改的過(guò)程中有三個(gè)合法的狀態(tài)。狀態(tài)s1表示當(dāng)前指令為nop指令;狀態(tài)s2表示當(dāng)前指令是int3指令;狀態(tài)s3表示當(dāng)前指令是call指令。s1和s3只能通過(guò)s2轉(zhuǎn)移得到。s2可以轉(zhuǎn)移到任意狀態(tài),包括它自身,也可以從任意狀態(tài)轉(zhuǎn)移到。當(dāng)本方法探測(cè)到轉(zhuǎn)換前是s1時(shí),本方法檢查是否是在首字節(jié)寫入int3指令。如果是,本方法寫入int3指令,并記錄這次指令替代。當(dāng)本方法探測(cè)到轉(zhuǎn)換前是s2時(shí),本方法需要檢查是否有相關(guān)的指令替代被記錄過(guò)。如果記錄表明s2轉(zhuǎn)移到s2,根據(jù)記錄本方法知道這次指令替換的方向。對(duì)于nop指令替換成call指令,本方法檢查替換后的地址是否是預(yù)先記錄的固定的一族函數(shù)地址,該族函數(shù)是各個(gè)追蹤器的追蹤函數(shù),如果是,則判定為合法修改。如果不是,則檢查地址對(duì)應(yīng)的函數(shù)是否是通過(guò)跳板函數(shù)模板生成的跳板函數(shù)。如果不是跳板函數(shù),則判定為非法修改,否則,檢查跳板函數(shù)中跳轉(zhuǎn)的地址是否是預(yù)先記錄的固定的一族函數(shù)地址,該族函數(shù)是各個(gè)追蹤器的追蹤函數(shù)。對(duì)于call指令替換成nop指令,本方法檢查替換后的地址是否是nop指令的后半部分。如果記錄表明s2轉(zhuǎn)移到s1時(shí),本方法檢查待寫入的字節(jié)是否為nop的首字節(jié)。如果記錄表明s2轉(zhuǎn)移到s1時(shí),本方法檢查寫入的字節(jié)是否是call指令的首字節(jié)。當(dāng)本方法探測(cè)到轉(zhuǎn)換前是s3時(shí),本方法檢查是否首字節(jié)寫入int3指令。如果檢查不被通過(guò),本方法便認(rèn)為不是合法的修改。kprobes判定器判定此次修改是否為內(nèi)核kprobes特性完成。kprobes判定器與ftrace判定器類似,區(qū)別在于步驟402中的跳板函數(shù)模板不同。當(dāng)一次代碼修改被任意一個(gè)判定器判定為合法,本方法就認(rèn)為此次代碼修改是合法的,然后交給指令解析和模擬模塊進(jìn)行指令模擬真實(shí)地修改代碼。本發(fā)明的啟動(dòng)時(shí)間平均為63.7毫秒,對(duì)原始操作系統(tǒng)的性能損耗平均為3%。圖3展現(xiàn)了在不同測(cè)試中具體的性能對(duì)比。本發(fā)明也可采用其他設(shè)施方式,如通過(guò)其它硬件或軟件機(jī)制替代intelvt-x技術(shù)攔截對(duì)關(guān)鍵保護(hù)結(jié)構(gòu)的修改,并進(jìn)行如同實(shí)施例一、實(shí)施例二和實(shí)施例三中的檢查和模擬過(guò)程。當(dāng)然,本發(fā)明不僅局限于上述具體的實(shí)現(xiàn)方式,本發(fā)明還可有其他多種實(shí)施例,在不背離本發(fā)明精神及其實(shí)質(zhì)的情況下,熟悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明的權(quán)利要求的保護(hù)范圍。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12