国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法

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


      圖l是本發(fā)明'總體流程圖2是本發(fā)明第2. 2步中基本塊掃描流程圖3是本發(fā)明第2. 3步中敏感指令本地替換流程圖
      圖4是本發(fā)明定義7中掃描信息位圖索引結(jié)構(gòu)及索引方法示意圖
      具體實(shí)施方法
      圖1為本發(fā)明整體流程圖
      1. 創(chuàng)建并初始化全局?jǐn)?shù)據(jù)結(jié)構(gòu)。
      2. 從G0S內(nèi)核加載程序輸入?yún)?shù)中獲取GOS內(nèi)核起始執(zhí)行地址,記為首個(gè)掃描入口 地址,然后對(duì)首個(gè)掃描入口地址進(jìn)行動(dòng)態(tài)掃描
      2.1.采用掃描狀態(tài)査詢方法檢査首個(gè)掃描入口地址的掃描狀態(tài)若已掃描,轉(zhuǎn)3; 若未掃描,將首個(gè)掃描入口地址記為基本塊起始邊界,轉(zhuǎn)2.2。 2. 2.對(duì)基本塊起始邊界進(jìn)行基本塊掃描。
      2. 3對(duì)待轉(zhuǎn)換敏感指令隊(duì)列中的敏感指令進(jìn)行基于替換塊的敏感指令本地替換。
      2.4遍歷待掃描入口地址隊(duì)列,刪除所有以巳掃描入口地址為索引值的節(jié)點(diǎn)。
      2.5若待掃描入口地址隊(duì)列為空,則結(jié)束本次動(dòng)態(tài)掃描,轉(zhuǎn)3;否則從待掃描入口地
      址隊(duì)列中取出最大未掃描入口地址,記為基本塊起始邊界并轉(zhuǎn)2.2。
      3從首個(gè)掃描入口地址開(kāi)始執(zhí)行G0S內(nèi)核代碼,直至產(chǎn)生硬件中斷或異常或執(zhí)行間
      接控制轉(zhuǎn)移指令的轉(zhuǎn)換代碼。
      4.將G0S中斷或異常處理函數(shù)的入口地址或間接控制轉(zhuǎn)移指令的目標(biāo)地址設(shè)為首個(gè)
      掃描入口地址,轉(zhuǎn)2. 1。
      圖2是本發(fā)明2. 2步中基本塊掃描流程圖
      2.2.1初始化待轉(zhuǎn)換敏感指令隊(duì)列將待轉(zhuǎn)換敏感指令隊(duì)列頭指針設(shè)為NULL。 2.2.2將基本塊起始地址設(shè)為待掃描地址。
      2.2.3對(duì)待掃描地址處指令進(jìn)行譯碼,根據(jù)譯碼結(jié)果執(zhí)行以下操作 2.2.3.1若為敏感指令或間接控制轉(zhuǎn)移指令,則將該指令添加到待轉(zhuǎn)換敏感指令隊(duì) 列,轉(zhuǎn)2.2.4。
      2.2.3.2若為直接控制轉(zhuǎn)移指令,則采用目標(biāo)地址有效性檢査方法檢査該目標(biāo)地址 是否指向已替換RB內(nèi)部若指向已替換RB內(nèi)部,則將直接控制轉(zhuǎn)移指令添加到待轉(zhuǎn)換 敏感指令隊(duì)列,然后轉(zhuǎn)2.2.4;若不指向已替換RB內(nèi)部,則檢查目標(biāo)地址的掃描狀態(tài),若目標(biāo)地址已掃描則轉(zhuǎn)2.2.4,否則將目標(biāo)地址添加到待掃描入口地址隊(duì)列,轉(zhuǎn)2.2.4。 2. 2. 3. 3若為普通指令,轉(zhuǎn)2.2.4。
      2. 2. 4根據(jù)譯碼結(jié)果記錄被掃描指令的掃描狀態(tài)首先采用掃描信息位元索引方法得 到被掃描指令首地址對(duì)應(yīng)位元的實(shí)際位置,將該位元的低位設(shè)為1;然后采用掃描信息位 元索引方法依次得到被掃描指令所有剩余字節(jié)對(duì)應(yīng)位元的實(shí)際位置,將這些位元設(shè)為00;
      最后若被掃描指令為直接控制轉(zhuǎn)移指令,則采用掃描信息位元索引方法得到該控制轉(zhuǎn)移
      指令目標(biāo)地址對(duì)應(yīng)的位元的實(shí)際位置,并將該位元的高位設(shè)為1。
      2.2.5將被掃描指令地址加上該指令長(zhǎng)度,得到下一條指令的首地址。
      2.2.6若被掃描指令為無(wú)條件控制轉(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)換敏感指令隊(duì)列為空,則停止替換,轉(zhuǎn)步驟3;若待轉(zhuǎn)換敏感指令隊(duì)列 不為空,從待轉(zhuǎn)換敏感指令隊(duì)列中取出最小的敏感指令地址,在基本塊內(nèi)(從基本塊起 始邊界到基本塊結(jié)束邊界之間的連續(xù)虛地址空間)尋找包含該敏感指令的替換塊,尋找 方法如下
      2.3.1.1將該敏感指令自身設(shè)為當(dāng)前RB;
      2.3. 1.2若當(dāng)前RB長(zhǎng)度不小于M字節(jié),則將當(dāng)前RB設(shè)為待轉(zhuǎn)換RB,轉(zhuǎn)2. 3. 3;若 當(dāng)前RB長(zhǎng)度小于M字節(jié),嘗試向低地址空間擴(kuò)展相鄰指令到當(dāng)前RB,擴(kuò)展方法如下
      Al.若當(dāng)前RB首地址為基本塊起始邊界,轉(zhuǎn)2. 3. 1. 3;否則向低地址空間擴(kuò)展一條指 令到當(dāng)前RB,方法是采用2. 2. 4中的掃描信息位元索引方法從當(dāng)前RB首地址開(kāi)始向低 地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對(duì)應(yīng)位元的實(shí)際位置并檢査每個(gè)位 元的實(shí)際值,找到第一個(gè)低位為1的位元,將該低位為1的位元對(duì)應(yīng)的虛地址(即被擴(kuò) 展指令的首地址)設(shè)為當(dāng)前RB起始邊界,轉(zhuǎn)B1。
      Bl.若被擴(kuò)展指令首地址對(duì)應(yīng)位元的高位為1,表示該位元對(duì)應(yīng)的地址為控制轉(zhuǎn)移指 令的目標(biāo)地址,轉(zhuǎn)C1;否則轉(zhuǎn)2.3. 1.2。
      Cl.檢查待掃描入口地址隊(duì)列,若發(fā)現(xiàn)以被擴(kuò)展指令首地址為索引值的節(jié)點(diǎn),則采用 遍歷擴(kuò)展方法檢查該節(jié)點(diǎn)的調(diào)用者隊(duì)列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當(dāng) 前RB之間的所有指令擴(kuò)展到當(dāng)前RB,轉(zhuǎn)2. 3. 1.2。若未發(fā)現(xiàn)以被擴(kuò)展指令首地址為索引值的節(jié)點(diǎn),直接轉(zhuǎn)2.3.1.2。
      2.3.1.3嘗試向高地址空間擴(kuò)展相鄰指令到當(dāng)前RB,擴(kuò)展方法如下 A2.若當(dāng)前RB結(jié)束邊界為基本塊的結(jié)束邊界,轉(zhuǎn)2. 3.2,否則向高地址空間擴(kuò)展一條 指令到當(dāng)前RB,方法是采用2. 2. 4中的掃描信息位元索引方法從當(dāng)前RB結(jié)束邊界開(kāi)始 向高地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對(duì)應(yīng)位元的實(shí)際位置并檢查每 個(gè)位元的實(shí)際值,找到第二個(gè)低位為1的位元(對(duì)應(yīng)當(dāng)前RB之后第一條已掃描指令的下 一條指令首地址)或第一個(gè)被設(shè)置為IO的位元(對(duì)應(yīng)基本塊的結(jié)束邊界),將該位元對(duì) 應(yīng)的虛地址設(shè)為當(dāng)前RB結(jié)束邊界,而找到的第一個(gè)低位為1的位元對(duì)應(yīng)的虛地址即被擴(kuò) 展指令首地址。
      B2.若被擴(kuò)展指令首地址對(duì)應(yīng)的位元為10,轉(zhuǎn)2.3.2;否則檢査被擴(kuò)展指令首地址對(duì) 應(yīng)位元的高位,若高位為l,轉(zhuǎn)C2,若高位為0,轉(zhuǎn)2. 3. 1.2。
      C2.檢查待掃描入口地址隊(duì)列,若發(fā)現(xiàn)以被擴(kuò)展指令首地址為索引值的節(jié)點(diǎn),則釆用 遍歷擴(kuò)展方法檢査該節(jié)點(diǎn)的調(diào)用者隊(duì)列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當(dāng) 前RB之間的所有指令擴(kuò)展到當(dāng)前RB,轉(zhuǎn)2.3. 1.2。若未發(fā)現(xiàn)以被擴(kuò)展指令首地址為索引 值的節(jié)點(diǎn),直接轉(zhuǎn)2.3.1.2。
      2.3.2若當(dāng)前RB長(zhǎng)度小于M字節(jié)(表明基本塊長(zhǎng)度小于JMP替換指令),則將敏感 指令設(shè)為待轉(zhuǎn)換RB;否則將當(dāng)前RB設(shè)為待轉(zhuǎn)換RB。
      2. 3. 3采用二進(jìn)制翻譯中的常規(guī)方法生成與待轉(zhuǎn)換RB具有等價(jià)執(zhí)行語(yǔ)義的轉(zhuǎn)換代碼 塊,記為TB。
      2. 3. 4若待轉(zhuǎn)換RB的長(zhǎng)度不小于M字節(jié),則將該RB前M字節(jié)替換為JMP指令,目 標(biāo)地址為2.2.3中生成的TB首地址,剩余字節(jié)用NOP指令填充,得到已替換RB;若待轉(zhuǎn) 換RB的長(zhǎng)度小于M字節(jié),則將該RB的首字節(jié)替換為INT3指令,剩余字節(jié)用NOP指令填 充,得到已替換RB。
      2.3.5在已替換RB有效信息平衡二叉樹(shù)中創(chuàng)建已替換RB的節(jié)點(diǎn),該節(jié)點(diǎn)包括己替 換RB的首地址、長(zhǎng)度及其與TB指令之間的地址對(duì)應(yīng)關(guān)系這些有效信息。對(duì)于被替換為 INT3指令的RB (實(shí)際為敏感指令),將在該INT3指令執(zhí)行時(shí)由VMMINT3異常處理函數(shù) 根據(jù)已替換RB有效信息平衡二叉樹(shù)中記錄的信息找到并執(zhí)行其轉(zhuǎn)換代碼;對(duì)于被替換為 JMP指令的RB,則通過(guò)JMP指令直接執(zhí)行已替換RB的轉(zhuǎn)換代碼。
      2.3.6遍歷待掃描敏感指令隊(duì)列,刪除所有以已替換RB中的敏感指令地址為索引值 的節(jié)點(diǎn),轉(zhuǎn)2.3. 1。圖4是本發(fā)明定義7中掃描信息位圖及其索引方法示意圖
      以X86-32位體系結(jié)構(gòu)為例32位內(nèi)核虛地址共劃分為頁(yè)目錄索引、頁(yè)表索引和頁(yè)內(nèi) 偏移三個(gè)位段。其中最高8位為頁(yè)目錄索引,對(duì)應(yīng)256個(gè)表項(xiàng);中間IO位為頁(yè)表索引, 對(duì)應(yīng)1024個(gè)表項(xiàng);最低14位則為內(nèi)核虛地址對(duì)應(yīng)位元在掃描信息位圖頁(yè)中的偏移量(以 二個(gè)比特位為單位計(jì)算)。指定G0S內(nèi)核虛地址va對(duì)應(yīng)的掃描信息位元索引與獲取方法 如下
      1) 取va的高8位(即頁(yè)目錄索引),左移2位后加上頁(yè)目錄頁(yè)首地址,得到va對(duì)應(yīng)的 頁(yè)目錄項(xiàng)的首地址,從頁(yè)目錄項(xiàng)中取出頁(yè)表頁(yè)的首地址;
      2) 取va的中間10位(即頁(yè)表索引),左移2位后加上頁(yè)表頁(yè)的首地址,得到va對(duì)應(yīng) 的頁(yè)表項(xiàng)的首地址,從頁(yè)表項(xiàng)中取出位圖頁(yè)的首地址;
      3) 取va的低14位,右移2位后加上位圖頁(yè)的首地址,得到va對(duì)應(yīng)的掃描信息位元所 在的內(nèi)存單元地址(位于掃描信息位圖頁(yè)中),記為pScanByte;
      4) 將va的低14位與0x3進(jìn)行位與運(yùn)算,得到va對(duì)應(yīng)的掃描信息位元在pScanByted 中的偏移量,記為offset;
      5) 按下列公式計(jì)算得到va對(duì)應(yīng)的掃描信息位元的實(shí)際值,記為ScanBit:
      ScanBit = (pScanByte & ( 0x3 〈〈 (offset << l)))》(offset 〈〈 1) 公式中的"〈〈"為左移運(yùn)算符,"》"為右移運(yùn)算符,表示將16進(jìn)制無(wú)符號(hào)整數(shù)左 移或右移指定的位數(shù);"&"為位與運(yùn)算符。
      18
      權(quán)利要求
      1.一種基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法,其特征在于包括以下步驟步驟1.創(chuàng)建并初始化全局?jǐn)?shù)據(jù)結(jié)構(gòu)1.1創(chuàng)建并初始化掃描信息位圖頁(yè)目錄頁(yè)分配一個(gè)數(shù)據(jù)頁(yè)作為掃描信息位圖索引結(jié)構(gòu)中的頁(yè)目錄頁(yè),并將頁(yè)目錄頁(yè)中的頁(yè)目錄項(xiàng)全部初始化為0;掃描信息位圖是指以位圖形式實(shí)現(xiàn)的、用于保存GOS內(nèi)核虛地址掃描狀態(tài)及相關(guān)信息的數(shù)據(jù)結(jié)構(gòu);在掃描信息位圖中,每條GOS虛地址的掃描信息由與該地址一一對(duì)應(yīng)的掃描信息位元-簡(jiǎn)稱位元描述,每個(gè)掃描信息位元由二個(gè)比特位組成00表示該位元對(duì)應(yīng)的虛地址未掃描或非指令首地址;01表示該位元對(duì)應(yīng)的虛地址已掃描;10表示該位元對(duì)應(yīng)的虛地址未掃描或非指令首地址且為基本塊邊界或控制轉(zhuǎn)移指令目標(biāo)地址;11表示該位元對(duì)應(yīng)的虛地址已掃描且為基本塊邊界地址或控制轉(zhuǎn)移指令目標(biāo)地址;基本塊是指以GOS起始執(zhí)行地址、GOS中斷處理函數(shù)首地址或控制轉(zhuǎn)移指令目標(biāo)地址為起始邊界,以無(wú)條件控制轉(zhuǎn)移指令或已掃描地址為結(jié)束邊界的連續(xù)目標(biāo)指令序列;掃描信息位圖索引結(jié)構(gòu)由掃描信息位圖頁(yè)目錄頁(yè)--簡(jiǎn)稱頁(yè)目錄頁(yè)、掃描信息位圖頁(yè)表頁(yè)--簡(jiǎn)稱頁(yè)表頁(yè)和掃描信息位圖頁(yè)--簡(jiǎn)稱位圖頁(yè)組成,GOS內(nèi)核虛地址劃分為頁(yè)目錄索引、頁(yè)表索引和頁(yè)內(nèi)偏移三個(gè)位段,頁(yè)目錄索引存放頁(yè)表頁(yè)的首地址,頁(yè)表索引存放位圖頁(yè)的首地址,頁(yè)內(nèi)偏移存放內(nèi)核虛地址對(duì)應(yīng)的掃描信息位元在位圖頁(yè)中的偏移量;1.2初始化待掃描入口地址隊(duì)列及已替換RB有效信息平衡二叉樹(shù)將待掃描入口地址隊(duì)列及已替換RB有效信息平衡二叉樹(shù)的頭指針設(shè)為NULL;待掃描入口地址隊(duì)列是指以線性鏈表形式實(shí)現(xiàn)的、保存動(dòng)態(tài)掃描時(shí)發(fā)現(xiàn)的控制轉(zhuǎn)移指令目標(biāo)地址及其調(diào)用地址的數(shù)據(jù)結(jié)構(gòu),待掃描入口地址隊(duì)列節(jié)點(diǎn)以目標(biāo)地址為索引值,按地址大小按序排列;已替換RB有效信息平衡二叉樹(shù)是指以平衡二叉樹(shù)AVL形式實(shí)現(xiàn)的、保存被替換RB相關(guān)信息的數(shù)據(jù)結(jié)構(gòu),樹(shù)中節(jié)點(diǎn)以被替換RB首地址為索引值,其它信息包括被替換RB的長(zhǎng)度及其與對(duì)應(yīng)TB中每條指令地址的對(duì)應(yīng)關(guān)系;RB是替換塊,指滿足以下條件的最短連續(xù)目標(biāo)指令序列位于基本塊內(nèi)部,包括基本塊自身;包含指定敏感指令且長(zhǎng)度不小于JMP指令長(zhǎng)度;不含所屬基本塊范圍之內(nèi)、本替換塊范圍之外任何控制轉(zhuǎn)移指令的目標(biāo)地址,本替換塊首地址除外;TB是轉(zhuǎn)換塊,指替換塊被替換之后,經(jīng)由替換指令執(zhí)行、包含虛擬化代碼或安全檢查代碼且與原替換塊具有等價(jià)執(zhí)行語(yǔ)義的一組指令序列;1.3令全局變量M=JMP替換指令長(zhǎng)度;步驟2.從GOS內(nèi)核加載程序輸入?yún)?shù)中獲取GOS內(nèi)核起始執(zhí)行地址,記為首個(gè)掃描入口地址,然后對(duì)首個(gè)掃描入口地址進(jìn)行動(dòng)態(tài)掃描2.1.采用掃描狀態(tài)查詢方法檢查首個(gè)掃描入口地址的掃描狀態(tài)若已掃描,轉(zhuǎn)步驟3;若未掃描,將首個(gè)掃描入口地址記為基本塊起始邊界,轉(zhuǎn)2.2;2.2.對(duì)基本塊起始邊界進(jìn)行基本塊掃描,方法是2.2.1初始化待轉(zhuǎn)換敏感指令隊(duì)列將待轉(zhuǎn)換敏感指令隊(duì)列頭指針設(shè)為NULL;待轉(zhuǎn)換敏感指令隊(duì)列是指以線性鏈表形式實(shí)現(xiàn)的、保存基本塊掃描時(shí)發(fā)現(xiàn)的敏感指令地址及其相關(guān)信息的數(shù)據(jù)結(jié)構(gòu),待轉(zhuǎn)換敏感指令隊(duì)列節(jié)點(diǎn)以敏感指令地址為索引值,按地址大小按序排列;2.2.2將基本塊起始地址設(shè)為待掃描地址;2.2.3對(duì)待掃描地址處指令進(jìn)行譯碼,根據(jù)譯碼結(jié)果執(zhí)行以下操作2.2.3.1若為敏感指令或間接控制轉(zhuǎn)移指令,則將該指令添加到待轉(zhuǎn)換敏感指令隊(duì)列,轉(zhuǎn)2.2.4;2.2.3.2若為直接控制轉(zhuǎn)移指令,則首先采用目標(biāo)地址有效性檢查方法檢查該目標(biāo)地址是否指向已替換RB內(nèi)部若指向已替換RB內(nèi)部,則將直接控制轉(zhuǎn)移指令添加到待轉(zhuǎn)換敏感指令隊(duì)列,然后轉(zhuǎn)2.2.4;若不指向已替換RB內(nèi)部,則采用掃描狀態(tài)查詢方法檢查目標(biāo)地址的掃描狀態(tài),若目標(biāo)地址已掃描則轉(zhuǎn)2.2.4,否則將目標(biāo)地址添加到待掃描入口地址隊(duì)列,轉(zhuǎn)2.2.4;2.2.3.3若為普通指令,則轉(zhuǎn)2.2.4;2.2.4根據(jù)譯碼結(jié)果記錄被掃描指令的掃描狀態(tài),方法為首先采用掃描信息位元索引方法得到被掃描指令首地址對(duì)應(yīng)位元的實(shí)際位置,將該位元的低位設(shè)為1;然后采用掃描信息位元索引方法依次得到被掃描指令所有剩余字節(jié)對(duì)應(yīng)位元的實(shí)際位置,將這些位元設(shè)為00;最后若被掃描指令為直接控制轉(zhuǎn)移指令,則采用掃描信息位元索引方法得到該控制轉(zhuǎn)移指令目標(biāo)地址對(duì)應(yīng)的位元的實(shí)際位置,并將該位元的高位設(shè)為1;2.2.5將被掃描指令地址加上該指令長(zhǎng)度,得到下一條指令的首地址;2.2.6若被掃描指令為無(wú)條件控制轉(zhuǎn)移指令或下一條指令首地址已掃描,則將下一條指令首地址設(shè)為基本塊的結(jié)束邊界,并將其掃描信息位元的高位設(shè)為1,表示該地址為基本塊邊界地址或控制轉(zhuǎn)移指令目標(biāo)地址,然后結(jié)束本次基本塊掃描并轉(zhuǎn)2.3;否則轉(zhuǎn)2.2.7;2.2.7將下一條指令首地址設(shè)為待掃描地址,轉(zhuǎn)2.2.3,繼續(xù)進(jìn)行基本塊掃描;2.3對(duì)待轉(zhuǎn)換敏感指令隊(duì)列中的敏感指令進(jìn)行基于替換塊的敏感指令本地替換2.3.1若待轉(zhuǎn)換敏感指令隊(duì)列為空,則停止替換,轉(zhuǎn)步驟3;若待轉(zhuǎn)換敏感指令隊(duì)列不為空,從待轉(zhuǎn)換敏感指令隊(duì)列中取出最小的敏感指令地址,在基本塊內(nèi)尋找包含該敏感指令的替換塊,尋找方法如下2.3.1.1將該敏感指令自身設(shè)為當(dāng)前RB;2.3.1.2若當(dāng)前RB長(zhǎng)度不小于M字節(jié),則將當(dāng)前RB設(shè)為待轉(zhuǎn)換RB,轉(zhuǎn)2.3.3;若當(dāng)前RB長(zhǎng)度小于M字節(jié),嘗試向低地址空間擴(kuò)展相鄰指令到當(dāng)前RB,擴(kuò)展方法如下A1.若當(dāng)前RB首地址為基本塊起始邊界,轉(zhuǎn)2.3.1.3;否則向低地址空間擴(kuò)展一條指令到當(dāng)前RB,轉(zhuǎn)B1;B1.若該低位為1的位元的高位為1,執(zhí)行C1,否則轉(zhuǎn)2.3.1.2;C1.檢查待掃描入口地址隊(duì)列,若發(fā)現(xiàn)以低位為1位元對(duì)應(yīng)的虛地址為索引值的節(jié)點(diǎn),則采用遍歷擴(kuò)展方法檢查該節(jié)點(diǎn)的調(diào)用者隊(duì)列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當(dāng)前RB之間的所有指令擴(kuò)展到當(dāng)前RB,轉(zhuǎn)2.3.1.2;若未發(fā)現(xiàn)以低位為1位元對(duì)應(yīng)的虛地址為索引值的節(jié)點(diǎn),則轉(zhuǎn)2.3.1.2;調(diào)用者隊(duì)列是指以線性鏈表形式實(shí)現(xiàn)的、保存具有相同目標(biāo)地址的控制轉(zhuǎn)移指令地址的數(shù)據(jù)結(jié)構(gòu),調(diào)用者地址隊(duì)列節(jié)點(diǎn)以控制轉(zhuǎn)移指令地址為索引值,包含在待掃描入口地址隊(duì)列的每個(gè)節(jié)點(diǎn)之中;2.3.1.3嘗試向高地址空間擴(kuò)展相鄰指令到當(dāng)前RB,擴(kuò)展方法如下A2.若當(dāng)前RB結(jié)束邊界為基本塊的結(jié)束邊界,轉(zhuǎn)2.3.2,否則向高地址空間擴(kuò)展一條基本塊指令到當(dāng)前RB;B2.若被擴(kuò)展指令首地址對(duì)應(yīng)的位元為10,轉(zhuǎn)2.3.2;否則檢查被擴(kuò)展指令首地址對(duì)應(yīng)位元的高位,若高位為1,轉(zhuǎn)C2,若高位為0,轉(zhuǎn)2.3.1.2;C2.檢查待掃描入口地址隊(duì)列,若發(fā)現(xiàn)以被擴(kuò)展指令首地址為索引值的節(jié)點(diǎn),則采用遍歷擴(kuò)展方法檢查該節(jié)點(diǎn)的調(diào)用者隊(duì)列,將所有位于基本塊范圍之內(nèi)的調(diào)用者地址與當(dāng)前RB之間的所有指令擴(kuò)展到當(dāng)前RB,轉(zhuǎn)2.3.1.2,若未發(fā)現(xiàn)以被擴(kuò)展指令首地址為索引值的節(jié)點(diǎn),直接轉(zhuǎn)2.3.1.2;2.3.2若當(dāng)前RB長(zhǎng)度小于M字節(jié),則將敏感指令設(shè)為待轉(zhuǎn)換RB;否則將當(dāng)前RB設(shè)為待轉(zhuǎn)換RB;2.3.3采用二進(jìn)制翻譯中的常規(guī)方法生成與待轉(zhuǎn)換RB具有等價(jià)執(zhí)行語(yǔ)義的轉(zhuǎn)換代碼塊,記為TB;2.3.4若待轉(zhuǎn)換RB的長(zhǎng)度不小于M字節(jié),則將該RB前M字節(jié)替換為JMP指令,目標(biāo)地址為TB首地址,剩余字節(jié)用NOP指令填充,得到已替換RB;若待轉(zhuǎn)換RB的長(zhǎng)度小于M字節(jié),則將該RB的首字節(jié)替換為INT3指令,剩余字節(jié)用NOP指令填充,得到已替換RB;2.3.5在已替換RB有效信息平衡二叉樹(shù)中創(chuàng)建已替換RB的節(jié)點(diǎn),該節(jié)點(diǎn)包括已替換RB的首地址、長(zhǎng)度及其與TB指令之間的地址對(duì)應(yīng)關(guān)系這些有效信息;2.3.6遍歷待掃描敏感指令隊(duì)列,刪除所有以已替換RB中的敏感指令地址為索引值的節(jié)點(diǎn),轉(zhuǎn)2.3.1;2.4遍歷待掃描入口地址隊(duì)列,刪除所有以已掃描入口地址為索引值的節(jié)點(diǎn);2.5若待掃描入口地址隊(duì)列為空,則結(jié)束本次動(dòng)態(tài)掃描,轉(zhuǎn)步驟3;否則從待掃描入口地址隊(duì)列中取出最大未掃描入口地址,記為基本塊起始邊界,轉(zhuǎn)2.2執(zhí)行下一次基本塊掃描;步驟3從首個(gè)掃描入口地址開(kāi)始執(zhí)行GOS內(nèi)核代碼,直至產(chǎn)生硬件中斷或異?;驁?zhí)行間接控制轉(zhuǎn)移指令的轉(zhuǎn)換代碼;步驟4.將GOS中斷或異常處理函數(shù)的入口地址或間接控制轉(zhuǎn)移指令的目標(biāo)地址設(shè)為首個(gè)掃描入口地址,轉(zhuǎn)2.1。
      2. 如權(quán)利要求l所述的基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法,其特征在于 所述掃描狀態(tài)查詢方法是首先將被查詢地址劃分為頁(yè)目錄索引、頁(yè)表索引和頁(yè)內(nèi)偏移 三個(gè)位段;然后檢查頁(yè)目錄索引指向的頁(yè)目錄項(xiàng),若頁(yè)目錄項(xiàng)為0,則返回-1表示該地 址未掃描且該地址對(duì)應(yīng)位元不存在;若頁(yè)目錄項(xiàng)不為0,則繼續(xù)檢査頁(yè)表索引指向的頁(yè)表 項(xiàng),若頁(yè)表項(xiàng)為0,則返回-1表示該地址未掃描且該地址對(duì)應(yīng)位元不存在,若頁(yè)表項(xiàng)不 為O,則根據(jù)頁(yè)表項(xiàng)中的掃描信息位圖頁(yè)首地址和頁(yè)內(nèi)偏移計(jì)算得到被查詢地址對(duì)應(yīng)位元 的實(shí)際位置并返回位元的實(shí)際值;最后根據(jù)位元的實(shí)際值確定被掃描指令的首地址的掃 描狀態(tài)位元的實(shí)際值低位為l表示已掃描,為0表示未掃描。
      3. 如權(quán)利要求l所述的基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法,其特征在于 所述目標(biāo)地址有效性檢査方法為采用平衡二叉樹(shù)遍歷方法遍歷己替換RB有效信息平衡 二叉樹(shù),找到索引值小于指定目標(biāo)地址且與指定目標(biāo)地址最接近的節(jié)點(diǎn),若指定目標(biāo)地 址小于或等于已替換RB的首地址加上節(jié)點(diǎn)中記錄的已替換RB長(zhǎng)度,則表明指定目標(biāo)地 址指向已替換RB內(nèi)部,否則不指向已替換RB內(nèi)部。
      4. 如權(quán)利要求l所述的基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法,其特征在于 所述掃描信息位元索引方法為首先將被索引地址劃分為頁(yè)目錄索引、頁(yè)表索引和頁(yè)內(nèi)偏移三個(gè)位段;然后檢查頁(yè)目錄索引指向的頁(yè)目錄項(xiàng)是否為O,是則立即分配一個(gè)數(shù)據(jù)頁(yè) 作為掃描信息位圖頁(yè)表頁(yè)并將該頁(yè)表頁(yè)的首地址寫(xiě)入頁(yè)目錄頁(yè)中對(duì)應(yīng)的頁(yè)目錄項(xiàng)中;接著檢査頁(yè)表索引指向的頁(yè)表項(xiàng)是否為O,是則立即分配一個(gè)數(shù)據(jù)頁(yè)作為掃描信息位圖頁(yè)并 將該位圖頁(yè)的首地址寫(xiě)入頁(yè)表頁(yè)中對(duì)應(yīng)的頁(yè)表項(xiàng)中;最后根據(jù)掃描信息位圖頁(yè)首地址和 頁(yè)內(nèi)偏移得到被索引地址對(duì)應(yīng)位元的實(shí)際位置。
      5. 如權(quán)利要求l所述的基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法,其特征在于 所述向低地址空間擴(kuò)展一條基本塊指令到當(dāng)前RB的方法是采用掃描信息位元索引方法 從當(dāng)前RB首地址開(kāi)始向低地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對(duì)應(yīng)位元的實(shí)際位置并檢查每個(gè)位元的實(shí)際值,找到第一個(gè)低位為1的位元,將該低位為1的位元對(duì)應(yīng)的虛地址即被擴(kuò)展指令的首地址設(shè)為當(dāng)前RB起始邊界。
      6. 如權(quán)利要求l所述的基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法,其特征在于所述遍歷擴(kuò)展方法為采用目標(biāo)地址有效性檢查方法依次檢査每個(gè)調(diào)用者地址是否位于基本塊范圍之內(nèi)且位于當(dāng)前RB范圍之外,是則將調(diào)用者地址設(shè)為當(dāng)前RB的邊界,即若 調(diào)用者地址小于當(dāng)前RB首地址,則將該地址設(shè)為當(dāng)前RB首地址;若調(diào)用者地址大于當(dāng) 前RB的結(jié)束邊界,則將該地址設(shè)為當(dāng)前RB的結(jié)束邊界,否則檢查下一個(gè)調(diào)用者地址。
      7. 如權(quán)利要求l所述的基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法,其特征在于 所述向高地址空間擴(kuò)展一條基本塊指令到當(dāng)前RB的方法是采用掃描信息位元索引方法 從當(dāng)前RB結(jié)束邊界開(kāi)始向高地址空間搜索掃描信息位圖,依次得到每條連續(xù)地址對(duì)應(yīng)位 元的實(shí)際位置并檢査每個(gè)位元的實(shí)際值,找到第二個(gè)低位為1的位元或第一個(gè)被設(shè)置為 10的位元,將該位元對(duì)應(yīng)的虛地址設(shè)為當(dāng)前RB結(jié)束邊界,而找到的第一個(gè)低位為1的位 元對(duì)應(yīng)的虛地址即被擴(kuò)展指令首地址。
      全文摘要
      本發(fā)明公開(kāi)了一種基于塊對(duì)目標(biāo)代碼掃描并替換敏感指令的方法,目的是提供一種當(dāng)敏感指令長(zhǎng)度小于JMP時(shí),尋找包含該敏感指令且長(zhǎng)度不小于JMP的最小目標(biāo)代碼塊,并用JMP替換該最小目標(biāo)代碼塊的方法。技術(shù)方案是對(duì)首個(gè)掃描入口地址進(jìn)行動(dòng)態(tài)掃描,主要包括對(duì)基本塊起始邊界進(jìn)行基本塊掃描,對(duì)待轉(zhuǎn)換敏感指令隊(duì)列中的敏感指令進(jìn)行基于替換塊的敏感指令本地替換;然后從首個(gè)掃描入口地址開(kāi)始執(zhí)行GOS內(nèi)核代碼,直至產(chǎn)生硬件中斷或異?;驁?zhí)行間接控制轉(zhuǎn)移指令的轉(zhuǎn)換代碼;將GOS中斷或異常處理函數(shù)的入口地址或間接控制轉(zhuǎn)移指令的目標(biāo)地址設(shè)為首個(gè)掃描入口地址,然后循環(huán)執(zhí)行動(dòng)態(tài)掃描。采用本發(fā)明能夠最大限度地避免使用INT0/INT3指令進(jìn)行替換,有效提高BT虛擬化性能。
      文檔編號(hào)G06F9/455GK101630269SQ20091004383
      公開(kāi)日2010年1月20日 申請(qǐng)日期2009年7月3日 優(yōu)先權(quán)日2009年7月3日
      發(fā)明者劉曉建, 吳慶波, 孔金珠, 張衛(wèi)華, 戴華東, 易曉東, 譚郁松 申請(qǐng)人:中國(guó)人民解放軍國(guó)防科學(xué)技術(shù)大學(xué)
      網(wǎng)友詢問(wèn)留言 已有0條留言
      • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1