欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)與方法

文檔序號(hào):6380847閱讀:325來源:國(guó)知局
專利名稱:一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)與方法
技術(shù)領(lǐng)域
本發(fā)明屬于計(jì)算機(jī)科學(xué)領(lǐng)域,涉及計(jì)算機(jī)容錯(cuò)技術(shù),特別涉及一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)與方法。
背景技術(shù)
對(duì)于高可靠計(jì)算機(jī)系統(tǒng)來說,操作系統(tǒng)的可靠性顯得至關(guān)重要,但是由于操作系統(tǒng)的高度復(fù)雜性,使得其可靠性仍然是一個(gè)至關(guān)重要卻仍未解決的問題。通過可操作系統(tǒng)的可擴(kuò)展機(jī)制,大量第三方開發(fā)的驅(qū)動(dòng)程序可被加載進(jìn)內(nèi)核。同時(shí)傳統(tǒng)操作系統(tǒng)的宏內(nèi)核架構(gòu),使得驅(qū)動(dòng)與內(nèi)核將運(yùn)行在相同的地址空間和特權(quán)級(jí)下,任何驅(qū)動(dòng)程序的故障都可輕易的傳遞到內(nèi)核其他部分,嚴(yán)重削弱了系統(tǒng)的可靠性。由于驅(qū)動(dòng)程序所占內(nèi)核代碼量的比例巨大,且常常缺乏完善的測(cè)試,使得驅(qū)動(dòng)程序故障成為操作系統(tǒng)崩潰的主要原因。相關(guān)研究表明,Linux操作系統(tǒng)中驅(qū)動(dòng)程序的故障是內(nèi)核其他部分故障的三到七倍,在Windows操作系統(tǒng)下也有類似的結(jié)論。近年來,虛擬機(jī)技術(shù)也被作為解決驅(qū)動(dòng)程序可靠性問題的方法。傳統(tǒng)方法是將驅(qū)動(dòng)及其內(nèi)核都隔離到獨(dú)立的虛擬機(jī)實(shí)例中,利用虛擬機(jī)實(shí)例本身的隔離性來隔離驅(qū)動(dòng)程序。然而,這種方法只是利用虛擬機(jī)替代整機(jī)來承受可能出現(xiàn)的系統(tǒng)崩潰,從而換取整機(jī)的可靠性提高,對(duì)于虛擬機(jī)中的驅(qū)動(dòng)程序的可靠性并沒有提高。如果虛擬機(jī)中的驅(qū)動(dòng)程序發(fā)生故障則會(huì)造成虛擬機(jī)實(shí)例的故障或崩潰,從而造成虛擬機(jī)實(shí)例所提供的所有服務(wù)中斷。另外,每個(gè)被隔離的驅(qū)動(dòng)程序運(yùn)行一個(gè)獨(dú)立的客戶機(jī)操作系統(tǒng),同樣也造成了較多的性能損失。

發(fā)明內(nèi)容
針對(duì)上述缺陷或不足,本發(fā)明提供了通過被隔離驅(qū)動(dòng)程序的授權(quán)表,實(shí)現(xiàn)簡(jiǎn)單、有效、兼容已有操作系統(tǒng)和驅(qū)動(dòng)程序架構(gòu)的一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)與方法。為達(dá)到上述目的,本發(fā)明提供的在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)包括運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊、虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊以及虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊,其中,所述運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊將驅(qū)動(dòng)模塊文件中監(jiān)視未定義符號(hào)與內(nèi)存信息監(jiān)視模塊中監(jiān)視包裝函數(shù)建立聯(lián)系,使得驅(qū)動(dòng)以隔離方式運(yùn)行,并向內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊發(fā)出被隔離驅(qū)動(dòng)程序提醒消息,以使得進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)程序;所述監(jiān)視未定義符號(hào)包括內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào);所述虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊包括包裝函數(shù)庫(kù)、隔離控制子模塊以及消息通信子模塊,其中,所述包裝函數(shù)庫(kù)為虛擬機(jī)內(nèi)核中所監(jiān)控的函數(shù)建立內(nèi)核包裝函數(shù),并為虛擬機(jī)內(nèi)核中驅(qū)動(dòng)接口中的接口函數(shù)建立驅(qū)動(dòng)包裝函數(shù),以使得被隔離驅(qū)動(dòng)與內(nèi)核和驅(qū)動(dòng)包裝函
8數(shù)鏈接,并進(jìn)入隔離運(yùn)行模式;所述內(nèi)核包裝函數(shù)包括內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù),所述內(nèi)存包裝函數(shù)是指內(nèi)核中內(nèi)存管理函數(shù)的包裝函數(shù),所述注冊(cè)包裝函數(shù)是指內(nèi)核中驅(qū)動(dòng)注冊(cè)函數(shù)的包裝函數(shù);所述隔離控制子模塊接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息,建立被隔離驅(qū)動(dòng)程序的相關(guān)信息,并指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令,同時(shí),根據(jù)需要獲取可信任的虛擬機(jī)內(nèi)核的地址范圍,注入到內(nèi)存訪問控制模塊,并發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令;所述可信任的虛擬機(jī)內(nèi)核的地址范圍包括虛擬機(jī)內(nèi)核代碼和未被隔離的驅(qū)動(dòng)程序代碼的內(nèi)存起始地址及其大?。凰鱿⑼ㄐ抛幽K向內(nèi)存訪問控制模塊實(shí)時(shí)報(bào)告被隔離驅(qū)動(dòng)所使用內(nèi)存信息、可信任的虛擬機(jī)內(nèi)核的地址范圍、及發(fā)送建立被隔離驅(qū)動(dòng)授權(quán)表的指令;所述消息通信子模塊被所述包裝函數(shù)庫(kù)和所述隔離控制子模塊調(diào)用;所述內(nèi)存訪問控制模塊用于控制被隔離驅(qū)動(dòng)程序?qū)懖僮?,包括授?quán)表管理子模塊、頁(yè)面設(shè)置子模塊以及缺頁(yè)處理子模塊,其中,所述授權(quán)表管理子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令后,設(shè)置被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表,并負(fù)責(zé)確認(rèn)寫操作地址是否在授權(quán)表中;所述頁(yè)面設(shè)置子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令,并根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)的影子頁(yè)表,將影子頁(yè)表設(shè)置為只讀另外,當(dāng)缺頁(yè)處理子模塊允許寫操作時(shí),還接收所述缺頁(yè)處理子模塊發(fā)出的允許寫操作段的指令,并設(shè)置寫操作目標(biāo)地址對(duì)應(yīng)的影子頁(yè)表,在寫操作結(jié)束后,重新將影子頁(yè)表設(shè)置為只讀;所述缺頁(yè)處理子模塊當(dāng)被隔離驅(qū)動(dòng)所在虛擬機(jī)內(nèi)核出現(xiàn)寫操作時(shí),根據(jù)寫操作指令的來源和被隔離驅(qū)動(dòng)對(duì)應(yīng)的授權(quán)表,判斷和控制是否允許進(jìn)行寫操作。運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊具體用于運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊,將驅(qū)動(dòng)模塊文件中的內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào)替換為對(duì)應(yīng)的所述內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù)的符號(hào)及其符號(hào)名;調(diào)用虛擬機(jī)內(nèi)核的原模塊加載方式加載驅(qū)動(dòng)程序模塊,以使驅(qū)動(dòng)程序模塊中包裝函數(shù)符號(hào)將自動(dòng)鏈接到所述虛擬機(jī)內(nèi)存信息監(jiān)視模塊中的所監(jiān)控的包裝函數(shù),從而完成與內(nèi)核包裝函數(shù)建立聯(lián)系;虛擬機(jī)內(nèi)核的原模塊加載方式會(huì)調(diào)用驅(qū)動(dòng)模塊的初始化函數(shù),執(zhí)行驅(qū)動(dòng)注冊(cè),驅(qū)動(dòng)會(huì)自動(dòng)調(diào)用已經(jīng)鏈接到注冊(cè)包裝函數(shù)的驅(qū)動(dòng)注冊(cè)函數(shù),完成與驅(qū)動(dòng)包裝函數(shù)建立聯(lián)系。所述隔離運(yùn)行模式是指被隔離驅(qū)動(dòng)程序使用的所有內(nèi)存信息都被實(shí)時(shí)的捕獲,并建立對(duì)應(yīng)的授權(quán)表,實(shí)現(xiàn)驅(qū)動(dòng)程序隔離運(yùn)行模式具體包括驅(qū)動(dòng)在加載時(shí),執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)向內(nèi)核的驅(qū)動(dòng)接口注冊(cè)驅(qū)動(dòng)程序,將內(nèi)核中驅(qū)動(dòng)模塊各個(gè)功能函數(shù)的地址賦予驅(qū)動(dòng)接口中的接口函數(shù)指針,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)對(duì)應(yīng)的包裝函數(shù),即注冊(cè)包裝函數(shù),從而實(shí)現(xiàn)內(nèi)核對(duì)驅(qū)動(dòng)調(diào)用過程的監(jiān)視;所述注冊(cè)包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原驅(qū)動(dòng)注冊(cè)函數(shù),并執(zhí)行驅(qū)動(dòng)接口中接口函數(shù)指針的替換操作;所述接口函數(shù)指針的替換操作是指將接口函數(shù)指針賦值成驅(qū)動(dòng)包裝函數(shù)的地址,代替原驅(qū)動(dòng)功能函數(shù)的地址;驅(qū)動(dòng)程序加載后,驅(qū)動(dòng)接口中的接口函數(shù)指針已被驅(qū)動(dòng)包裝函數(shù)所替換,當(dāng)內(nèi)核調(diào)用驅(qū)動(dòng)函數(shù)時(shí),將執(zhí)行驅(qū)動(dòng)包裝函數(shù),獲得驅(qū)動(dòng)所使用的被賦予內(nèi)存信息和棧內(nèi)存信息;驅(qū)動(dòng)包裝函數(shù)記錄被賦予內(nèi)存信息和棧內(nèi)存信息,并將被賦予內(nèi)存信息和棧內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊,執(zhí)行被隔離驅(qū)動(dòng)中的原驅(qū)動(dòng)函數(shù);所述被賦予內(nèi)存信息包括內(nèi)核授權(quán)驅(qū)動(dòng)操作的內(nèi)核數(shù)據(jù)結(jié)構(gòu)的內(nèi)存起始地址及其大?。凰鰲?nèi)存信息包括執(zhí)行驅(qū)動(dòng)程序的進(jìn)程的棧的內(nèi)存起始地址及其大??;驅(qū)動(dòng)在運(yùn)行過程中,調(diào)用內(nèi)存管理函數(shù)來分配或釋放內(nèi)存,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行內(nèi)存管理函數(shù)對(duì)應(yīng)的包裝函數(shù),即內(nèi)存包裝函數(shù),實(shí)現(xiàn)向內(nèi)核申請(qǐng)分配或釋放內(nèi)存;所述內(nèi)存包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原內(nèi)存管理函數(shù),并記錄分配或釋放的堆內(nèi)存信息,并將堆內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊;所述堆內(nèi)存信息包括驅(qū)動(dòng)程序向所述虛擬機(jī)內(nèi)核申請(qǐng)分配或釋放的內(nèi)存起始地址及其大小。所述內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊具體用于I)當(dāng)接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出建立被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成只讀模式的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,注入所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;2)當(dāng)捕獲驅(qū)動(dòng)進(jìn)入內(nèi)核的消息,但沒有接收到進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)的消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;3)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)為被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出銷毀被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中最后一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成可寫入模式的指令;4)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)不是被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍。所述內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊具體用于當(dāng)被隔離驅(qū)動(dòng)程序加載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令,并建立被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的初始授權(quán)表;
當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中時(shí),接收所述虛擬機(jī)所述包裝函數(shù)庫(kù)發(fā)出的更新被隔離驅(qū)動(dòng)授權(quán)表的指令,并根據(jù)所述包裝函數(shù)實(shí)時(shí)捕捉的驅(qū)動(dòng)程序所使用的內(nèi)存信息,更新對(duì)應(yīng)的所述驅(qū)動(dòng)授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,發(fā)生寫操作缺頁(yè)異常時(shí),接收所述缺頁(yè)處理子模塊的查詢授權(quán)表指令,并查詢寫操作地址是否在驅(qū)動(dòng)授權(quán)表中;當(dāng)被隔離驅(qū)動(dòng)程序卸載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的銷毀被隔離驅(qū)動(dòng)授權(quán)表的指令,銷毀被隔離驅(qū)動(dòng)授權(quán)表。所述內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊具體用于接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的只讀指令,并根據(jù)被隔離驅(qū)動(dòng)為所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng),將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為只讀;接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的可寫指令,并根據(jù)最后一個(gè)被隔離驅(qū)動(dòng)被卸載出所述虛擬機(jī)內(nèi)核,將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為可寫,防止不必要的缺頁(yè)異常;當(dāng)被隔離驅(qū)動(dòng)不是所述虛擬機(jī)中第一個(gè)加載的被隔離驅(qū)動(dòng),或最后一個(gè)卸載出的被隔離驅(qū)動(dòng)時(shí),直接運(yùn)行所述驅(qū)動(dòng)程序,不進(jìn)行整個(gè)虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表的設(shè)置;當(dāng)所述缺頁(yè)處理子模塊允許進(jìn)行寫操作時(shí),所述頁(yè)面設(shè)置子模塊將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀。所述內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊還用于當(dāng)寫操作是來自可信任的虛擬機(jī)內(nèi)核時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)寫操作是來自虛擬機(jī)中被隔離的驅(qū)動(dòng)程序,且寫操作的地址范圍在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)寫操作是來自虛擬機(jī)中被隔離的驅(qū)動(dòng)程序,且寫操作的地址范圍不在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),跳過寫操作指令,結(jié)束所述驅(qū)動(dòng)程序并報(bào)告錯(cuò)誤。一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法,包括以下步驟在需要隔離驅(qū)動(dòng)程序的虛擬機(jī)中加載虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊;內(nèi)存信息監(jiān)視模塊通過所述驅(qū)動(dòng)隔離加載模塊加載被隔離驅(qū)動(dòng)程序,將被隔離驅(qū)動(dòng)程序模塊中未定義符號(hào)與內(nèi)存信息監(jiān)視模塊中監(jiān)視包裝函數(shù)建立聯(lián)系,使得被隔離驅(qū)動(dòng)在加載之后以隔離方式運(yùn)行;并向內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊發(fā)出被隔離驅(qū)動(dòng)程序提醒消息,以使得進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)程序;所述監(jiān)視未定義符號(hào)包括內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào);隔離控制子模塊接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息,建立被隔離驅(qū)動(dòng)程序的相關(guān)信息,并指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令,同時(shí),根據(jù)需要獲取可信任的虛擬機(jī)內(nèi)核的地址范圍,注入到內(nèi)存訪問控制模塊,并發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令;所述可信任的虛擬機(jī)內(nèi)核的地址范圍包括虛擬機(jī)內(nèi)核代碼和未被隔離的驅(qū)動(dòng)程序代碼的內(nèi)存起始地址及其大小;授權(quán)表管理子模塊接收到隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令后,設(shè)置驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表;頁(yè)面設(shè)置子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令,并根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)的影子頁(yè)表,將影子頁(yè)表設(shè)置為接收所述缺頁(yè)處理子模塊發(fā)出的允許寫操作段的指令,并設(shè)置寫操作目標(biāo)地址對(duì)應(yīng)的影子頁(yè)表;所述缺頁(yè)處理子模塊接收所述隔離管理子模塊發(fā)出的可信任內(nèi)核的地址范圍的信息,記錄所述虛擬機(jī)的可信任內(nèi)核的地址范圍,判斷和控制是否允許進(jìn)行寫操作。本發(fā)明虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法如下將被隔離驅(qū)動(dòng)程序模塊中未定義符號(hào)與內(nèi)存信息監(jiān)視模塊中監(jiān)視包裝函數(shù)建立聯(lián)系具體包括將運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)模塊文件中的內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào)替換為對(duì)應(yīng)的所述內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù)的符號(hào)及其符號(hào)名;調(diào)用虛擬機(jī)內(nèi)核的原模塊加載方式加載驅(qū)動(dòng)程序模塊,以使得虛擬機(jī)用戶態(tài)中修改過所監(jiān)控未定義符號(hào)的驅(qū)動(dòng)模塊文件在加載之后自動(dòng)鏈接到所述虛擬機(jī)內(nèi)存信息監(jiān)視模塊中的所監(jiān)控的包裝函數(shù),從而完成與內(nèi)核包裝函數(shù)建立聯(lián)系;虛擬機(jī)內(nèi)核的原模塊加載方式會(huì)調(diào)用驅(qū)動(dòng)模塊的初始化函數(shù),執(zhí)行驅(qū)動(dòng)注冊(cè),驅(qū)動(dòng)會(huì)自動(dòng)調(diào)用已經(jīng)鏈接到注冊(cè)包裝函數(shù)的驅(qū)動(dòng)注冊(cè)函數(shù),完成與驅(qū)動(dòng)包裝函數(shù)建立聯(lián)系;所述實(shí)現(xiàn)驅(qū)動(dòng)程序隔離運(yùn)行模式具體包括驅(qū)動(dòng)在加載時(shí),執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)向內(nèi)核的驅(qū)動(dòng)接口注冊(cè)驅(qū)動(dòng)程序,將內(nèi)核中驅(qū)動(dòng)模塊各個(gè)功能函數(shù)的地址賦予驅(qū)動(dòng)接口中的接口函數(shù)指針,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)對(duì)應(yīng)的包裝函數(shù),即注冊(cè)包裝函數(shù),從而實(shí)現(xiàn)內(nèi)核對(duì)驅(qū)動(dòng)調(diào)用過程的監(jiān)視;所述注冊(cè)包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原驅(qū)動(dòng)注冊(cè)函數(shù),并執(zhí)行驅(qū)動(dòng)接口中接口函數(shù)指針的替換操作;所述接口函數(shù)指針的替換操作是指將接口函數(shù)指針賦值成驅(qū)動(dòng)包裝函數(shù)的地址,代替原驅(qū)動(dòng)功能函數(shù)的地址;驅(qū)動(dòng)程序加載后,驅(qū)動(dòng)接口中的接口函數(shù)指針已被驅(qū)動(dòng)包裝函數(shù)所替換,當(dāng)內(nèi)核調(diào)用驅(qū)動(dòng)函數(shù)時(shí),將執(zhí)行驅(qū)動(dòng)包裝函數(shù),獲得驅(qū)動(dòng)所使用的被賦予內(nèi)存信息和棧內(nèi)存信息;驅(qū)動(dòng)包裝函數(shù)記錄被賦予內(nèi)存信息和棧內(nèi)存信息,并將被賦予內(nèi)存信息和棧內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊,執(zhí)行被隔離驅(qū)動(dòng)中的原驅(qū)動(dòng)函數(shù);所述被賦予內(nèi)存信息包括內(nèi)核授權(quán)驅(qū)動(dòng)操作的內(nèi)核數(shù)據(jù)結(jié)構(gòu)的內(nèi)存起始地址及其大??;所述棧內(nèi)存信息包括執(zhí)行驅(qū)動(dòng)程序的進(jìn)程的棧的內(nèi)存起始地址及其大小;驅(qū)動(dòng)在運(yùn)行過程中,調(diào)用內(nèi)存管理函數(shù)來分配或釋放內(nèi)存,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行內(nèi)存管理函數(shù)對(duì)應(yīng)的包裝函數(shù),即內(nèi)存包裝函數(shù),實(shí)現(xiàn)向內(nèi)核申請(qǐng)分配或釋放內(nèi)存;所述內(nèi)存包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原內(nèi)存管理函數(shù),并記錄分
1配或釋放的堆內(nèi)存信息,并將堆內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊;所述堆內(nèi)存信息包括驅(qū)動(dòng)程序向所述虛擬機(jī)內(nèi)核申請(qǐng)分配或釋放的內(nèi)存起始地址及其大小;指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令具體包括I)當(dāng)接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出建立被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成只讀模式的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,注入所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;2)當(dāng)捕獲驅(qū)動(dòng)進(jìn)入內(nèi)核的消息,但沒有接收到進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)的消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;3)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)為被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出銷毀被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中最后一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成可寫入模式的指令;4)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)不是被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;所述設(shè)置驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表,具體包括當(dāng)被隔離驅(qū)動(dòng)程序加載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令,并建立被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的初始授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,接收所述虛擬機(jī)所述包裝函數(shù)庫(kù)發(fā)出的更新被隔離驅(qū)動(dòng)授權(quán)表的指令,并根據(jù)所述包裝函數(shù)實(shí)時(shí)捕捉的驅(qū)動(dòng)程序所使用的內(nèi)存信息,更新對(duì)應(yīng)的所述驅(qū)動(dòng)授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,發(fā)生寫操作缺頁(yè)異常時(shí),接收所述缺頁(yè)處理子模塊的查詢授權(quán)表指令,并查詢寫操作地址是否在驅(qū)動(dòng)授權(quán)表中;當(dāng)被隔離驅(qū)動(dòng)程序卸載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的銷毀被隔離驅(qū)動(dòng)授權(quán)表的指令,銷毀被隔離驅(qū)動(dòng)授權(quán)表;根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)影子頁(yè)表,進(jìn)行頁(yè)表設(shè)置,具體包括接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的只讀指令,并根據(jù)被隔離驅(qū)動(dòng)為所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng),將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為只讀;接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的可寫指令,并根據(jù)最后一個(gè)被隔離驅(qū)動(dòng)被卸載出所述虛擬機(jī)內(nèi)核,將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為可寫,防止不必要的缺頁(yè)異常;當(dāng)被隔離驅(qū)動(dòng)不是所述虛擬機(jī)中第一個(gè)加載進(jìn)的被隔離驅(qū)動(dòng),或最后一個(gè)卸載出的被隔離驅(qū)動(dòng)時(shí),直接運(yùn)行所述驅(qū)動(dòng)程序,不進(jìn)行整個(gè)虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表的設(shè)置;當(dāng)所述缺頁(yè)處理子模塊允許進(jìn)行寫操作時(shí),所述頁(yè)面設(shè)置子模塊將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;根據(jù)寫操作指令的來源和被隔離驅(qū)動(dòng)對(duì)應(yīng)的授權(quán)表,判斷和控制是否允許進(jìn)行寫操作具體包括當(dāng)寫操作是來自可信任的虛擬機(jī)內(nèi)核時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)寫操作是來自虛擬機(jī)中被隔離的驅(qū)動(dòng)程序,且寫操作的地址范圍在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)進(jìn)行寫操作,且寫操作的地址范圍不在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),跳過寫操作指令,結(jié)束所述驅(qū)動(dòng)程序并報(bào)告錯(cuò)誤。本發(fā)明提供了一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)與方法,通過提供監(jiān)控虛擬機(jī)內(nèi)部驅(qū)動(dòng)運(yùn)行情況的內(nèi)存信息監(jiān)控模塊,該內(nèi)存信息監(jiān)控模塊以模塊形式加載進(jìn)虛擬機(jī)中,無需修改虛擬機(jī)內(nèi)核和虛擬機(jī)中的驅(qū)動(dòng)程序,保證本發(fā)明與已有內(nèi)核架構(gòu)和驅(qū)動(dòng)程序的兼容性。只需通過運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)監(jiān)視加載模塊以隔離加載方式加載被隔離的驅(qū)動(dòng)程序,就可將被隔離驅(qū)動(dòng)和內(nèi)存信息監(jiān)視模塊建立聯(lián)系,從而確保虛擬機(jī)中被隔離驅(qū)動(dòng)程序內(nèi)存使用情況被實(shí)時(shí)獲取。本發(fā)明利用內(nèi)存信息監(jiān)視模塊報(bào)告的虛擬機(jī)內(nèi)部驅(qū)動(dòng)內(nèi)存使用情況建立授權(quán)表,并設(shè)置虛擬機(jī)內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)影子頁(yè)表的寫保護(hù),建立起驅(qū)動(dòng)程序的隔離運(yùn)行環(huán)境。在虛擬機(jī)進(jìn)行寫操作時(shí),結(jié)合授權(quán)表判斷被隔離驅(qū)動(dòng)程序是否具有寫權(quán)限。通過隔離驅(qū)動(dòng)程序可以避免驅(qū)動(dòng)程序故障破壞虛擬機(jī)內(nèi)核,防止虛擬機(jī)內(nèi)核的崩潰,從而保證虛擬機(jī)內(nèi)核所提供的其他服務(wù)(除被隔離驅(qū)動(dòng)程序所提供的服務(wù)外)的正常運(yùn)行。由于本發(fā)明中每個(gè)被隔離的驅(qū)動(dòng)程序都有一個(gè)對(duì)應(yīng)的授權(quán)表,使得可在同一虛擬機(jī)內(nèi)部隔離多個(gè)驅(qū)動(dòng)程序,無需為每一個(gè)被隔離的驅(qū)動(dòng)程序提供一個(gè)獨(dú)立的虛擬機(jī)實(shí)例,從而降低系統(tǒng)的性能損失。同時(shí),如果驅(qū)動(dòng)以正常方式加載進(jìn)虛擬機(jī),該驅(qū)動(dòng)將被認(rèn)為是可信任內(nèi)核的一部分,并不影響其正常運(yùn)行,保證了兼容性。


圖1是一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)的架構(gòu);
圖2是一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)的隔離管理子模塊的流程圖;圖3是一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法建立隔離運(yùn)行環(huán)境的流程圖;圖4是一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法寫操作缺頁(yè)異常處理流程圖。
具體實(shí)施例方式下面結(jié)合附圖對(duì)本發(fā)明做詳細(xì)描述。參考圖I所示,一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)包括運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊、虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊以及虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊,其中,所述運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊將驅(qū)動(dòng)模塊中監(jiān)視未定義符號(hào)與內(nèi)存信息監(jiān)視模塊中監(jiān)視包裝函數(shù)建立聯(lián)系,使得驅(qū)動(dòng)以隔離方式運(yùn)行,并向內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊發(fā)出被隔離驅(qū)動(dòng)程序提醒消息,以使得進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)程序;所述監(jiān)視未定義符號(hào)包括內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào);所述虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊包括包裝函數(shù)庫(kù)、隔離控制子模塊以及消息通信子模塊,其中,所述包裝函數(shù)庫(kù)為虛擬機(jī)內(nèi)核中所監(jiān)控的函數(shù)建立內(nèi)核包裝函數(shù),并為虛擬機(jī)內(nèi)核中驅(qū)動(dòng)接口中的接口函數(shù)建立驅(qū)動(dòng)包裝函數(shù),以使得被隔離驅(qū)動(dòng)與內(nèi)核和驅(qū)動(dòng)包裝函數(shù)鏈接,并進(jìn)入隔離運(yùn)行模式;所述內(nèi)核包裝函數(shù)包括內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù),所述內(nèi)存包裝函數(shù)是指內(nèi)核中內(nèi)存管理函數(shù)的包裝函數(shù),所述注冊(cè)包裝函數(shù)是指內(nèi)核中驅(qū)動(dòng)注冊(cè)函數(shù)的包裝函數(shù);所述隔離控制子模塊接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息,建立被隔離驅(qū)動(dòng)程序的相關(guān)信息,并指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令,同時(shí),根據(jù)需要獲取可信任的虛擬機(jī)內(nèi)核的地址范圍,注入到內(nèi)存訪問控制模塊,并發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令;所述可信任的虛擬機(jī)內(nèi)核的地址范圍包括虛擬機(jī)內(nèi)核代碼和未被隔離的驅(qū)動(dòng)程序代碼的內(nèi)存起始地址及其大??;所述消息通信子模塊向內(nèi)存訪問控制模塊實(shí)時(shí)報(bào)告被隔離驅(qū)動(dòng)所使用內(nèi)存信息、可信任的虛擬機(jī)內(nèi)核的地址范圍、及發(fā)送建立被隔離驅(qū)動(dòng)授權(quán)表的指令;所述消息通信子模塊被所述包裝函數(shù)庫(kù)和所述隔離控制子模塊調(diào)用;所述內(nèi)存訪問控制模塊用于控制被隔離驅(qū)動(dòng)程序?qū)懖僮?,包括授?quán)表管理子模塊、頁(yè)面設(shè)置子模塊以及缺頁(yè)處理子模塊,其中,所述授權(quán)表管理子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令后,設(shè)置被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表,并負(fù)責(zé)確認(rèn)寫操作地址是否在授權(quán)表中;所述頁(yè)面設(shè)置子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令,并根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)的影子頁(yè)表,將影子頁(yè)表設(shè)置為接收所述缺頁(yè)處理子模塊發(fā)出的允許寫操作段的指令,并設(shè)置寫操作目標(biāo)地址對(duì)應(yīng)的影子頁(yè)表;
所述缺頁(yè)處理子模塊當(dāng)被隔離驅(qū)動(dòng)所在虛擬機(jī)內(nèi)核出現(xiàn)寫操作時(shí),根據(jù)寫操作指令的來源和被隔離驅(qū)動(dòng)對(duì)應(yīng)的授權(quán)表,判斷和控制是否允許進(jìn)行寫操作。本發(fā)明實(shí)施例中,包裝函數(shù)包括內(nèi)核包裝函數(shù)和驅(qū)動(dòng)包裝函數(shù),內(nèi)核包裝函數(shù)又包括內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù)。驅(qū)動(dòng)包裝函數(shù)是對(duì)驅(qū)動(dòng)接口中的接口函數(shù)的包裝,注冊(cè)包裝函數(shù)是對(duì)驅(qū)動(dòng)注冊(cè)內(nèi)核函數(shù)的包裝,內(nèi)存包裝函數(shù)內(nèi)存管理內(nèi)核函數(shù)的包裝。對(duì)包裝函數(shù)的命名形式為“包裝函數(shù)前綴+原函數(shù)名”。例如,高端內(nèi)存的分配函數(shù)“vmalloc”對(duì)應(yīng)的包裝函數(shù)為“monitor_vmalloc”。包裝函數(shù)與原函數(shù)的參數(shù)和返回值一致。加載被隔離驅(qū)動(dòng)程序重要是通過查找監(jiān)視模塊中帶前綴的包裝函數(shù),將驅(qū)動(dòng)模塊中的內(nèi)存管理函數(shù)的符號(hào)及其符號(hào)名替換成帶前綴的包裝函數(shù)的符號(hào)及其符號(hào)名,然后再加載修改過符號(hào)的驅(qū)動(dòng)模塊,就可避免驅(qū)動(dòng)模塊中的內(nèi)存管理函數(shù)的符號(hào)與原函數(shù)地址的鏈接,如圖I中VMl的內(nèi)存管理函數(shù)部分的連接線,實(shí)箭頭表示鏈接到包裝函數(shù)地址,空箭頭表示鏈接到原函數(shù)地址。例如,驅(qū)動(dòng)程序中的高端內(nèi)存分配“vmalloc”符號(hào)及其符號(hào)名,在加載之前會(huì)被替換成包裝函數(shù)“monitor_vmalloc”的符號(hào)及其符號(hào)名,這樣在加載時(shí),驅(qū)動(dòng)程序會(huì)就被自動(dòng)鏈接到包裝函數(shù)“monitor_vmalloc”的地址,而不是原函數(shù)“vmalloc”的地址。而被隔離驅(qū)動(dòng)中其他內(nèi)核函數(shù)的符號(hào)無需修改,并仍按原方式鏈接。通過監(jiān)視模塊的監(jiān)視加載方式加載驅(qū)動(dòng)程序,可在無需修改虛擬機(jī)內(nèi)核和驅(qū)動(dòng)程序的情況下監(jiān)視驅(qū)動(dòng)程序的內(nèi)存使用情況。通過驅(qū)動(dòng)隔離加載模塊處理后,驅(qū)動(dòng)模塊中的驅(qū)動(dòng)注冊(cè)函數(shù)和內(nèi)存管理函數(shù)的未定義符號(hào)就被鏈接到注冊(cè)包裝函數(shù)和內(nèi)存包裝函數(shù)中。但是,驅(qū)動(dòng)接口中的驅(qū)動(dòng)函數(shù)還未鏈接到驅(qū)動(dòng)包裝函數(shù),這需要注冊(cè)包裝函數(shù)的輔助。注冊(cè)包裝函數(shù)并不直接監(jiān)視驅(qū)動(dòng)所使用的內(nèi)存信息,其目的就是為了替換驅(qū)動(dòng)接口中的接口函數(shù)指針,使其指向驅(qū)動(dòng)包裝函數(shù)。在驅(qū)動(dòng)隔離加載模塊調(diào)用內(nèi)核原驅(qū)動(dòng)加載方式加載驅(qū)動(dòng)模塊時(shí),會(huì)調(diào)用驅(qū)動(dòng)注冊(cè)函數(shù),此時(shí)已經(jīng)鏈接到了注冊(cè)包裝函數(shù),執(zhí)行完注冊(cè)包裝函數(shù),驅(qū)動(dòng)接口中的接口函數(shù)就會(huì)被鏈接到驅(qū)動(dòng)包裝函數(shù)。這樣,驅(qū)動(dòng)開始運(yùn)行后,內(nèi)核對(duì)驅(qū)動(dòng)的所有調(diào)用都會(huì)被驅(qū)動(dòng)包裝函數(shù)監(jiān)視,并記錄驅(qū)動(dòng)使用的被授予內(nèi)存信息和棧內(nèi)存信息。同樣,驅(qū)動(dòng)對(duì)內(nèi)核的內(nèi)存管理函數(shù)的調(diào)用,也會(huì)被內(nèi)存包裝函數(shù)監(jiān)視,從而記錄驅(qū)動(dòng)使用的堆內(nèi)存信息。其中,需要監(jiān)視的內(nèi)存管理函數(shù)包括頁(yè)面的分配/釋放函數(shù)、內(nèi)存高速緩存的分配/釋放函數(shù)、高端內(nèi)存的分配/釋放函數(shù)以及其他的專用數(shù)據(jù)結(jié)構(gòu)的分配/釋放函數(shù)等。建立虛擬機(jī)內(nèi)被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表,是指驅(qū)動(dòng)程序?qū)?nèi)存空間所具有的寫訪問權(quán)限的地址集合。授權(quán)表記錄了驅(qū)動(dòng)程序所具寫權(quán)限的所有內(nèi)存起始地址以其大小。授權(quán)表在被隔離驅(qū)動(dòng)程序被加載進(jìn)虛擬機(jī)內(nèi)核時(shí)建立,并在驅(qū)動(dòng)運(yùn)行過程中不斷更新。為了加快授權(quán)表的查找速度,授權(quán)表的各個(gè)表項(xiàng)(即被隔離驅(qū)動(dòng)程序可寫的各個(gè)內(nèi)存區(qū)域),同時(shí)以升序鏈表以及紅黑樹的形式組織起來。所述消息通信子模塊具體會(huì)在前兩種子模塊中被調(diào)用。例如,當(dāng)驅(qū)動(dòng)分配/釋放內(nèi)存時(shí),對(duì)應(yīng)的包裝函數(shù)就會(huì)捕捉到該信息,并通過該子模塊實(shí)時(shí)的報(bào)告給內(nèi)存訪問控制模塊,以便更新被隔離驅(qū)動(dòng)對(duì)應(yīng)的授權(quán)表。另外,對(duì)應(yīng)已經(jīng)存在被隔離驅(qū)動(dòng)的情況下,又按普通方式加載了其他驅(qū)動(dòng),即新加載驅(qū)動(dòng)不被隔離,則該子模塊會(huì)向內(nèi)存訪問控制模塊更新可信任的虛擬機(jī)內(nèi)核范圍,即將新加載驅(qū)動(dòng)被當(dāng)作可信任內(nèi)核的一部分。
16
將運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊中的內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào)替換為對(duì)應(yīng)的所述內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù)的符號(hào)及其符號(hào)名;調(diào)用虛擬機(jī)內(nèi)核的原模塊加載方式加載驅(qū)動(dòng)程序模塊,以使得運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊驅(qū)動(dòng)程序模塊中包裝函數(shù)符號(hào)將自動(dòng)鏈接到所述虛擬機(jī)內(nèi)存信息監(jiān)視模塊中的所監(jiān)控的包裝函數(shù),從而完成與內(nèi)核包裝函數(shù)建立聯(lián)系;虛擬機(jī)內(nèi)核的原模塊加載方式會(huì)調(diào)用驅(qū)動(dòng)模塊的初始化函數(shù),執(zhí)行驅(qū)動(dòng)注冊(cè),驅(qū)動(dòng)會(huì)自動(dòng)調(diào)用已經(jīng)鏈接到注冊(cè)包裝函數(shù)的驅(qū)動(dòng)注冊(cè)函數(shù),完成與驅(qū)動(dòng)包裝函數(shù)建立聯(lián)系。需要說明的是,除包裝過的內(nèi)存管理函數(shù)外的其他具有未定義標(biāo)志的函數(shù)符號(hào)無需修改,在加載過程中,并仍按原方式鏈接到對(duì)應(yīng)的原內(nèi)核函數(shù)。進(jìn)一步的,所述隔離運(yùn)行模式是指被隔離驅(qū)動(dòng)程序使用的所有內(nèi)存信息都被實(shí)時(shí)的捕獲,并建立對(duì)應(yīng)的授權(quán)表,實(shí)現(xiàn)驅(qū)動(dòng)程序隔離運(yùn)行模式具體包括驅(qū)動(dòng)在加載時(shí),執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)向內(nèi)核的驅(qū)動(dòng)接口注冊(cè)驅(qū)動(dòng)程序,將內(nèi)核中驅(qū)動(dòng)模塊各個(gè)功能函數(shù)的地址賦予驅(qū)動(dòng)接口中的接口函數(shù)指針,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)對(duì)應(yīng)的包裝函數(shù),即注冊(cè)包裝函數(shù),從而實(shí)現(xiàn)內(nèi)核對(duì)驅(qū)動(dòng)調(diào)用過程的監(jiān)視;所述注冊(cè)包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原驅(qū)動(dòng)注冊(cè)函數(shù),并執(zhí)行驅(qū)動(dòng)接口中接口函數(shù)指針的替換操作;所述接口函數(shù)指針的替換操作是指將接口函數(shù)指針賦值成驅(qū)動(dòng)包裝函數(shù)的地址,代替原驅(qū)動(dòng)功能函數(shù)的地址; 驅(qū)動(dòng)程序加載后,驅(qū)動(dòng)接口中的接口函數(shù)指針已被驅(qū)動(dòng)包裝函數(shù)所替換,當(dāng)內(nèi)核調(diào)用驅(qū)動(dòng)函數(shù)時(shí),將執(zhí)行驅(qū)動(dòng)包裝函數(shù),獲得驅(qū)動(dòng)所使用的被賦予內(nèi)存信息和棧內(nèi)存信息;驅(qū)動(dòng)包裝函數(shù)記錄被賦予內(nèi)存信息和棧內(nèi)存信息,并將被賦予內(nèi)存信息和棧內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊,執(zhí)行被隔離驅(qū)動(dòng)中的原驅(qū)動(dòng)函數(shù);所述被賦予內(nèi)存信息包括內(nèi)核授權(quán)驅(qū)動(dòng)操作的內(nèi)核數(shù)據(jù)結(jié)構(gòu)的內(nèi)存起始地址及其大?。凰鰲?nèi)存信息包括執(zhí)行驅(qū)動(dòng)程序的進(jìn)程的棧的內(nèi)存起始地址及其大??;驅(qū)動(dòng)在運(yùn)行過程中,調(diào)用內(nèi)存管理函數(shù)來分配或釋放內(nèi)存,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行內(nèi)存管理函數(shù)對(duì)應(yīng)的包裝函數(shù),即內(nèi)存包裝函數(shù),實(shí)現(xiàn)向內(nèi)核申請(qǐng)分配或釋放內(nèi)存;所述內(nèi)存包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原內(nèi)存管理函數(shù),并記錄分配或釋放的堆內(nèi)存信息,并將堆內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊;所述堆內(nèi)存信息包括驅(qū)動(dòng)程序向所述虛擬機(jī)內(nèi)核申請(qǐng)分配或釋放的內(nèi)存起始地址及其大小。這樣,被隔離驅(qū)動(dòng)程序以隔離模式運(yùn)行,被隔離驅(qū)動(dòng)程序與內(nèi)核的交互中所有內(nèi)存相關(guān)的調(diào)用都會(huì)被所述包裝函數(shù)庫(kù)中的包裝函數(shù)監(jiān)視,并實(shí)時(shí)得捕捉驅(qū)動(dòng)程序所使用的內(nèi)存信息,通知所述授權(quán)表管理子模塊更新對(duì)應(yīng)的所述驅(qū)動(dòng)授權(quán)表。進(jìn)一步的,所述內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊,捕獲驅(qū)動(dòng)進(jìn)出內(nèi)核的消息,并接收進(jìn)入內(nèi)核驅(qū)動(dòng)為被隔離驅(qū)動(dòng)程序的消息,并向內(nèi)存訪問控制模塊發(fā)出相應(yīng)的指令,這些相應(yīng)的指令具體用于I)當(dāng)接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出建立被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;
當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成只讀模式的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,注入所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;2)當(dāng)捕獲驅(qū)動(dòng)進(jìn)入內(nèi)核的消息,但沒有接收到進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)的消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;3)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)為被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出銷毀被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中最后一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成可寫入模式的指令;4)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)不是被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍。另外,所述授權(quán)表是指被隔離驅(qū)動(dòng)程序?qū)μ摂M機(jī)內(nèi)核地址空間所具有的寫訪問權(quán)限的地址集合,授權(quán)表里的這些地址集合包括三類所述被賦予內(nèi)存信息,即內(nèi)核授權(quán)驅(qū)動(dòng)操作的內(nèi)核數(shù)據(jù)結(jié)構(gòu)的內(nèi)存起始地址及其大小;所述棧內(nèi)存信息,即執(zhí)行驅(qū)動(dòng)程序的進(jìn)程的棧的內(nèi)存起始地址及其大??;所述堆內(nèi)存信息,即驅(qū)動(dòng)程序向所述虛擬機(jī)內(nèi)核申請(qǐng)分配或釋放的內(nèi)存起始地址及其大小。進(jìn)一步的,所述內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,提供授權(quán)表的建立、更新、查詢和銷毀等功能,具體包括當(dāng)被隔離驅(qū)動(dòng)程序加載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令,并建立被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的初始授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中時(shí),接收所述虛擬機(jī)所述包裝函數(shù)庫(kù)發(fā)出的更新被隔離驅(qū)動(dòng)授權(quán)表的指令,并根據(jù)所述包裝函數(shù)實(shí)時(shí)捕捉的驅(qū)動(dòng)程序所使用的內(nèi)存信息,更新對(duì)應(yīng)的所述驅(qū)動(dòng)授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,發(fā)生寫操作缺頁(yè)異常時(shí),接收所述缺頁(yè)處理子模塊的查詢授權(quán)表指令,并查詢寫操作地址是否在驅(qū)動(dòng)授權(quán)表中;被隔離驅(qū)動(dòng)程序卸載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的銷毀被隔離驅(qū)動(dòng)授權(quán)表的指令后,銷毀被隔離驅(qū)動(dòng)授權(quán)表。所述內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)影子頁(yè)表,進(jìn)行頁(yè)表設(shè)置具體包括接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的只讀指令,并根據(jù)被隔離驅(qū)動(dòng)為所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng),將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為只讀;接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的可寫指令,并根據(jù)最后一個(gè)被隔離驅(qū)動(dòng)被卸載出所述虛擬機(jī)內(nèi)核,將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為可寫,防止不必要的缺頁(yè)異常;當(dāng)被隔離驅(qū)動(dòng)不是所述虛擬機(jī)中第一個(gè)加載的被隔離驅(qū)動(dòng),或最后一個(gè)卸載出的被隔離驅(qū)動(dòng)時(shí),直接運(yùn)行所述驅(qū)動(dòng)程序,不進(jìn)行整個(gè)虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表的設(shè)置;當(dāng)所述缺頁(yè)處理子模塊允許進(jìn)行寫操作時(shí),所述頁(yè)面設(shè)置子模塊將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀。所述內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,接收并保存所述隔離管理子模塊注入的所述虛擬機(jī)可信內(nèi)核空間的地址范圍,還用于處理所述虛擬機(jī)寫操作的缺頁(yè)異常,具體包括當(dāng)所述寫操作是來自虛擬機(jī)中可信任內(nèi)核,則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)所述寫操作是來自虛擬機(jī)中被隔離的驅(qū)動(dòng)程序,且所述寫操作的地址范圍在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)所述寫操作,且所述寫操作的地址范圍不在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),跳過寫操作指令,結(jié)束所述驅(qū)動(dòng)程序并報(bào)告錯(cuò)誤。一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法,包括以下步驟第一步,在需要隔離驅(qū)動(dòng)程序的虛擬機(jī)中加載虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊;第二步,內(nèi)存信息監(jiān)視模塊通過所述驅(qū)動(dòng)隔離加載模塊加載被隔離驅(qū)動(dòng)程序,將被隔離驅(qū)動(dòng)程序模塊中未定義符號(hào)與內(nèi)存信息監(jiān)視模塊中監(jiān)視包裝函數(shù)建立聯(lián)系,使得被隔離驅(qū)動(dòng)在加載之后以隔離方式運(yùn)行;并向內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊發(fā)出被隔離驅(qū)動(dòng)程序提醒消息,以使得進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)程序;所述監(jiān)視未定義符號(hào)包括內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào);其中,使得被隔離驅(qū)動(dòng)在加載之后以隔離方式運(yùn)行具體包括將運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊中的內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào)替換為對(duì)應(yīng)的所述內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù)的符號(hào)及其符號(hào)名;調(diào)用虛擬機(jī)內(nèi)核的原模塊加載方式加載驅(qū)動(dòng)程序模塊,以使得運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊驅(qū)動(dòng)程序模塊中包裝函數(shù)符號(hào)將自動(dòng)鏈接到所述虛擬機(jī)內(nèi)存信息監(jiān)視模塊中的所監(jiān)控的包裝函數(shù),從而完成與內(nèi)核包裝函數(shù)建立聯(lián)系;虛擬機(jī)內(nèi)核的原模塊加載方式會(huì)調(diào)用驅(qū)動(dòng)模塊的初始化函數(shù),執(zhí)行驅(qū)動(dòng)注冊(cè),驅(qū)動(dòng)會(huì)自動(dòng)調(diào)用已經(jīng)鏈接到注冊(cè)包裝函數(shù)的驅(qū)動(dòng)注冊(cè)函數(shù),完成與驅(qū)動(dòng)包裝函數(shù)建立聯(lián)系。另外,所述實(shí)現(xiàn)驅(qū)動(dòng)程序隔離運(yùn)行模式具體包括驅(qū)動(dòng)在加載時(shí),執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)向內(nèi)核的驅(qū)動(dòng)接口注冊(cè)驅(qū)動(dòng)程序,將內(nèi)核中驅(qū)動(dòng)模塊各個(gè)功能函數(shù)的地址賦予驅(qū)動(dòng)接口中的接口函數(shù)指針,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)對(duì)應(yīng)的包裝函數(shù),即注冊(cè)包裝函數(shù),從而實(shí)現(xiàn)內(nèi)核對(duì)驅(qū)動(dòng)調(diào)用過程的監(jiān)視;所述注冊(cè)包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原驅(qū)動(dòng)注冊(cè)函數(shù),并執(zhí)行驅(qū)動(dòng)接口中接口函數(shù)指針的替換操作;所述接口函數(shù)指針的替換操作是指將接口函數(shù)指針賦值成驅(qū)動(dòng)包裝函數(shù)的地址,代替原驅(qū)動(dòng)功能函數(shù)的地址;驅(qū)動(dòng)程序加載后,驅(qū)動(dòng)接口中的接口函數(shù)指針已被驅(qū)動(dòng)包裝函數(shù)所替換,當(dāng)內(nèi)核調(diào)用驅(qū)動(dòng)函數(shù)時(shí),將執(zhí)行驅(qū)動(dòng)包裝函數(shù),獲得驅(qū)動(dòng)所使用的被賦予內(nèi)存信息和棧內(nèi)存信息;驅(qū)動(dòng)包裝函數(shù)記錄被賦予內(nèi)存信息和棧內(nèi)存信息,并將被賦予內(nèi)存信息和棧內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊,執(zhí)行被隔離驅(qū)動(dòng)中的原驅(qū)動(dòng)函數(shù);所述被賦予內(nèi)存信息包括內(nèi)核授權(quán)驅(qū)動(dòng)操作的內(nèi)核數(shù)據(jù)結(jié)構(gòu)的內(nèi)存起始地址及其大??;所述棧內(nèi)存信息包括執(zhí)行驅(qū)動(dòng)程序的進(jìn)程的棧的內(nèi)存起始地址及其大小;驅(qū)動(dòng)在運(yùn)行過程中,調(diào)用內(nèi)存管理函數(shù)來分配或釋放內(nèi)存,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行內(nèi)存管理函數(shù)對(duì)應(yīng)的包裝函數(shù),即內(nèi)存包裝函數(shù),實(shí)現(xiàn)向內(nèi)核申請(qǐng)分配或釋放內(nèi)存;所述內(nèi)存包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原內(nèi)存管理函數(shù),并記錄分配或釋放的堆內(nèi)存信息,并將堆內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊;所述堆內(nèi)存信息包括驅(qū)動(dòng)程序向所述虛擬機(jī)內(nèi)核申請(qǐng)分配或釋放的內(nèi)存起始地址及其大小。第三步,隔離控制子模塊接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息,建立被隔離驅(qū)動(dòng)程序的相關(guān)信息,并指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令,同時(shí),根據(jù)需要獲取可信任的虛擬機(jī)內(nèi)核的地址范圍,注入到內(nèi)存訪問控制模塊,并發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令;所述可信任的虛擬機(jī)內(nèi)核的地址范圍包括虛擬機(jī)內(nèi)核代碼和未被隔離的驅(qū)動(dòng)程序代碼的內(nèi)存起始地址及其大??;具體的,指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令具體包括I)當(dāng)接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出建立被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成只讀模式的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,注入所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;2)當(dāng)捕獲驅(qū)動(dòng)進(jìn)入內(nèi)核的消息,但沒有接收到進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)的消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;
3)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)為被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出銷毀被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中最后一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成可寫入模式的指令;4)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)不是被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍。第四步,授權(quán)表管理子模塊接收到隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令后,設(shè)置驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表;所述設(shè)置驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表,具體包括當(dāng)被隔離驅(qū)動(dòng)程序加載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令,并建立被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的初始授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,接收所述虛擬機(jī)所述包裝函數(shù)庫(kù)發(fā)出的更新被隔離驅(qū)動(dòng)授權(quán)表的指令,并根據(jù)所述包裝函數(shù)實(shí)時(shí)捕捉的驅(qū)動(dòng)程序所使用的內(nèi)存信息,更新對(duì)應(yīng)的所述驅(qū)動(dòng)授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,發(fā)生寫操作缺頁(yè)異常時(shí),接收所述缺頁(yè)處理子模塊的查詢授權(quán)表指令,并查詢寫操作地址是否在驅(qū)動(dòng)授權(quán)表中。被隔離驅(qū)動(dòng)程序卸載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的銷毀被隔離驅(qū)動(dòng)授權(quán)表的指令后,銷毀被隔離驅(qū)動(dòng)授權(quán)表。第五步,頁(yè)面設(shè)置子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令,并根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)的影子頁(yè)表,將影子頁(yè)表設(shè)置為接收所述缺頁(yè)處理子模塊發(fā)出的允許寫操作段的指令,并設(shè)置寫操作目標(biāo)地址對(duì)應(yīng)的影子頁(yè)表;根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)影子頁(yè)表,進(jìn)行頁(yè)表設(shè)置,具體包括接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的只讀指令,并根據(jù)被隔離驅(qū)動(dòng)為所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng),將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為只讀;接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的可寫指令,并根據(jù)最后一個(gè)被隔離驅(qū)動(dòng)被卸載出所述虛擬機(jī)內(nèi)核,將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為可寫,防止不必要的缺頁(yè)異常;當(dāng)被隔離驅(qū)動(dòng)不是所述虛擬機(jī)中第一個(gè)加載進(jìn)的被隔離驅(qū)動(dòng),或最后一個(gè)卸載出的被隔離驅(qū)動(dòng)時(shí),直接運(yùn)行所述驅(qū)動(dòng)程序,不進(jìn)行整個(gè)虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表的設(shè)置;當(dāng)所述缺頁(yè)處理子模塊允許進(jìn)行寫操作時(shí),所述頁(yè)面設(shè)置子模塊將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀。第六步,所述缺頁(yè)處理子模塊接收所述隔離管理子模塊發(fā)出的可信任內(nèi)核的地址范圍的信息,記錄所述虛擬機(jī)的可信任內(nèi)核的地址范圍,判斷和控制是否允許進(jìn)行寫操作。根據(jù)寫操作指令的來源和被隔離驅(qū)動(dòng)對(duì)應(yīng)的授權(quán)表,判斷和控制是否允許進(jìn)行寫操作具體包括當(dāng)寫操作是來自可信任的虛擬機(jī)內(nèi)核時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)寫操作是來自虛擬機(jī)中被隔離的驅(qū)動(dòng)程序,且寫操作的地址范圍在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)進(jìn)行寫操作,且寫操作的地址范圍不在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),跳過寫操作指令,結(jié)束所述驅(qū)動(dòng)程序并報(bào)告錯(cuò)誤。參考圖2所示,一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)的隔離管理子模塊的流程圖,包括下述步驟(I)首先,隔離管理子模塊捕捉到驅(qū)動(dòng)進(jìn)出內(nèi)核的消息。如果為加載進(jìn)內(nèi)核的消息,則執(zhí)行步驟(2);否則,執(zhí)行步驟(7)。(2)如果隔離管理子模塊還捕捉到標(biāo)志進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)的消息,則執(zhí)行步驟(3);否則,執(zhí)行步驟(12)。(3)向虛擬機(jī)管理器中的授權(quán)表管理子模塊發(fā)出建立被隔離驅(qū)動(dòng)初始授權(quán)表的指令。如果被隔離驅(qū)動(dòng)為第一個(gè)被隔離的驅(qū)動(dòng),則執(zhí)行步驟(4);否則,執(zhí)行步驟(6)。(4)向虛擬機(jī)管理器中的頁(yè)面設(shè)置子模塊發(fā)出將被隔離驅(qū)動(dòng)程序所在的VM內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表設(shè)置為只讀的指令。(5)向虛擬機(jī)管理器中的缺頁(yè)處理子模塊注入被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信內(nèi)核的地址范圍。(6)建立被隔離驅(qū)動(dòng)的相關(guān)隔離信息。(7)查詢所有被隔離驅(qū)動(dòng)信息,判斷卸載出的驅(qū)動(dòng)是否為被隔離驅(qū)動(dòng)。(8)如果被卸載出的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)的消息,則執(zhí)行步驟(9);否則,執(zhí)行步驟(12)。(9)向虛擬機(jī)管理器中的授權(quán)表管理子模塊發(fā)出銷毀被隔離驅(qū)動(dòng)初始授權(quán)表的指令。如果被隔離驅(qū)動(dòng)為最后一個(gè)被隔離的驅(qū)動(dòng),則執(zhí)行步驟(10);否則,執(zhí)行步驟(11)。(10)向虛擬機(jī)管理器中的頁(yè)面設(shè)置子模塊發(fā)出將被隔離驅(qū)動(dòng)程序所在的VM內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表設(shè)置為可寫的指令,避免不必要的寫操作缺頁(yè)異常。( 11)銷毀被隔離驅(qū)動(dòng)的相關(guān)隔離信息。(12)向虛擬機(jī)管理器中的缺頁(yè)處理子模塊更新被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信內(nèi)核的地址范圍。進(jìn)一步的,參考圖3所示,是一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法建立隔離運(yùn)行環(huán)境的流程圖的隔離運(yùn)行環(huán)境的方法,包括下述步驟
(I)首先,在需要隔離驅(qū)動(dòng)的VM (虛擬機(jī))中,加載上述的內(nèi)存信息監(jiān)視模塊。(2)利用上述驅(qū)動(dòng)隔離加載模塊,加載被隔離驅(qū)動(dòng)程序,使被隔離驅(qū)動(dòng)程序與內(nèi)存信息監(jiān)視模塊中的包裝函數(shù)庫(kù)建立聯(lián)系,從而使驅(qū)動(dòng)以隔離方式運(yùn)行。(3)內(nèi)存信息監(jiān)視模塊的隔離管理子模塊,通知VMM (內(nèi)存訪問控制模塊)相對(duì)于VM中被隔離的驅(qū)動(dòng)程序,VMM可信任VM內(nèi)核的地址范圍。(4)內(nèi)存信息監(jiān)視模塊的隔離管理子模塊,通知VMM建立被隔離驅(qū)動(dòng)程序?qū)?yīng)的初始內(nèi)存授權(quán)表。(5)內(nèi)存訪問控制模塊的授權(quán)表管理子模塊,在接收到VM發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令后,VMM建立記錄驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表。如果被隔離驅(qū)動(dòng)是VM中第一個(gè)被隔離的驅(qū)動(dòng),執(zhí)行步驟(6);否則,跳轉(zhuǎn)到步驟(7)。(6)內(nèi)存訪問控制模塊的頁(yè)面設(shè)置子模塊,在接收到VM發(fā)出的設(shè)置影子頁(yè)表的指令后,在VMM的影子頁(yè)表中,將保護(hù)被隔離驅(qū)動(dòng)程序所在的VM內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表設(shè)置為只讀。這樣當(dāng)VM執(zhí)行寫操作時(shí),就會(huì)陷入VMM的缺頁(yè)異常程序,從而就可判斷被隔離驅(qū)動(dòng)程序的寫操作是否正確。(7)運(yùn)行驅(qū)動(dòng)程序,并通過VM內(nèi)核內(nèi)存管理函數(shù)的包裝函數(shù)實(shí)時(shí)得捕捉并通知VMM更新對(duì)應(yīng)的內(nèi)存授權(quán)表。在虛擬機(jī)中,被隔離驅(qū)動(dòng)程序仍按照原來的方式運(yùn)行,無需任何改變,即隔離方式對(duì)虛擬機(jī)內(nèi)核和驅(qū)動(dòng)透明。而在內(nèi)存訪問控制模塊中,被隔離驅(qū)動(dòng)程序?qū)?yīng)內(nèi)存訪問控制模塊中的授權(quán)表,以及內(nèi)存訪問控制模塊中設(shè)置的頁(yè)面寫保護(hù),相當(dāng)于在內(nèi)存訪問控制模塊建立起一個(gè)被隔離驅(qū)動(dòng)環(huán)境的隔離運(yùn)行環(huán)境。隔離運(yùn)行環(huán)境是一種限制權(quán)限的環(huán)境,它只提供驅(qū)動(dòng)正常運(yùn)行的最小內(nèi)存資源。如果被隔離驅(qū)動(dòng)程序出現(xiàn)故障,違反了隔離環(huán)境限制,就將觸發(fā)錯(cuò)誤報(bào)告。需要說明的是,對(duì)其他不包含被隔離驅(qū)動(dòng)的虛擬機(jī)實(shí)例(如圖I中的VM2),本發(fā)明不影響它們?cè)械倪\(yùn)行方式。其虛擬機(jī)中無需加載任何額外模塊,且其內(nèi)存訪問控制模塊中對(duì)應(yīng)的影子頁(yè)表也不會(huì)被修改。進(jìn)一步的,一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法寫操作缺頁(yè)異常處理流程圖,參考圖4所示,包括下述步驟(I)當(dāng)VM執(zhí)行寫操作時(shí),由于VM所對(duì)應(yīng)的VMM的影子頁(yè)表的寫保護(hù),將觸發(fā)VMM的缺頁(yè)異常程序。(2) VMM的缺頁(yè)異常程序判斷執(zhí)行的寫操作是來自VM內(nèi)核還是來自VM中被隔離的驅(qū)動(dòng)程序。如果來自被隔離的驅(qū)動(dòng)程序,跳轉(zhuǎn)到步驟(3);否則,執(zhí)行步驟(5)。(3)判斷寫操作的地址范圍是否在驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中,如果不是,則執(zhí)行步驟(4);否則,執(zhí)行步驟(5)。(4)此時(shí)驅(qū)動(dòng)程序的寫操作越界,跳過寫操作指令,結(jié)束并報(bào)告錯(cuò)誤。(5)如果可以進(jìn)行寫操作,則將寫操作地址對(duì)應(yīng)的VMM的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)設(shè)置為可寫。(6)執(zhí)行寫操作。(7)寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的VMM的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)設(shè)置為只讀。
由于保護(hù)被隔離驅(qū)動(dòng)程序的虛擬機(jī)所對(duì)應(yīng)的影子頁(yè)表都被設(shè)置成了寫保護(hù),該虛擬機(jī)中的任何寫操作都將觸發(fā)內(nèi)存訪問控制模塊的缺頁(yè)異常。內(nèi)存訪問控制模塊的缺頁(yè)異常將根據(jù)虛擬機(jī)中隔離管理子模塊報(bào)告的可信任內(nèi)核的地址范圍來判斷寫指令的來源。如果來自可信任的虛擬機(jī)內(nèi)核,則允許寫操作;如果不是,還需結(jié)合被隔離驅(qū)動(dòng)程序的授權(quán)表來判斷;若在授權(quán)表中,則允許,否則,報(bào)告錯(cuò)誤。當(dāng)內(nèi)存訪問控制模塊允許寫操作之后,會(huì)開放寫操作地址對(duì)應(yīng)的內(nèi)存訪問控制模塊的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)的寫權(quán)限,并在數(shù)個(gè)CPU周期后,重新關(guān)閉相應(yīng)頁(yè)表項(xiàng)的寫權(quán)限。
權(quán)利要求
1.一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng),其特征在于包括運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊、虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊以及虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊,其中,所述運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊將驅(qū)動(dòng)模塊文件中監(jiān)視未定義符號(hào)與內(nèi)存信息監(jiān)視模塊中監(jiān)視包裝函數(shù)建立聯(lián)系,使得驅(qū)動(dòng)以隔離方式運(yùn)行,并向內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊發(fā)出被隔離驅(qū)動(dòng)程序提醒消息,以使得進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)程序;所述監(jiān)視未定義符號(hào)包括內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào);所述虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊包括包裝函數(shù)庫(kù)、隔離控制子模塊以及消息通信子模塊,其中,所述包裝函數(shù)庫(kù)為虛擬機(jī)內(nèi)核中所監(jiān)控的函數(shù)建立內(nèi)核包裝函數(shù),并為虛擬機(jī)內(nèi)核中驅(qū)動(dòng)接口中的接口函數(shù)建立驅(qū)動(dòng)包裝函數(shù),以使得被隔離驅(qū)動(dòng)與內(nèi)核和驅(qū)動(dòng)包裝函數(shù)鏈接,并進(jìn)入隔離運(yùn)行模式;所述內(nèi)核包裝函數(shù)包括內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù),所述內(nèi)存包裝函數(shù)是指內(nèi)核中內(nèi)存管理函數(shù)的包裝函數(shù),所述注冊(cè)包裝函數(shù)是指內(nèi)核中驅(qū)動(dòng)注冊(cè)函數(shù)的包裝函數(shù);所述隔離控制子模塊接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息,建立被隔離驅(qū)動(dòng)程序的相關(guān)信息,并指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令,同時(shí),根據(jù)需要獲取可信任的虛擬機(jī)內(nèi)核的地址范圍,注入到內(nèi)存訪問控制模塊,并發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令;所述可信任的虛擬機(jī)內(nèi)核的地址范圍包括虛擬機(jī)內(nèi)核代碼和未被隔離的驅(qū)動(dòng)程序代碼的內(nèi)存起始地址及其大??;所述消息通信子模塊向內(nèi)存訪問控制模塊實(shí)時(shí)報(bào)告被隔離驅(qū)動(dòng)所使用內(nèi)存信息、可信任的虛擬機(jī)內(nèi)核的地址范圍、及發(fā)送建立被隔離驅(qū)動(dòng)授權(quán)表的指令;所述消息通信子模塊被所述包裝函數(shù)庫(kù)和所述隔離控制子模塊調(diào)用;所述內(nèi)存訪問控制模塊用于控制被隔離驅(qū)動(dòng)程序?qū)懖僮?,包括授?quán)表管理子模塊、頁(yè)面設(shè)置子模塊以及缺頁(yè)處理子模塊,其中,所述授權(quán)表管理子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令后,設(shè)置被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表,并負(fù)責(zé)確認(rèn)寫操作地址是否在授權(quán)表中;所述頁(yè)面設(shè)置子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令,并根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)的影子頁(yè)表,將影子頁(yè)表設(shè)置為只讀另外,當(dāng)缺頁(yè)處理子模塊允許寫操作時(shí),還接收所述缺頁(yè)處理子模塊發(fā)出的允許寫操作段的指令,并設(shè)置寫操作目標(biāo)地址對(duì)應(yīng)的影子頁(yè)表,在寫操作結(jié)束后,重新將影子頁(yè)表設(shè)置為只讀;所述缺頁(yè)處理子模塊當(dāng)被隔離驅(qū)動(dòng)所在虛擬機(jī)內(nèi)核出現(xiàn)寫操作時(shí),根據(jù)寫操作指令的來源和被隔離驅(qū)動(dòng)對(duì)應(yīng)的授權(quán)表,判斷和控制是否允許進(jìn)行寫操作。
2.根據(jù)權(quán)利要求I所述的一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng),其特征在于,運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊具體用于運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊,將驅(qū)動(dòng)模塊文件中的內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào)替換為對(duì)應(yīng)的所述內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù)的符號(hào)及其符號(hào)名;調(diào)用虛擬機(jī)內(nèi)核的原模塊加載方式加載驅(qū)動(dòng)程序模塊,以使驅(qū)動(dòng)程序模塊中包裝函數(shù)符號(hào)將自動(dòng)鏈接到所述虛擬機(jī)內(nèi)存信息監(jiān)視模塊中的所監(jiān)控的包裝函數(shù),從而完成與內(nèi)核包裝函數(shù)建立聯(lián)系;虛擬機(jī)內(nèi)核的原模塊加載方式會(huì)調(diào)用驅(qū)動(dòng)模塊的初始化函數(shù),執(zhí)行驅(qū)動(dòng)注冊(cè),驅(qū)動(dòng)會(huì)自動(dòng)調(diào)用已經(jīng)鏈接到注冊(cè)包裝函數(shù)的驅(qū)動(dòng)注冊(cè)函數(shù),完成與驅(qū)動(dòng)包裝函數(shù)建立聯(lián)系。
3.根據(jù)權(quán)利要求I所述的一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng),其特征在于,所述隔離運(yùn)行模式是指被隔離驅(qū)動(dòng)程序使用的所有內(nèi)存信息都被實(shí)時(shí)的捕獲,并建立對(duì)應(yīng)的授權(quán)表,實(shí)現(xiàn)驅(qū)動(dòng)程序隔離運(yùn)行模式具體包括驅(qū)動(dòng)在加載時(shí),執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)向內(nèi)核的驅(qū)動(dòng)接口注冊(cè)驅(qū)動(dòng)程序,將內(nèi)核中驅(qū)動(dòng)模塊各個(gè)功能函數(shù)的地址賦予驅(qū)動(dòng)接口中的接口函數(shù)指針,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)對(duì)應(yīng)的包裝函數(shù),即注冊(cè)包裝函數(shù),從而實(shí)現(xiàn)內(nèi)核對(duì)驅(qū)動(dòng)調(diào)用過程的監(jiān)視;所述注冊(cè)包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原驅(qū)動(dòng)注冊(cè)函數(shù),并執(zhí)行驅(qū)動(dòng)接口中接口函數(shù)指針的替換操作;所述接口函數(shù)指針的替換操作是指將接口函數(shù)指針賦值成驅(qū)動(dòng)包裝函數(shù)的地址,代替原驅(qū)動(dòng)功能函數(shù)的地址;驅(qū)動(dòng)程序加載后,驅(qū)動(dòng)接口中的接口函數(shù)指針已被驅(qū)動(dòng)包裝函數(shù)所替換,當(dāng)內(nèi)核調(diào)用驅(qū)動(dòng)函數(shù)時(shí),將執(zhí)行驅(qū)動(dòng)包裝函數(shù),獲得驅(qū)動(dòng)所使用的被賦予內(nèi)存信息和棧內(nèi)存信息;驅(qū)動(dòng)包裝函數(shù)記錄被賦予內(nèi)存信息和棧內(nèi)存信息,并將被賦予內(nèi)存信息和棧內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊,執(zhí)行被隔離驅(qū)動(dòng)中的原驅(qū)動(dòng)函數(shù);所述被賦予內(nèi)存信息包括內(nèi)核授權(quán)驅(qū)動(dòng)操作的內(nèi)核數(shù)據(jù)結(jié)構(gòu)的內(nèi)存起始地址及其大小;所述棧內(nèi)存信息包括執(zhí)行驅(qū)動(dòng)程序的進(jìn)程的棧的內(nèi)存起始地址及其大?。或?qū)動(dòng)在運(yùn)行過程中,調(diào)用內(nèi)存管理函數(shù)來分配或釋放內(nèi)存,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行內(nèi)存管理函數(shù)對(duì)應(yīng)的包裝函數(shù),即內(nèi)存包裝函數(shù),實(shí)現(xiàn)向內(nèi)核申請(qǐng)分配或釋放內(nèi)存;所述內(nèi)存包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原內(nèi)存管理函數(shù),并記錄分配或釋放的堆內(nèi)存信息,并將堆內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊;所述堆內(nèi)存信息包括驅(qū)動(dòng)程序向所述虛擬機(jī)內(nèi)核申請(qǐng)分配或釋放的內(nèi)存起始地址及其大小。
4.根據(jù)權(quán)利要求I所述的一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng),其特征在于,所述內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊具體用于O當(dāng)接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出建立被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成只讀模式的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,注入所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;2)當(dāng)捕獲驅(qū)動(dòng)進(jìn)入內(nèi)核的消息,但沒有接收到進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)的消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;3)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)為被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出銷毀被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中最后一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成可寫入模式的指令;4)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)不是被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍。
5.根據(jù)權(quán)利要求I所述的一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng),其特征在于,所述內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊具體用于當(dāng)被隔離驅(qū)動(dòng)程序加載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令,并建立被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的初始授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中時(shí),接收所述虛擬機(jī)所述包裝函數(shù)庫(kù)發(fā)出的更新被隔離驅(qū)動(dòng)授權(quán)表的指令,并根據(jù)所述包裝函數(shù)實(shí)時(shí)捕捉的驅(qū)動(dòng)程序所使用的內(nèi)存信息,更新對(duì)應(yīng)的所述驅(qū)動(dòng)授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,發(fā)生寫操作缺頁(yè)異常時(shí),接收所述缺頁(yè)處理子模塊的查詢授權(quán)表指令,并查詢寫操作地址是否在驅(qū)動(dòng)授權(quán)表中;當(dāng)被隔離驅(qū)動(dòng)程序卸載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的銷毀被隔離驅(qū)動(dòng)授權(quán)表的指令,銷毀被隔離驅(qū)動(dòng)授權(quán)表。
6.根據(jù)權(quán)利要求I所述的一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng),其特征在于,所述內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊具體用于接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的只讀指令,并根據(jù)被隔離驅(qū)動(dòng)為所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng),將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為只讀;接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的可寫指令,并根據(jù)最后一個(gè)被隔離驅(qū)動(dòng)被卸載出所述虛擬機(jī)內(nèi)核,將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為可寫,防止不必要的缺頁(yè)異常;當(dāng)被隔離驅(qū)動(dòng)不是所述虛擬機(jī)中第一個(gè)加載的被隔離驅(qū)動(dòng),或最后一個(gè)卸載出的被隔離驅(qū)動(dòng)時(shí),直接運(yùn)行所述驅(qū)動(dòng)程序,不進(jìn)行整個(gè)虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表的設(shè)置;當(dāng)所述缺頁(yè)處理子模塊允許進(jìn)行寫操作時(shí),所述頁(yè)面設(shè)置子模塊將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀。
7.根據(jù)權(quán)利要求I所述的一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng),其特征在于,所述內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊還用于當(dāng)寫操作是來自可信任的虛擬機(jī)內(nèi)核時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)寫操作是來自虛擬機(jī)中被隔離的驅(qū)動(dòng)程序,且寫操作的地址范圍在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)寫操作是來自虛擬機(jī)中被隔離的驅(qū)動(dòng)程序,且寫操作的地址范圍不在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),跳過寫操作指令,結(jié)束所述驅(qū)動(dòng)程序并報(bào)告錯(cuò)誤。
8.根據(jù)權(quán)利要求I所述一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法,其特征在于,包括以下步驟在需要隔離驅(qū)動(dòng)程序的虛擬機(jī)中加載虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊;內(nèi)存信息監(jiān)視模塊通過所述驅(qū)動(dòng)隔離加載模塊加載被隔離驅(qū)動(dòng)程序,將被隔離驅(qū)動(dòng)程序模塊中未定義符號(hào)與內(nèi)存信息監(jiān)視模塊中監(jiān)視包裝函數(shù)建立聯(lián)系,使得被隔離驅(qū)動(dòng)在加載之后以隔離方式運(yùn)行;并向內(nèi)存信息監(jiān)視模塊中的隔離控制子模塊發(fā)出被隔離驅(qū)動(dòng)程序提醒消息,以使得進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)程序;所述監(jiān)視未定義符號(hào)包括內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào);隔離控制子模塊接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息,建立被隔離驅(qū)動(dòng)程序的相關(guān)信息,并指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令,同時(shí),根據(jù)需要獲取可信任的虛擬機(jī)內(nèi)核的地址范圍,注入到內(nèi)存訪問控制模塊,并發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令;所述可信任的虛擬機(jī)內(nèi)核的地址范圍包括虛擬機(jī)內(nèi)核代碼和未被隔離的驅(qū)動(dòng)程序代碼的內(nèi)存起始地址及其大小;授權(quán)表管理子模塊接收到隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令后,設(shè)置驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表;頁(yè)面設(shè)置子模塊接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置虛擬機(jī)管理器中影子頁(yè)表的指令,并根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)的影子頁(yè)表,將影子頁(yè)表設(shè)置為接收所述缺頁(yè)處理子模塊發(fā)出的允許寫操作段的指令,并設(shè)置寫操作目標(biāo)地址對(duì)應(yīng)的影子頁(yè)表;所述缺頁(yè)處理子模塊接收所述隔離管理子模塊發(fā)出的可信任內(nèi)核的地址范圍的信息,記錄所述虛擬機(jī)的可信任內(nèi)核的地址范圍,判斷和控制是否允許進(jìn)行寫操作。
9.根據(jù)權(quán)利要求8所述的一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離方法,其特征在于,所述將被隔離驅(qū)動(dòng)程序模塊中未定義符號(hào)與內(nèi)存信息監(jiān)視模塊中監(jiān)視包裝函數(shù)建立聯(lián)系具體包括將運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)模塊文件中的內(nèi)存管理函數(shù)的未定義符號(hào)和驅(qū)動(dòng)注冊(cè)函數(shù)的未定義符號(hào)替換為對(duì)應(yīng)的所述內(nèi)存包裝函數(shù)和注冊(cè)包裝函數(shù)的符號(hào)及其符號(hào)名;調(diào)用虛擬機(jī)內(nèi)核的原模塊加載方式加載驅(qū)動(dòng)程序模塊,以使得虛擬機(jī)用戶態(tài)中修改過所監(jiān)控未定義符號(hào)的驅(qū)動(dòng)模塊文件在加載之后自動(dòng)鏈接到所述虛擬機(jī)內(nèi)存信息監(jiān)視模塊中的所監(jiān)控的包裝函數(shù),從而完成與內(nèi)核包裝函數(shù)建立聯(lián)系;虛擬機(jī)內(nèi)核的原模塊加載方式會(huì)調(diào)用驅(qū)動(dòng)模塊的初始化函數(shù),執(zhí)行驅(qū)動(dòng)注冊(cè),驅(qū)動(dòng)會(huì)自動(dòng)調(diào)用已經(jīng)鏈接到注冊(cè)包裝函數(shù)的驅(qū)動(dòng)注冊(cè)函數(shù),完成與驅(qū)動(dòng)包裝函數(shù)建立聯(lián)系; 所述實(shí)現(xiàn)驅(qū)動(dòng)程序隔離運(yùn)行模式具體包括驅(qū)動(dòng)在加載時(shí),執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)向內(nèi)核的驅(qū)動(dòng)接口注冊(cè)驅(qū)動(dòng)程序,將內(nèi)核中驅(qū)動(dòng)模塊各個(gè)功能函數(shù)的地址賦予驅(qū)動(dòng)接口中的接口函數(shù)指針,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行驅(qū)動(dòng)注冊(cè)函數(shù)對(duì)應(yīng)的包裝函數(shù),即注冊(cè)包裝函數(shù),從而實(shí)現(xiàn)內(nèi)核對(duì)驅(qū)動(dòng)調(diào)用過程的監(jiān)視;所述注冊(cè)包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原驅(qū)動(dòng)注冊(cè)函數(shù),并執(zhí)行驅(qū)動(dòng)接口中接口函數(shù)指針的替換操作;所述接口函數(shù)指針的替換操作是指將接口函數(shù)指針賦值成驅(qū)動(dòng)包裝函數(shù)的地址,代替原驅(qū)動(dòng)功能函數(shù)的地址;驅(qū)動(dòng)程序加載后,驅(qū)動(dòng)接口中的接口函數(shù)指針已被驅(qū)動(dòng)包裝函數(shù)所替換,當(dāng)內(nèi)核調(diào)用驅(qū)動(dòng)函數(shù)時(shí),將執(zhí)行驅(qū)動(dòng)包裝函數(shù),獲得驅(qū)動(dòng)所使用的被賦予內(nèi)存信息和棧內(nèi)存信息;驅(qū)動(dòng)包裝函數(shù)記錄被賦予內(nèi)存信息和棧內(nèi)存信息,并將被賦予內(nèi)存信息和棧內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊,執(zhí)行被隔離驅(qū)動(dòng)中的原驅(qū)動(dòng)函數(shù);所述被賦予內(nèi)存信息包括內(nèi)核授權(quán)驅(qū)動(dòng)操作的內(nèi)核數(shù)據(jù)結(jié)構(gòu)的內(nèi)存起始地址及其大??;所述棧內(nèi)存信息包括執(zhí)行驅(qū)動(dòng)程序的進(jìn)程的棧的內(nèi)存起始地址及其大??;驅(qū)動(dòng)在運(yùn)行過程中,調(diào)用內(nèi)存管理函數(shù)來分配或釋放內(nèi)存,通過所述驅(qū)動(dòng)隔離加載模塊,驅(qū)動(dòng)實(shí)際將執(zhí)行內(nèi)存管理函數(shù)對(duì)應(yīng)的包裝函數(shù),即內(nèi)存包裝函數(shù),實(shí)現(xiàn)向內(nèi)核申請(qǐng)分配或釋放內(nèi)存;所述內(nèi)存包裝函數(shù)執(zhí)行所述虛擬機(jī)內(nèi)核中的原內(nèi)存管理函數(shù),并記錄分配或釋放的堆內(nèi)存信息,并將堆內(nèi)存信息注入到虛擬機(jī)管理器的授權(quán)表管理子模塊;所述堆內(nèi)存信息包括驅(qū)動(dòng)程序向所述虛擬機(jī)內(nèi)核申請(qǐng)分配或釋放的內(nèi)存起始地址及其大小;指示消息通信子模塊向所述虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊發(fā)送設(shè)置被隔離驅(qū)動(dòng)授權(quán)表的指令具體包括O當(dāng)接收運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊發(fā)出的被隔離驅(qū)動(dòng)程序提醒消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出建立被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成只讀模式的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,注入所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;2)當(dāng)捕獲驅(qū)動(dòng)進(jìn)入內(nèi)核的消息,但沒有接收到進(jìn)入內(nèi)核的驅(qū)動(dòng)為被隔離驅(qū)動(dòng)的消息時(shí),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;3)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)為被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的授權(quán)表管理子模塊,發(fā)出銷毀被隔離驅(qū)動(dòng)程序?qū)?yīng)授權(quán)表的指令;當(dāng)被隔離驅(qū)動(dòng)是所述虛擬機(jī)中最后一個(gè)被隔離的驅(qū)動(dòng)時(shí),向內(nèi)存訪問控制模塊中的頁(yè)6面設(shè)置子模塊,發(fā)出設(shè)置虛擬機(jī)管理器中影子頁(yè)表為成可寫入模式的指令;4)當(dāng)捕獲驅(qū)動(dòng)卸載出內(nèi)核的消息時(shí),查詢已有的被隔離驅(qū)動(dòng)信息,如果發(fā)現(xiàn)卸載出的驅(qū)動(dòng)不是被隔離驅(qū)動(dòng),將執(zhí)行以下操作向內(nèi)存訪問控制模塊中的缺頁(yè)處理子模塊,更新所述被隔離驅(qū)動(dòng)所在虛擬機(jī)的可信任內(nèi)核空間的地址范圍;所述設(shè)置驅(qū)動(dòng)程序可寫內(nèi)存范圍的授權(quán)表,具體包括當(dāng)被隔離驅(qū)動(dòng)程序加載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的建立被隔離驅(qū)動(dòng)授權(quán)表的指令,并建立被隔離驅(qū)動(dòng)程序可寫內(nèi)存范圍的初始授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,接收所述虛擬機(jī)所述包裝函數(shù)庫(kù)發(fā)出的更新被隔離驅(qū)動(dòng)授權(quán)表的指令,并根據(jù)所述包裝函數(shù)實(shí)時(shí)捕捉的驅(qū)動(dòng)程序所使用的內(nèi)存信息,更新對(duì)應(yīng)的所述驅(qū)動(dòng)授權(quán)表;當(dāng)被隔離驅(qū)動(dòng)程序運(yùn)行過程中,發(fā)生寫操作缺頁(yè)異常時(shí),接收所述缺頁(yè)處理子模塊的查詢授權(quán)表指令,并查詢寫操作地址是否在驅(qū)動(dòng)授權(quán)表中;當(dāng)被隔離驅(qū)動(dòng)程序卸載完成時(shí),接收所述虛擬機(jī)中所述隔離管理子模塊發(fā)出的銷毀被隔離驅(qū)動(dòng)授權(quán)表的指令,銷毀被隔離驅(qū)動(dòng)授權(quán)表;根據(jù)所述被隔離驅(qū)動(dòng)所在虛擬機(jī)內(nèi)核空間在虛擬機(jī)管理器中所對(duì)應(yīng)影子頁(yè)表,進(jìn)行頁(yè)表設(shè)置,具體包括接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的只讀指令,并根據(jù)被隔離驅(qū)動(dòng)為所述虛擬機(jī)中第一個(gè)被隔離的驅(qū)動(dòng),將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為只讀;接收所述內(nèi)存信息監(jiān)視模塊發(fā)出的設(shè)置影子頁(yè)表的可寫指令,并根據(jù)最后一個(gè)被隔離驅(qū)動(dòng)被卸載出所述虛擬機(jī)內(nèi)核,將被隔離驅(qū)動(dòng)程序所在虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的虛擬機(jī)管理器中的影子頁(yè)表中的所有頁(yè)表設(shè)置為可寫,防止不必要的缺頁(yè)異常;當(dāng)被隔離驅(qū)動(dòng)不是所述虛擬機(jī)中第一個(gè)加載進(jìn)的被隔離驅(qū)動(dòng),或最后一個(gè)卸載出的被隔離驅(qū)動(dòng)時(shí),直接運(yùn)行所述驅(qū)動(dòng)程序,不進(jìn)行整個(gè)虛擬機(jī)內(nèi)核空間對(duì)應(yīng)的所有影子頁(yè)表的設(shè)置;當(dāng)所述缺頁(yè)處理子模塊允許進(jìn)行寫操作時(shí),所述頁(yè)面設(shè)置子模塊將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;根據(jù)寫操作指令的來源和被隔離驅(qū)動(dòng)對(duì)應(yīng)的授權(quán)表,判斷和控制是否允許進(jìn)行寫操作具體包括當(dāng)寫操作是來自可信任的虛擬機(jī)內(nèi)核時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)寫操作是來自虛擬機(jī)中被隔離的驅(qū)動(dòng)程序,且寫操作的地址范圍在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),則通知頁(yè)面設(shè)置子模塊,將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為可寫,并且執(zhí)行寫操作,在寫操作結(jié)束后,重新將寫操作地址對(duì)應(yīng)的影子頁(yè)表的相應(yīng)頁(yè)表項(xiàng)改為只讀;當(dāng)進(jìn)行寫操作,且寫操作的地址范圍不在被隔離驅(qū)動(dòng)程序?qū)?yīng)的授權(quán)表中時(shí),跳過寫操作指令,結(jié)束所述驅(qū)動(dòng)程序并報(bào)告錯(cuò)誤。
全文摘要
本發(fā)明公開了一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)與方法,涉及計(jì)算機(jī)容錯(cuò)技術(shù),通過被隔離驅(qū)動(dòng)程序的授權(quán)表,實(shí)現(xiàn)簡(jiǎn)單、有效、兼容已有操作系統(tǒng)和驅(qū)動(dòng)程序架構(gòu)的基于全虛擬化技術(shù)在虛擬機(jī)內(nèi)部隔離驅(qū)動(dòng)程序的系統(tǒng),一種在虛擬機(jī)內(nèi)部的驅(qū)動(dòng)隔離系統(tǒng)包括運(yùn)行于虛擬機(jī)用戶態(tài)的驅(qū)動(dòng)隔離加載模塊、虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊以及虛擬機(jī)管理器內(nèi)部的內(nèi)存訪問控制模塊,所述虛擬機(jī)內(nèi)核態(tài)的內(nèi)存信息監(jiān)視模塊包括包裝函數(shù)庫(kù)、隔離控制子模塊以及消息通信子模塊。
文檔編號(hào)G06F21/50GK102938035SQ20121044275
公開日2013年2月20日 申請(qǐng)日期2012年11月8日 優(yōu)先權(quán)日2012年11月8日
發(fā)明者董小社, 鄭豪, 張興軍, 王恩東, 辛龍, 張東, 陳寶可, 王強(qiáng) 申請(qǐng)人:西安交通大學(xué), 山東高效能服務(wù)器和存儲(chǔ)研究院
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
来安县| 象山县| 邵东县| 中阳县| 前郭尔| 肃宁县| 全南县| 上饶县| 龙州县| 靖宇县| 奉新县| 射阳县| 敦煌市| 邹平县| 崇仁县| 平邑县| 迁西县| 赤峰市| 玉树县| 蒲城县| 饶阳县| 静海县| 工布江达县| 铁力市| 深泽县| 涟源市| 靖江市| 宁明县| 阿克| 都兰县| 宜兰市| 鹤峰县| 东辽县| 新乡县| 合水县| 张掖市| 新建县| 榆林市| 天长市| 新津县| 松原市|