專利名稱:基于塊對目標代碼掃描并替換敏感指令的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及面向X86體系結(jié)構(gòu)操作系統(tǒng)虛擬化的二進制翻譯(Binary Translation, BT)方法,尤其是對目標代碼進行掃描并對掃描中發(fā)現(xiàn)的敏感指令進行替換的方法。
背景技術(shù):
近年來,隨著硬件技術(shù)的迅猛發(fā)展尤其是多核乃至眾核處理器的出現(xiàn),提高計算機 系統(tǒng)高速增長計算能力的使用率日益成為迫切的市場需求。操作系統(tǒng)虛擬化技術(shù)通過在 同一臺物理機器上同時運行多個操作系統(tǒng)并對外提供服務,能夠有效提高服務器的利用 率,因而受到各研究機構(gòu)和商業(yè)機構(gòu)的高度重視,并在服務器整合、計算機安全、虛擬 數(shù)據(jù)中心等領(lǐng)域得到廣泛應用。
操作系統(tǒng)虛擬化依賴于一種稱為虛擬監(jiān)控器(Virtual Machine Monitor, VMM)的 系統(tǒng)軟件,被虛擬化的操作系統(tǒng)則稱為客戶操作系統(tǒng)(Guest 0S, G0S)。目前,V顧軟 件主要基于三種方法實現(xiàn)操作系統(tǒng)虛擬化,即硬件輔助虛擬化、半虛擬化和BT虛擬化。 三種方法的基本原理及特點簡述如下
1) 硬件輔助虛擬化要求處理器提供硬件支持,如Intel的VT技術(shù)和AMD的SVM技術(shù)。 VMM通過捕獲在特殊處理器狀態(tài)下運行的客戶操作系統(tǒng)執(zhí)行敏感指令時觸發(fā)的硬件 異常實現(xiàn)操作系統(tǒng)虛擬化,如XenSource公司的虛擬機監(jiān)視器產(chǎn)品Xen和開源軟件 KVM等。該方法的優(yōu)點為實現(xiàn)簡單,缺點是需要在處理器普通狀態(tài)與虛擬化狀態(tài)之 間頻繁切換,并且切換的系統(tǒng)開銷遠大于普通系統(tǒng)調(diào)用。
2) 半虛擬化要求客戶操作系統(tǒng)降特權(quán)級(如Ringl)運行,并對其源代碼相應部分進 行修改以配合V薩實現(xiàn)虛擬化。該方法的局限性在于必須獲得GOS源代碼,并且需 要對任何希望虛擬化的操作系統(tǒng)進行修改,移植和維護工作量巨大。Xen是采用半 虛擬化技術(shù)的代表(同一 VMM可對不同GOS采用不同的虛擬化方法)。
3) BT虛擬化則通過對GOS內(nèi)核二進制代碼進行掃描,發(fā)現(xiàn)其中的敏感指令,并將其轉(zhuǎn) 換為相應的虛擬化代碼來實現(xiàn)GOS虛擬化。采用BT虛擬化方法的VMM有VMWare公 司的濯are Workstation禾口 Sun公司的VirtualBox。
與前兩種方法相比,BT虛擬化對軟硬件等外部條件的依賴最小——既不需要硬件支持,也不需要獲得客戶操作系統(tǒng)源代碼,其關(guān)鍵就在于通過掃描發(fā)現(xiàn)內(nèi)核二進制代碼 中的敏感指令,并將其轉(zhuǎn)換為包含相應虛擬化功能代碼且保持G0S原有執(zhí)行語義不變的 一段指令序列。所謂"敏感指令"泛指所有一旦在真實處理器上執(zhí)行即可能改變處理器 的實際狀態(tài),從而導致VMM或其它客戶操作系統(tǒng)無法正常運行的指令或基于安全隔離目 的需要V腿介入的指令。敏感指令轉(zhuǎn)換方法有指令緩存和本地替換兩種指令緩存方法不修改內(nèi)存中的G0S代碼,而是在指令緩沖區(qū)內(nèi)復制、轉(zhuǎn)換即將執(zhí)行的目標代碼塊,并在該緩沖區(qū)內(nèi)執(zhí)行轉(zhuǎn)換后的目標代碼塊,如VMWare和開源軟件Qemu。本地替換方法則直接在敏感指令所在 內(nèi)存位置將其替換為一條控制轉(zhuǎn)移指令,通常為JMP指令,使目標代碼改變流程去執(zhí)行 一段與敏感指令原有語義等價的虛擬化功能代碼或安全檢查代碼,以達到虛擬化或安全 隔離目的。與指令緩存方法相比,本地替換方法具有簡單直觀、內(nèi)存占用量小等優(yōu)點, 但是采用該方法時,將不可避免地遇到部分敏感指令長度小于替換指令即短敏感指令的 情形。例如在X86體系結(jié)構(gòu)中,為了能夠直接跳轉(zhuǎn)到任意虛地址空間,通常使用5字 節(jié)或更長的JMP跳轉(zhuǎn)指令作為替換指令,而某些敏感指令,如P0PF指令,只有l(wèi)字節(jié) 長度,無法直接替換成JMP指令。針對這一情形,目前已知的基于本地替換方法的V麗軟件均采用可觸發(fā)硬件異常的 軟中斷指令(INTO或INT3指令)進行替換,如Sun公司的VirtualBox采用1字節(jié)長 度的INT3指令(0xCC)替換所有長度小于JMP指令的敏感指令。但是,釆用INT0/INT3 指令替換的主要缺點在于每次執(zhí)行該指令時都會觸發(fā)硬件異常,尤其是當被替換指令 被頻繁調(diào)用時,硬件狀態(tài)的反復切換將導致大量的系統(tǒng)開銷。因此,當敏感指令長度小 于JMP指令長度時,如何尋找包含該敏感指令且長度不小于JMP指令的最小目標代碼塊, 并將該最小目標代碼塊替換為JMP指令,以減少使用INT3指令替換的概率,同時保持 目標代碼原有執(zhí)行語義不變,是本領(lǐng)域技術(shù)人員關(guān)注的重要問題。發(fā)明內(nèi)容本發(fā)明要解決的技術(shù)問題為提供一種基于塊對目標代碼掃描并替換敏感指令的方法,當敏感指令長度小于JMP跳轉(zhuǎn)指令時,尋找包含該敏感指令且長度不小于JMP指令 的最小目標代碼塊,并用JMP指令替換該最小目標代碼塊,同時保持最小目標代碼塊原 有執(zhí)行語義不變。包含指定敏感指令且長度不小于JMP指令的最小目標代碼塊稱為該敏 感指令的替換代碼塊,簡稱替換塊。為了準確描述本發(fā)明,首先給出如下說明及定義-
在X86體系結(jié)構(gòu)中,所有控制轉(zhuǎn)移指令包括JCC、 JMP、 CALL、 RET和IRET指令。 這些控制轉(zhuǎn)移指令可劃分為兩類有條件轉(zhuǎn)移指令和無條件轉(zhuǎn)移指令。除全部JCC指令 以外,JMP/CALL/RET/IRET指令都是無條件轉(zhuǎn)移指令。所有控制轉(zhuǎn)移指令又可劃分為目標 地址明確控制轉(zhuǎn)移指令和目標地址不明確控制轉(zhuǎn)移指令。目標地址明確控制轉(zhuǎn)移指令包 括全部JCC指令、直接CALL指令和直接JMP指令,簡稱為直接控制轉(zhuǎn)移指令;目標地 址不明確控制轉(zhuǎn)移指令則包括間接CALL指令、間接JMP指令、LCALL指令、LJMP指令、 RET指令和IRET指令,簡稱為間接控制轉(zhuǎn)移指令。正是由于控制轉(zhuǎn)移指令固有的、改變 程序執(zhí)行流程的特性,才使得目標代碼具有代碼塊的概念,即從一個代碼塊轉(zhuǎn)移到另外 一個代碼塊繼續(xù)執(zhí)行。
定義l:基本塊(Basic Block, BB)是指以G0S起始執(zhí)行地址、G0S中斷處理函數(shù)首 地址或控制轉(zhuǎn)移指令目標地址為起始邊界,以無條件控制轉(zhuǎn)移指令或已掃描地址為結(jié)束 邊界的連續(xù)目標指令序列。
定義2:替換塊(R印lacedBlock, RB)是指滿足以下條件的最短連續(xù)目標指令序列
1) 位于基本塊內(nèi)部(包括基本塊自身);
2) 包含指定敏感指令且長度不小于JMP指令長度;
3) 不含所屬基本塊范圍之內(nèi)、本替換塊范圍之外任何控制轉(zhuǎn)移指令的目標地址(本 替換塊首地址除外)。
定義3:轉(zhuǎn)換塊(Translated Block, TB)是指替換塊被替換之后,經(jīng)由替換指令(通 常為JMP指令或INT3指令)執(zhí)行、包含虛擬化代碼或安全檢査代碼且與原替換塊具有等 價執(zhí)行語義的一組指令序列。
定義4:待轉(zhuǎn)換敏感指令隊列是指以線性鏈表形式實現(xiàn)的、保存基本塊掃描時發(fā)現(xiàn)的 敏感指令地址及其相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)。待轉(zhuǎn)換敏感指令隊列節(jié)點以敏感指令地址為索 引值,按地址大小按序排列。
定義5:待掃描入口地址隊列是指以線性鏈表形式實現(xiàn)的、保存動態(tài)掃描時發(fā)現(xiàn)的控 制轉(zhuǎn)移指令目標地址及其調(diào)用地址的數(shù)據(jù)結(jié)構(gòu)。待掃描入口地址隊列節(jié)點以目標地址為 索引值,按地址大小按序排列。
定義6調(diào)用者地址隊列是指以線性鏈表形式實現(xiàn)的、保存具有相同目標地址的控制轉(zhuǎn) 移指令地址的數(shù)據(jù)結(jié)構(gòu)。調(diào)用者地址隊列節(jié)點以控制轉(zhuǎn)移指令地址為索引值,包含在待 掃描入口地址隊列的每個節(jié)點之中。
9是指以平衡二叉樹AVL(balanced binary tree, 以發(fā)明者G.M. Adelson-Velskii和E.M.Landis名字命名)形式實現(xiàn)的、保存被替換RB相 關(guān)信息的數(shù)據(jù)結(jié)構(gòu)。樹中節(jié)點以被替換RB首地址為索引值,其它信息包括被替換RB的 長度及其與對應TB中每條指令地址的對應關(guān)系等。
定義7:掃描信息位圖是指以位圖(一段連續(xù)虛擬內(nèi)存單元)形式實現(xiàn)的、用于保存 G0S內(nèi)核虛地址掃描狀態(tài)及相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)。在掃描信息位圖中,每條GOS虛地址的 掃描信息由與該地址一一對應的掃描信息位元(簡稱位元)描述,每個掃描信息位元由 二個比特位組成OO表示該位元對應的虛地址未掃描或非指令首地址;Ol表示該位元對 應的虛地址已掃描;10表示該位元對應的虛地址未掃描或非指令首地址且為基本塊邊界 或控制轉(zhuǎn)移指令目標地址;11表示該位元對應的虛地址已掃描且為基本塊邊界地址或控
制轉(zhuǎn)移指令目標地址。從以上描述可看出當位元的高位為1時,表示對應的虛地址為
基本塊邊界或控制轉(zhuǎn)移指令的目標地址;當位元的低位為1時,表示對應的虛地址已掃 描。由于每個虛地址對應二個比特位,因此每個4KB G0S內(nèi)核代碼頁需要1KB大小的連 續(xù)虛擬內(nèi)存作為其掃描信息位圖。反之,每個4KB數(shù)據(jù)頁可作為4個連續(xù)G0S內(nèi)核代碼 頁的掃描信息位圖,將這種用途的數(shù)據(jù)頁稱為掃描信息位圖頁。
掃描信息位圖索引結(jié)構(gòu)由掃描信息位圖頁目錄頁(以下簡稱頁目錄頁)、掃描信息 位圖頁表頁(以下簡稱頁表頁)和掃描信息位圖頁(以下簡稱位圖頁)組成。相應的, G0S內(nèi)核虛地址劃分為頁目錄索引、頁表索引和頁內(nèi)偏移三個位段最高X位為頁目錄索
引,對應2》個頁目錄項,存放頁表頁的首地址;中間Y位為頁表索引,對應2y個頁表項,
存放位圖頁的首地址;最低Z位為頁內(nèi)偏移,存放內(nèi)核虛地址對應的掃描信息位元在位 圖頁中的偏移量(以二個比特為單位計算)。
在上述定義的基礎(chǔ)之上,本發(fā)明具體技術(shù)方案如下
步驟l.創(chuàng)建并初始化全局數(shù)據(jù)結(jié)構(gòu)
1.1創(chuàng)建并初始化掃描信息位圖頁目錄頁分配一個數(shù)據(jù)頁作為掃描信息位圖索引 結(jié)構(gòu)中的頁目錄頁,并將頁目錄頁中的頁目錄項全部初始化為0 (表示全部G0S內(nèi)核虛地 址空間尚未掃描);
1.2初始化待掃描入口地址隊列及已替換RB有效信息平衡二叉樹將待掃描入口地 址隊列及已替換RB有效信息平衡二叉樹的頭指針設(shè)為NULL。 1.3令全局變量M = JMP替換指令長度。步驟2.從G0S內(nèi)核加載程序(如Grub)輸入?yún)?shù)中獲取G0S內(nèi)核起始執(zhí)行地址, 記為首個掃描入口地址,然后對首個掃描入口地址進行動態(tài)掃描
2.1. 采用掃描狀態(tài)査詢方法檢查首個掃描入口地址的掃描狀態(tài)若已掃描,轉(zhuǎn)步驟 3;若未掃描,將首個掃描入口地址記為基本塊起始邊界,轉(zhuǎn)2.2。掃描狀態(tài)查詢方法為 首先將被查詢地址劃分為頁目錄索引、頁表索引和頁內(nèi)偏移三個位段;然后檢査頁目錄 索引指向的頁目錄項,若頁目錄項為0,則返回-1表示該地址未掃描且該地址對應位元 不存在。若頁目錄項不為0,則繼續(xù)檢查頁表索引指向的頁表項,若頁表項為0,則返回 -1表示該地址未掃描且該地址對應位元不存在,若頁表項不為0,則根據(jù)頁表項中的掃 描信息位圖頁首地址和頁內(nèi)偏移計算得到被查詢地址對應位元的實際位置并返回位元的 實際值。最后根據(jù)位元的實際值確定被掃描指令的首地址的掃描狀態(tài)位元的實際值低 位為l表示已掃描,為0表示未掃描。
2.2. 對基本塊起始邊界進行基本塊掃描,方法是-
2.2.1初始化待轉(zhuǎn)換敏感指令隊列將待轉(zhuǎn)換敏感指令隊列頭指針設(shè)為NULL; 2.2.2將基本塊起始地址設(shè)為待掃描地址;
2.2.3對待掃描地址處指令進行譯碼,根據(jù)譯碼結(jié)果執(zhí)行以下操作 2.2.3.1若為敏感指令或間接控制轉(zhuǎn)移指令,則將該指令添加到待轉(zhuǎn)換敏感指令隊 列,轉(zhuǎn)2.2.4;
2.2.3.2若為直接控制轉(zhuǎn)移指令,則首先采用目標地址有效性檢查方法檢査該目標 地址是否指向已替換RB內(nèi)部若指向已替換RB內(nèi)部,則將直接控制轉(zhuǎn)移指令添加到待 轉(zhuǎn)換敏感指令隊列以便替換時對其目標地址進行修正,然后轉(zhuǎn)2.2.4;若不指向已替換 RB內(nèi)部,則采用2. 1中掃描狀態(tài)查詢方法檢査目標地址的掃描狀態(tài),若目標地址已掃描 則轉(zhuǎn)2.2.4,否則將目標地址添加到待掃描入口地址隊列,轉(zhuǎn)2.2.4。目標地址有效性檢 査方法為采用通用的平衡二叉樹遍歷方法遍歷已替換RB有效信息平衡二叉樹,找到索 引值小于指定目標地址且與指定目標地址最接近的節(jié)點,若指定目標地址小于或等于該 節(jié)點索引值(即已替換RB的首地址)加上節(jié)點中記錄的已替換RB長度,則表明指定目 標地址指向己替換RB內(nèi)部,否則不指向已替換RB內(nèi)部。
2.2.3.3若為普通指令,則轉(zhuǎn)2.2.4;
2.2.4根據(jù)譯碼結(jié)果記錄被掃描指令的掃描狀態(tài),方法為首先采用掃描信息位元索 引方法得到被掃描指令首地址對應位元的實際位置,將該位元的低位設(shè)為1;然后采用掃 描信息位元索引方法依次得到被掃描指令所有剩余字節(jié)對應位元的實際位置,將這些位元設(shè)為00;最后若被掃描指令為直接控制轉(zhuǎn)移指令,則采用掃描信息位元索引方法得到 該控制轉(zhuǎn)移指令目標地址對應的位元的實際位置,并將該位元的高位設(shè)為l。其中,掃描 信息位元索引方法為首先將被索引地址劃分為頁目錄索引、頁表索引和頁內(nèi)偏移三個 位段;然后檢査頁目錄索引指向的頁目錄項是否為O,是則立即分配一個數(shù)據(jù)頁作為掃描 信息位圖頁表頁并將該頁表頁的首地址寫入頁目錄頁中對應的頁目錄項中;接著檢查頁 表索引指向的頁表項是否為O,是則立即分配一個數(shù)據(jù)頁作為掃描信息位圖頁并將該位圖
頁的首地址寫入頁表頁中對應的頁表項中;最后根據(jù)掃描信息位圖頁首地址和頁內(nèi)偏移
得到被索弓I地址對應位元的實際位置。
2.2.5將被掃描指令地址加上該指令長度,得到下一條指令的首地址。 2.2.6若被掃描指令為無條件控制轉(zhuǎn)移指令或采用2.1中掃描狀態(tài)查詢方法發(fā)現(xiàn)下 一條指令首地址已掃描,則將下一條指令首地址設(shè)為基本塊的結(jié)束邊界,并將其掃描信 息位元的高位設(shè)為l,表示該地址為基本塊邊界地址或控制轉(zhuǎn)移指令目標地址,然后結(jié)束 本次基本塊掃描并轉(zhuǎn)2. 3;否則轉(zhuǎn)2.2.7。
2.2.7將下一條指令首地址設(shè)為待掃描地址,轉(zhuǎn)2.2.3,繼續(xù)進行基本塊掃描。 2. 3對待轉(zhuǎn)換敏感指令隊列中的敏感指令進行基于替換塊的敏感指令本地替換 2.3.1若待轉(zhuǎn)換敏感指令隊列為空,則停止替換,轉(zhuǎn)步驟3;若待轉(zhuǎn)換敏感指令隊列 不為空,從待轉(zhuǎn)換敏感指令隊列中取出最小的敏感指令地址,在基本塊內(nèi)(從基本塊起 始邊界到基本塊結(jié)束邊界之間的連續(xù)虛地址空間)尋找包含該敏感指令的替換塊,尋找
方法如下
2.3.1.1將該敏感指令自身設(shè)為當前RB;
2.3.1.2若當前RB長度不小于M字節(jié),則將當前RB設(shè)為待轉(zhuǎn)換RB,轉(zhuǎn)2.3.3;若 當前RB長度小于M字節(jié),嘗試向低地址空間擴展相鄰指令到當前RB,擴展方法如下
Al.若當前RB首地址為基本塊起始邊界,轉(zhuǎn)2. 3. 1. 3;否則向低地址空間擴展一條指 令到當前RB,方法是采用2. 2. 4中的掃描信息位元索引方法從當前RB首地址開始向低 地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對應位元的實際位置并檢査每個位 元的實際值,找到第一個低位為1的位元,將該低位為1的位元對應的虛地址(即被擴 展指令的首地址)設(shè)為當前RB起始邊界,轉(zhuǎn)B1。
Bl.若被擴展指令首地址對應位元的高位為1,表示該位元對應的地址為控制轉(zhuǎn)移指 令的目標地址,執(zhí)行C1;否則轉(zhuǎn)2.3. 1.2。
Cl.檢査待掃描入口地址隊列,若發(fā)現(xiàn)以被擴展指令首地址為索引值的節(jié)點,則采用遍歷擴展方法檢查該節(jié)點的調(diào)用者隊列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當 前RB之間的所有指令擴展到當前RB,轉(zhuǎn)2. 3. 1.2。若未發(fā)現(xiàn)以被擴展指令首地址為索引 值的節(jié)點,直接轉(zhuǎn)2.3.1.2。遍歷擴展方法為采用2.2.3.2中的目標地址有效性檢查方 法依次檢查每個調(diào)用者地址是否位于基本塊范圍之內(nèi)且位于當前RB范圍之外,是則將調(diào) 用者地址設(shè)為當前RB的邊界若調(diào)用者地址小于當前RB首地址,則將該地址設(shè)為當前 RB首地址;若調(diào)用者地址大于當前RB的結(jié)束邊界,則將調(diào)用者地址的下一條指令首地址 (即調(diào)用者地址加上該地址處的控制轉(zhuǎn)移指令長度)設(shè)為當前RB的結(jié)束邊界。否則檢査 下一個調(diào)用者地址。
2.3.1.3嘗試向高地址空間擴展相鄰指令到當前RB,擴展方法如下 A2.若當前RB結(jié)束邊界為基本塊的結(jié)束邊界,轉(zhuǎn)2. 3. 2,否則向高地址空間擴展一條 指令到當前RB,方法是采用2. 2. 4中的掃描信息位元索引方法從當前RB結(jié)束邊界開始 向高地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對應位元的實際位置并檢查每 個位元的實際值,找到第二個低位為1的位元(對應當前RB之后第一條已掃描指令的下 一條指令首地址)或第一個被設(shè)置為IO的位元(對應基本塊的結(jié)束邊界),將該位元對 應的虛地址設(shè)為當前RB結(jié)束邊界,而找到的第一個低位為1的位元對應的虛地址即被擴 展指令首地址。
B2.若被擴展指令首地址對應的位元為10,轉(zhuǎn)2.3.2;否則檢査被擴展指令首地址對 應位元的高位,若高位為l,轉(zhuǎn)C2,若高位為0,轉(zhuǎn)2. 3. 1.2。
C2.檢査待掃描入口地址隊列,若發(fā)現(xiàn)以被擴展指令首地址為索引值的節(jié)點,則采用 Cl中的遍歷擴展方法檢査該節(jié)點的調(diào)用者隊列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地 址與當前RB之間的所有指令擴展到當前RB,轉(zhuǎn)2. 3. 1. 2。若未發(fā)現(xiàn)以被擴展指令首地址 為索引值的節(jié)點,直接轉(zhuǎn)2.3.1.2。
2.3.2若當前RB長度小于M字節(jié)(表明基本塊長度小于JMP替換指令),則將敏感 指令設(shè)為待轉(zhuǎn)換RB;否則將當前RB設(shè)為待轉(zhuǎn)換RB。
2. 3. 3采用二進制翻譯中的常規(guī)方法生成與待轉(zhuǎn)換RB具有等價執(zhí)行語義的轉(zhuǎn)換代碼 塊,記為TB。
2. 3. 4若待轉(zhuǎn)換RB的長度不小于M字節(jié),則將該RB前M字節(jié)替換為JMP指令,目 標地址為2. 2. 3中生成的TB首地址,剩余字節(jié)用NOP指令填充,得到已替換RB;若待轉(zhuǎn) 換RB的長度小于M字節(jié),則將該RB的首字節(jié)替換為INT3指令,剩余字節(jié)用NOP指令填 充,得到已替換RB。
132. 3. 5在已替換RB有效信息平衡二叉樹中創(chuàng)建已替換RB的節(jié)點,該節(jié)點包括已替 換RB的首地址、長度及其與TB指令之間的地址對應關(guān)系這些有效信息。對于被替換為 INT3指令的RB (實際為敏感指令),將在該INT3指令執(zhí)行時由V麗INT3異常處理函數(shù) 根據(jù)已替換RB有效信息平衡二叉樹中記錄的信息找到并執(zhí)行其轉(zhuǎn)換代碼;對于被替換為 JMP指令的RB,則通過JMP指令直接執(zhí)行已替換RB的轉(zhuǎn)換代碼。
2.3.6遍歷待掃描敏感指令隊列,刪除所有以已替換RB中的敏感指令地址為索引值 的節(jié)點,轉(zhuǎn)2.3.1。
2.4遍歷待掃描入口地址隊列,刪除所有以已掃描入口地址為索引值的節(jié)點。
2.5若待掃描入口地址隊列為空,則結(jié)束本次動態(tài)掃描,轉(zhuǎn)步驟3;否則從待掃描入
口地址隊列中取出最大未掃描入口地址,記為基本塊起始邊界,轉(zhuǎn)2.2執(zhí)行下一次基本
塊掃描。
步驟3.從首個掃描入口地址開始執(zhí)行GOS內(nèi)核代碼,直至產(chǎn)生硬件中斷或異常,或 執(zhí)行間接控制轉(zhuǎn)移指令的轉(zhuǎn)換代碼。
步驟4.將G0S中斷或異常處理函數(shù)的入口地址或間接控制轉(zhuǎn)移指令的目標地址設(shè)為 首個掃描入口地址,轉(zhuǎn)2.1。
根據(jù)以上過程可知在對GOS執(zhí)行完第一次動態(tài)掃描之后,GOS便處于原有代碼與轉(zhuǎn) 換代碼反復、交替運行狀態(tài),并且隨著GOS的運行,在不動態(tài)加載新的GOS內(nèi)核模塊的 前提下,未經(jīng)掃描的GOS內(nèi)核代碼將會越來越少,從而動態(tài)掃描所引入的系統(tǒng)開銷也會 越來越小。
采用本發(fā)明可以達到以下技術(shù)效果
1. 采用基于替換塊的敏感指令本地替換方法,以替換塊為單位進行替換,能夠最大限 度地避免使用INT0/INT3指令進行替換(只在基本塊長度小于JMP替換指令時使用 INT3指令替換),從而有效提高BT虛擬化性能。
2. 可對任意定義的X86敏感指令進行替換,可擴展性好、適用性廣。
3. 以GOS內(nèi)核虛地址為索引動態(tài)創(chuàng)建掃描信息位圖,不僅能夠減少內(nèi)存開銷,而且能 夠有效防止錯位攻擊和基于緩沖區(qū)溢出的虛地址變化攻擊。
因此,本發(fā)明既可以滿足采用BT技術(shù)實現(xiàn)操作系統(tǒng)虛擬化的軟件支持需求,也能夠 應用于要求對目標代碼進行安全檢查或隔離的應用場景。
圖l是本發(fā)明'總體流程圖2是本發(fā)明第2. 2步中基本塊掃描流程圖3是本發(fā)明第2. 3步中敏感指令本地替換流程圖
圖4是本發(fā)明定義7中掃描信息位圖索引結(jié)構(gòu)及索引方法示意圖
具體實施方法
圖1為本發(fā)明整體流程圖
1. 創(chuàng)建并初始化全局數(shù)據(jù)結(jié)構(gòu)。
2. 從G0S內(nèi)核加載程序輸入?yún)?shù)中獲取GOS內(nèi)核起始執(zhí)行地址,記為首個掃描入口 地址,然后對首個掃描入口地址進行動態(tài)掃描
2.1.采用掃描狀態(tài)査詢方法檢査首個掃描入口地址的掃描狀態(tài)若已掃描,轉(zhuǎn)3; 若未掃描,將首個掃描入口地址記為基本塊起始邊界,轉(zhuǎn)2.2。 2. 2.對基本塊起始邊界進行基本塊掃描。
2. 3對待轉(zhuǎn)換敏感指令隊列中的敏感指令進行基于替換塊的敏感指令本地替換。
2.4遍歷待掃描入口地址隊列,刪除所有以巳掃描入口地址為索引值的節(jié)點。
2.5若待掃描入口地址隊列為空,則結(jié)束本次動態(tài)掃描,轉(zhuǎn)3;否則從待掃描入口地
址隊列中取出最大未掃描入口地址,記為基本塊起始邊界并轉(zhuǎn)2.2。
3從首個掃描入口地址開始執(zhí)行G0S內(nèi)核代碼,直至產(chǎn)生硬件中斷或異常或執(zhí)行間
接控制轉(zhuǎn)移指令的轉(zhuǎn)換代碼。
4.將G0S中斷或異常處理函數(shù)的入口地址或間接控制轉(zhuǎn)移指令的目標地址設(shè)為首個
掃描入口地址,轉(zhuǎn)2. 1。
圖2是本發(fā)明2. 2步中基本塊掃描流程圖
2.2.1初始化待轉(zhuǎn)換敏感指令隊列將待轉(zhuǎn)換敏感指令隊列頭指針設(shè)為NULL。 2.2.2將基本塊起始地址設(shè)為待掃描地址。
2.2.3對待掃描地址處指令進行譯碼,根據(jù)譯碼結(jié)果執(zhí)行以下操作 2.2.3.1若為敏感指令或間接控制轉(zhuǎn)移指令,則將該指令添加到待轉(zhuǎn)換敏感指令隊 列,轉(zhuǎn)2.2.4。
2.2.3.2若為直接控制轉(zhuǎn)移指令,則采用目標地址有效性檢査方法檢査該目標地址 是否指向已替換RB內(nèi)部若指向已替換RB內(nèi)部,則將直接控制轉(zhuǎn)移指令添加到待轉(zhuǎn)換 敏感指令隊列,然后轉(zhuǎn)2.2.4;若不指向已替換RB內(nèi)部,則檢查目標地址的掃描狀態(tài),若目標地址已掃描則轉(zhuǎn)2.2.4,否則將目標地址添加到待掃描入口地址隊列,轉(zhuǎn)2.2.4。 2. 2. 3. 3若為普通指令,轉(zhuǎn)2.2.4。
2. 2. 4根據(jù)譯碼結(jié)果記錄被掃描指令的掃描狀態(tài)首先采用掃描信息位元索引方法得 到被掃描指令首地址對應位元的實際位置,將該位元的低位設(shè)為1;然后采用掃描信息位 元索引方法依次得到被掃描指令所有剩余字節(jié)對應位元的實際位置,將這些位元設(shè)為00;
最后若被掃描指令為直接控制轉(zhuǎn)移指令,則采用掃描信息位元索引方法得到該控制轉(zhuǎn)移
指令目標地址對應的位元的實際位置,并將該位元的高位設(shè)為1。
2.2.5將被掃描指令地址加上該指令長度,得到下一條指令的首地址。
2.2.6若被掃描指令為無條件控制轉(zhuǎn)移指令或下一條指令首地址已掃描,則將下一
條指令的首地址設(shè)為基本塊的結(jié)束邊界,并將其掃描信息位元的高位設(shè)為1,然后轉(zhuǎn)2. 3;
否則轉(zhuǎn)2. 2.7。
2.2.7將下一條指令的首地址設(shè)為待掃描地址,轉(zhuǎn)2.2.3。 圖3是本發(fā)明2. 3步中基于替換塊的敏感指令本地替換流程圖 2.3.1若待轉(zhuǎn)換敏感指令隊列為空,則停止替換,轉(zhuǎn)步驟3;若待轉(zhuǎn)換敏感指令隊列 不為空,從待轉(zhuǎn)換敏感指令隊列中取出最小的敏感指令地址,在基本塊內(nèi)(從基本塊起 始邊界到基本塊結(jié)束邊界之間的連續(xù)虛地址空間)尋找包含該敏感指令的替換塊,尋找 方法如下
2.3.1.1將該敏感指令自身設(shè)為當前RB;
2.3. 1.2若當前RB長度不小于M字節(jié),則將當前RB設(shè)為待轉(zhuǎn)換RB,轉(zhuǎn)2. 3. 3;若 當前RB長度小于M字節(jié),嘗試向低地址空間擴展相鄰指令到當前RB,擴展方法如下
Al.若當前RB首地址為基本塊起始邊界,轉(zhuǎn)2. 3. 1. 3;否則向低地址空間擴展一條指 令到當前RB,方法是采用2. 2. 4中的掃描信息位元索引方法從當前RB首地址開始向低 地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對應位元的實際位置并檢査每個位 元的實際值,找到第一個低位為1的位元,將該低位為1的位元對應的虛地址(即被擴 展指令的首地址)設(shè)為當前RB起始邊界,轉(zhuǎn)B1。
Bl.若被擴展指令首地址對應位元的高位為1,表示該位元對應的地址為控制轉(zhuǎn)移指 令的目標地址,轉(zhuǎn)C1;否則轉(zhuǎn)2.3. 1.2。
Cl.檢查待掃描入口地址隊列,若發(fā)現(xiàn)以被擴展指令首地址為索引值的節(jié)點,則采用 遍歷擴展方法檢查該節(jié)點的調(diào)用者隊列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當 前RB之間的所有指令擴展到當前RB,轉(zhuǎn)2. 3. 1.2。若未發(fā)現(xiàn)以被擴展指令首地址為索引值的節(jié)點,直接轉(zhuǎn)2.3.1.2。
2.3.1.3嘗試向高地址空間擴展相鄰指令到當前RB,擴展方法如下 A2.若當前RB結(jié)束邊界為基本塊的結(jié)束邊界,轉(zhuǎn)2. 3.2,否則向高地址空間擴展一條 指令到當前RB,方法是采用2. 2. 4中的掃描信息位元索引方法從當前RB結(jié)束邊界開始 向高地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對應位元的實際位置并檢查每 個位元的實際值,找到第二個低位為1的位元(對應當前RB之后第一條已掃描指令的下 一條指令首地址)或第一個被設(shè)置為IO的位元(對應基本塊的結(jié)束邊界),將該位元對 應的虛地址設(shè)為當前RB結(jié)束邊界,而找到的第一個低位為1的位元對應的虛地址即被擴 展指令首地址。
B2.若被擴展指令首地址對應的位元為10,轉(zhuǎn)2.3.2;否則檢査被擴展指令首地址對 應位元的高位,若高位為l,轉(zhuǎn)C2,若高位為0,轉(zhuǎn)2. 3. 1.2。
C2.檢查待掃描入口地址隊列,若發(fā)現(xiàn)以被擴展指令首地址為索引值的節(jié)點,則釆用 遍歷擴展方法檢査該節(jié)點的調(diào)用者隊列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當 前RB之間的所有指令擴展到當前RB,轉(zhuǎn)2.3. 1.2。若未發(fā)現(xiàn)以被擴展指令首地址為索引 值的節(jié)點,直接轉(zhuǎn)2.3.1.2。
2.3.2若當前RB長度小于M字節(jié)(表明基本塊長度小于JMP替換指令),則將敏感 指令設(shè)為待轉(zhuǎn)換RB;否則將當前RB設(shè)為待轉(zhuǎn)換RB。
2. 3. 3采用二進制翻譯中的常規(guī)方法生成與待轉(zhuǎn)換RB具有等價執(zhí)行語義的轉(zhuǎn)換代碼 塊,記為TB。
2. 3. 4若待轉(zhuǎn)換RB的長度不小于M字節(jié),則將該RB前M字節(jié)替換為JMP指令,目 標地址為2.2.3中生成的TB首地址,剩余字節(jié)用NOP指令填充,得到已替換RB;若待轉(zhuǎn) 換RB的長度小于M字節(jié),則將該RB的首字節(jié)替換為INT3指令,剩余字節(jié)用NOP指令填 充,得到已替換RB。
2.3.5在已替換RB有效信息平衡二叉樹中創(chuàng)建已替換RB的節(jié)點,該節(jié)點包括己替 換RB的首地址、長度及其與TB指令之間的地址對應關(guān)系這些有效信息。對于被替換為 INT3指令的RB (實際為敏感指令),將在該INT3指令執(zhí)行時由VMMINT3異常處理函數(shù) 根據(jù)已替換RB有效信息平衡二叉樹中記錄的信息找到并執(zhí)行其轉(zhuǎn)換代碼;對于被替換為 JMP指令的RB,則通過JMP指令直接執(zhí)行已替換RB的轉(zhuǎn)換代碼。
2.3.6遍歷待掃描敏感指令隊列,刪除所有以已替換RB中的敏感指令地址為索引值 的節(jié)點,轉(zhuǎn)2.3. 1。圖4是本發(fā)明定義7中掃描信息位圖及其索引方法示意圖
以X86-32位體系結(jié)構(gòu)為例32位內(nèi)核虛地址共劃分為頁目錄索引、頁表索引和頁內(nèi) 偏移三個位段。其中最高8位為頁目錄索引,對應256個表項;中間IO位為頁表索引, 對應1024個表項;最低14位則為內(nèi)核虛地址對應位元在掃描信息位圖頁中的偏移量(以 二個比特位為單位計算)。指定G0S內(nèi)核虛地址va對應的掃描信息位元索引與獲取方法 如下
1) 取va的高8位(即頁目錄索引),左移2位后加上頁目錄頁首地址,得到va對應的 頁目錄項的首地址,從頁目錄項中取出頁表頁的首地址;
2) 取va的中間10位(即頁表索引),左移2位后加上頁表頁的首地址,得到va對應 的頁表項的首地址,從頁表項中取出位圖頁的首地址;
3) 取va的低14位,右移2位后加上位圖頁的首地址,得到va對應的掃描信息位元所 在的內(nèi)存單元地址(位于掃描信息位圖頁中),記為pScanByte;
4) 將va的低14位與0x3進行位與運算,得到va對應的掃描信息位元在pScanByted 中的偏移量,記為offset;
5) 按下列公式計算得到va對應的掃描信息位元的實際值,記為ScanBit:
ScanBit = (pScanByte & ( 0x3 〈〈 (offset << l)))》(offset 〈〈 1) 公式中的"〈〈"為左移運算符,"》"為右移運算符,表示將16進制無符號整數(shù)左 移或右移指定的位數(shù);"&"為位與運算符。
18
權(quán)利要求
1.一種基于塊對目標代碼掃描并替換敏感指令的方法,其特征在于包括以下步驟步驟1.創(chuàng)建并初始化全局數(shù)據(jù)結(jié)構(gòu)1.1創(chuàng)建并初始化掃描信息位圖頁目錄頁分配一個數(shù)據(jù)頁作為掃描信息位圖索引結(jié)構(gòu)中的頁目錄頁,并將頁目錄頁中的頁目錄項全部初始化為0;掃描信息位圖是指以位圖形式實現(xiàn)的、用于保存GOS內(nèi)核虛地址掃描狀態(tài)及相關(guān)信息的數(shù)據(jù)結(jié)構(gòu);在掃描信息位圖中,每條GOS虛地址的掃描信息由與該地址一一對應的掃描信息位元-簡稱位元描述,每個掃描信息位元由二個比特位組成00表示該位元對應的虛地址未掃描或非指令首地址;01表示該位元對應的虛地址已掃描;10表示該位元對應的虛地址未掃描或非指令首地址且為基本塊邊界或控制轉(zhuǎn)移指令目標地址;11表示該位元對應的虛地址已掃描且為基本塊邊界地址或控制轉(zhuǎn)移指令目標地址;基本塊是指以GOS起始執(zhí)行地址、GOS中斷處理函數(shù)首地址或控制轉(zhuǎn)移指令目標地址為起始邊界,以無條件控制轉(zhuǎn)移指令或已掃描地址為結(jié)束邊界的連續(xù)目標指令序列;掃描信息位圖索引結(jié)構(gòu)由掃描信息位圖頁目錄頁--簡稱頁目錄頁、掃描信息位圖頁表頁--簡稱頁表頁和掃描信息位圖頁--簡稱位圖頁組成,GOS內(nèi)核虛地址劃分為頁目錄索引、頁表索引和頁內(nèi)偏移三個位段,頁目錄索引存放頁表頁的首地址,頁表索引存放位圖頁的首地址,頁內(nèi)偏移存放內(nèi)核虛地址對應的掃描信息位元在位圖頁中的偏移量;1.2初始化待掃描入口地址隊列及已替換RB有效信息平衡二叉樹將待掃描入口地址隊列及已替換RB有效信息平衡二叉樹的頭指針設(shè)為NULL;待掃描入口地址隊列是指以線性鏈表形式實現(xiàn)的、保存動態(tài)掃描時發(fā)現(xiàn)的控制轉(zhuǎn)移指令目標地址及其調(diào)用地址的數(shù)據(jù)結(jié)構(gòu),待掃描入口地址隊列節(jié)點以目標地址為索引值,按地址大小按序排列;已替換RB有效信息平衡二叉樹是指以平衡二叉樹AVL形式實現(xiàn)的、保存被替換RB相關(guān)信息的數(shù)據(jù)結(jié)構(gòu),樹中節(jié)點以被替換RB首地址為索引值,其它信息包括被替換RB的長度及其與對應TB中每條指令地址的對應關(guān)系;RB是替換塊,指滿足以下條件的最短連續(xù)目標指令序列位于基本塊內(nèi)部,包括基本塊自身;包含指定敏感指令且長度不小于JMP指令長度;不含所屬基本塊范圍之內(nèi)、本替換塊范圍之外任何控制轉(zhuǎn)移指令的目標地址,本替換塊首地址除外;TB是轉(zhuǎn)換塊,指替換塊被替換之后,經(jīng)由替換指令執(zhí)行、包含虛擬化代碼或安全檢查代碼且與原替換塊具有等價執(zhí)行語義的一組指令序列;1.3令全局變量M=JMP替換指令長度;步驟2.從GOS內(nèi)核加載程序輸入?yún)?shù)中獲取GOS內(nèi)核起始執(zhí)行地址,記為首個掃描入口地址,然后對首個掃描入口地址進行動態(tài)掃描2.1.采用掃描狀態(tài)查詢方法檢查首個掃描入口地址的掃描狀態(tài)若已掃描,轉(zhuǎn)步驟3;若未掃描,將首個掃描入口地址記為基本塊起始邊界,轉(zhuǎn)2.2;2.2.對基本塊起始邊界進行基本塊掃描,方法是2.2.1初始化待轉(zhuǎn)換敏感指令隊列將待轉(zhuǎn)換敏感指令隊列頭指針設(shè)為NULL;待轉(zhuǎn)換敏感指令隊列是指以線性鏈表形式實現(xiàn)的、保存基本塊掃描時發(fā)現(xiàn)的敏感指令地址及其相關(guān)信息的數(shù)據(jù)結(jié)構(gòu),待轉(zhuǎn)換敏感指令隊列節(jié)點以敏感指令地址為索引值,按地址大小按序排列;2.2.2將基本塊起始地址設(shè)為待掃描地址;2.2.3對待掃描地址處指令進行譯碼,根據(jù)譯碼結(jié)果執(zhí)行以下操作2.2.3.1若為敏感指令或間接控制轉(zhuǎn)移指令,則將該指令添加到待轉(zhuǎn)換敏感指令隊列,轉(zhuǎn)2.2.4;2.2.3.2若為直接控制轉(zhuǎn)移指令,則首先采用目標地址有效性檢查方法檢查該目標地址是否指向已替換RB內(nèi)部若指向已替換RB內(nèi)部,則將直接控制轉(zhuǎn)移指令添加到待轉(zhuǎn)換敏感指令隊列,然后轉(zhuǎn)2.2.4;若不指向已替換RB內(nèi)部,則采用掃描狀態(tài)查詢方法檢查目標地址的掃描狀態(tài),若目標地址已掃描則轉(zhuǎn)2.2.4,否則將目標地址添加到待掃描入口地址隊列,轉(zhuǎn)2.2.4;2.2.3.3若為普通指令,則轉(zhuǎn)2.2.4;2.2.4根據(jù)譯碼結(jié)果記錄被掃描指令的掃描狀態(tài),方法為首先采用掃描信息位元索引方法得到被掃描指令首地址對應位元的實際位置,將該位元的低位設(shè)為1;然后采用掃描信息位元索引方法依次得到被掃描指令所有剩余字節(jié)對應位元的實際位置,將這些位元設(shè)為00;最后若被掃描指令為直接控制轉(zhuǎn)移指令,則采用掃描信息位元索引方法得到該控制轉(zhuǎn)移指令目標地址對應的位元的實際位置,并將該位元的高位設(shè)為1;2.2.5將被掃描指令地址加上該指令長度,得到下一條指令的首地址;2.2.6若被掃描指令為無條件控制轉(zhuǎn)移指令或下一條指令首地址已掃描,則將下一條指令首地址設(shè)為基本塊的結(jié)束邊界,并將其掃描信息位元的高位設(shè)為1,表示該地址為基本塊邊界地址或控制轉(zhuǎn)移指令目標地址,然后結(jié)束本次基本塊掃描并轉(zhuǎn)2.3;否則轉(zhuǎn)2.2.7;2.2.7將下一條指令首地址設(shè)為待掃描地址,轉(zhuǎn)2.2.3,繼續(xù)進行基本塊掃描;2.3對待轉(zhuǎn)換敏感指令隊列中的敏感指令進行基于替換塊的敏感指令本地替換2.3.1若待轉(zhuǎn)換敏感指令隊列為空,則停止替換,轉(zhuǎn)步驟3;若待轉(zhuǎn)換敏感指令隊列不為空,從待轉(zhuǎn)換敏感指令隊列中取出最小的敏感指令地址,在基本塊內(nèi)尋找包含該敏感指令的替換塊,尋找方法如下2.3.1.1將該敏感指令自身設(shè)為當前RB;2.3.1.2若當前RB長度不小于M字節(jié),則將當前RB設(shè)為待轉(zhuǎn)換RB,轉(zhuǎn)2.3.3;若當前RB長度小于M字節(jié),嘗試向低地址空間擴展相鄰指令到當前RB,擴展方法如下A1.若當前RB首地址為基本塊起始邊界,轉(zhuǎn)2.3.1.3;否則向低地址空間擴展一條指令到當前RB,轉(zhuǎn)B1;B1.若該低位為1的位元的高位為1,執(zhí)行C1,否則轉(zhuǎn)2.3.1.2;C1.檢查待掃描入口地址隊列,若發(fā)現(xiàn)以低位為1位元對應的虛地址為索引值的節(jié)點,則采用遍歷擴展方法檢查該節(jié)點的調(diào)用者隊列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當前RB之間的所有指令擴展到當前RB,轉(zhuǎn)2.3.1.2;若未發(fā)現(xiàn)以低位為1位元對應的虛地址為索引值的節(jié)點,則轉(zhuǎn)2.3.1.2;調(diào)用者隊列是指以線性鏈表形式實現(xiàn)的、保存具有相同目標地址的控制轉(zhuǎn)移指令地址的數(shù)據(jù)結(jié)構(gòu),調(diào)用者地址隊列節(jié)點以控制轉(zhuǎn)移指令地址為索引值,包含在待掃描入口地址隊列的每個節(jié)點之中;2.3.1.3嘗試向高地址空間擴展相鄰指令到當前RB,擴展方法如下A2.若當前RB結(jié)束邊界為基本塊的結(jié)束邊界,轉(zhuǎn)2.3.2,否則向高地址空間擴展一條基本塊指令到當前RB;B2.若被擴展指令首地址對應的位元為10,轉(zhuǎn)2.3.2;否則檢查被擴展指令首地址對應位元的高位,若高位為1,轉(zhuǎn)C2,若高位為0,轉(zhuǎn)2.3.1.2;C2.檢查待掃描入口地址隊列,若發(fā)現(xiàn)以被擴展指令首地址為索引值的節(jié)點,則采用遍歷擴展方法檢查該節(jié)點的調(diào)用者隊列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當前RB之間的所有指令擴展到當前RB,轉(zhuǎn)2.3.1.2,若未發(fā)現(xiàn)以被擴展指令首地址為索引值的節(jié)點,直接轉(zhuǎn)2.3.1.2;2.3.2若當前RB長度小于M字節(jié),則將敏感指令設(shè)為待轉(zhuǎn)換RB;否則將當前RB設(shè)為待轉(zhuǎn)換RB;2.3.3采用二進制翻譯中的常規(guī)方法生成與待轉(zhuǎn)換RB具有等價執(zhí)行語義的轉(zhuǎn)換代碼塊,記為TB;2.3.4若待轉(zhuǎn)換RB的長度不小于M字節(jié),則將該RB前M字節(jié)替換為JMP指令,目標地址為TB首地址,剩余字節(jié)用NOP指令填充,得到已替換RB;若待轉(zhuǎn)換RB的長度小于M字節(jié),則將該RB的首字節(jié)替換為INT3指令,剩余字節(jié)用NOP指令填充,得到已替換RB;2.3.5在已替換RB有效信息平衡二叉樹中創(chuàng)建已替換RB的節(jié)點,該節(jié)點包括已替換RB的首地址、長度及其與TB指令之間的地址對應關(guān)系這些有效信息;2.3.6遍歷待掃描敏感指令隊列,刪除所有以已替換RB中的敏感指令地址為索引值的節(jié)點,轉(zhuǎn)2.3.1;2.4遍歷待掃描入口地址隊列,刪除所有以已掃描入口地址為索引值的節(jié)點;2.5若待掃描入口地址隊列為空,則結(jié)束本次動態(tài)掃描,轉(zhuǎn)步驟3;否則從待掃描入口地址隊列中取出最大未掃描入口地址,記為基本塊起始邊界,轉(zhuǎn)2.2執(zhí)行下一次基本塊掃描;步驟3從首個掃描入口地址開始執(zhí)行GOS內(nèi)核代碼,直至產(chǎn)生硬件中斷或異常或執(zhí)行間接控制轉(zhuǎn)移指令的轉(zhuǎn)換代碼;步驟4.將GOS中斷或異常處理函數(shù)的入口地址或間接控制轉(zhuǎn)移指令的目標地址設(shè)為首個掃描入口地址,轉(zhuǎn)2.1。
2. 如權(quán)利要求l所述的基于塊對目標代碼掃描并替換敏感指令的方法,其特征在于 所述掃描狀態(tài)查詢方法是首先將被查詢地址劃分為頁目錄索引、頁表索引和頁內(nèi)偏移 三個位段;然后檢查頁目錄索引指向的頁目錄項,若頁目錄項為0,則返回-1表示該地 址未掃描且該地址對應位元不存在;若頁目錄項不為0,則繼續(xù)檢査頁表索引指向的頁表 項,若頁表項為0,則返回-1表示該地址未掃描且該地址對應位元不存在,若頁表項不 為O,則根據(jù)頁表項中的掃描信息位圖頁首地址和頁內(nèi)偏移計算得到被查詢地址對應位元 的實際位置并返回位元的實際值;最后根據(jù)位元的實際值確定被掃描指令的首地址的掃 描狀態(tài)位元的實際值低位為l表示已掃描,為0表示未掃描。
3. 如權(quán)利要求l所述的基于塊對目標代碼掃描并替換敏感指令的方法,其特征在于 所述目標地址有效性檢査方法為采用平衡二叉樹遍歷方法遍歷己替換RB有效信息平衡 二叉樹,找到索引值小于指定目標地址且與指定目標地址最接近的節(jié)點,若指定目標地 址小于或等于已替換RB的首地址加上節(jié)點中記錄的已替換RB長度,則表明指定目標地 址指向已替換RB內(nèi)部,否則不指向已替換RB內(nèi)部。
4. 如權(quán)利要求l所述的基于塊對目標代碼掃描并替換敏感指令的方法,其特征在于 所述掃描信息位元索引方法為首先將被索引地址劃分為頁目錄索引、頁表索引和頁內(nèi)偏移三個位段;然后檢查頁目錄索引指向的頁目錄項是否為O,是則立即分配一個數(shù)據(jù)頁 作為掃描信息位圖頁表頁并將該頁表頁的首地址寫入頁目錄頁中對應的頁目錄項中;接著檢査頁表索引指向的頁表項是否為O,是則立即分配一個數(shù)據(jù)頁作為掃描信息位圖頁并 將該位圖頁的首地址寫入頁表頁中對應的頁表項中;最后根據(jù)掃描信息位圖頁首地址和 頁內(nèi)偏移得到被索引地址對應位元的實際位置。
5. 如權(quán)利要求l所述的基于塊對目標代碼掃描并替換敏感指令的方法,其特征在于 所述向低地址空間擴展一條基本塊指令到當前RB的方法是采用掃描信息位元索引方法 從當前RB首地址開始向低地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對應位元的實際位置并檢查每個位元的實際值,找到第一個低位為1的位元,將該低位為1的位元對應的虛地址即被擴展指令的首地址設(shè)為當前RB起始邊界。
6. 如權(quán)利要求l所述的基于塊對目標代碼掃描并替換敏感指令的方法,其特征在于所述遍歷擴展方法為采用目標地址有效性檢查方法依次檢査每個調(diào)用者地址是否位于基本塊范圍之內(nèi)且位于當前RB范圍之外,是則將調(diào)用者地址設(shè)為當前RB的邊界,即若 調(diào)用者地址小于當前RB首地址,則將該地址設(shè)為當前RB首地址;若調(diào)用者地址大于當 前RB的結(jié)束邊界,則將該地址設(shè)為當前RB的結(jié)束邊界,否則檢查下一個調(diào)用者地址。
7. 如權(quán)利要求l所述的基于塊對目標代碼掃描并替換敏感指令的方法,其特征在于 所述向高地址空間擴展一條基本塊指令到當前RB的方法是采用掃描信息位元索引方法 從當前RB結(jié)束邊界開始向高地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對應位 元的實際位置并檢査每個位元的實際值,找到第二個低位為1的位元或第一個被設(shè)置為 10的位元,將該位元對應的虛地址設(shè)為當前RB結(jié)束邊界,而找到的第一個低位為1的位 元對應的虛地址即被擴展指令首地址。
全文摘要
本發(fā)明公開了一種基于塊對目標代碼掃描并替換敏感指令的方法,目的是提供一種當敏感指令長度小于JMP時,尋找包含該敏感指令且長度不小于JMP的最小目標代碼塊,并用JMP替換該最小目標代碼塊的方法。技術(shù)方案是對首個掃描入口地址進行動態(tài)掃描,主要包括對基本塊起始邊界進行基本塊掃描,對待轉(zhuǎn)換敏感指令隊列中的敏感指令進行基于替換塊的敏感指令本地替換;然后從首個掃描入口地址開始執(zhí)行GOS內(nèi)核代碼,直至產(chǎn)生硬件中斷或異?;驁?zhí)行間接控制轉(zhuǎn)移指令的轉(zhuǎn)換代碼;將GOS中斷或異常處理函數(shù)的入口地址或間接控制轉(zhuǎn)移指令的目標地址設(shè)為首個掃描入口地址,然后循環(huán)執(zhí)行動態(tài)掃描。采用本發(fā)明能夠最大限度地避免使用INT0/INT3指令進行替換,有效提高BT虛擬化性能。
文檔編號G06F9/455GK101630269SQ20091004383
公開日2010年1月20日 申請日期2009年7月3日 優(yōu)先權(quán)日2009年7月3日
發(fā)明者劉曉建, 吳慶波, 孔金珠, 張衛(wèi)華, 戴華東, 易曉東, 譚郁松 申請人:中國人民解放軍國防科學技術(shù)大學