[發明專利]一種基于LLVM的虛擬機保護方法及系統在審
| 申請號: | 202210017306.2 | 申請日: | 2022-01-07 |
| 公開(公告)號: | CN114327789A | 公開(公告)日: | 2022-04-12 |
| 發明(設計)人: | 文偉平;劉琛;王雅儀;李成揚;黃天波 | 申請(專利權)人: | 北京大學 |
| 主分類號: | G06F9/455 | 分類號: | G06F9/455;G06F21/14;G06F8/41;G06F8/30 |
| 代理公司: | 北京萬象新悅知識產權代理有限公司 11360 | 代理人: | 李稚婷 |
| 地址: | 100871*** | 國省代碼: | 北京;11 |
| 權利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關鍵詞: | 一種 基于 llvm 虛擬機 保護 方法 系統 | ||
1.一種基于LLVM的虛擬機保護方法,通過將源代碼編譯為LLVM中間表示,遍歷整個LLVM中間表示程序獲得程序所有的函數和基本塊作為基本單位,為所有基本單位進行依賴分析并根據依賴分析結果對基本單位進行切分得到基本指令,將基本指令進行重組得到新基本塊并綁定操作碼,根據新基本塊創建操作碼數組和解釋器,通過解釋器完成整個程序的控制邏輯,從而達到虛擬機保護的目的;具體包括如下步驟:
1)將源代碼轉化成LLVM中間表示,即使用編譯器將源代碼編譯成LLVM可分析的.bc文件;
2)根據步驟1)得到的源代碼的.bc文件,獲取源程序中的函數和基本塊,即在整個程序層面和程序中的所有函數層面進行遍歷,獲取到程序中的所有函數,以及函數中的所有基本塊,并將這些信息作為基本單位進行保存;
3)根據步驟2)中得到的基本單位信息,對基本單位的每一條指令進行遍歷,每條指令有一個標志位來標識是否經過了依賴分析;
4)對于沒有經過依賴分析的指令,從該條指令開始,分析得到該指令的所有依賴指令,并將所有依賴指令放進同一個分組,該分組代表一個最小的不可分割的單位;
5)對步驟4)得到的分組進行指令重組,將分組中的指令包裝成為一個新基本塊;
6)為新基本塊生成一個操作碼,該操作碼與新基本塊是唯一對應關系;刪除原基本單位中已經被加入新基本塊的所有指令,防止指令重復;
7)收集步驟6)中生成的所有操作碼,組成一個操作碼集合,將該集合的名稱隨機化之后,將該集合作為程序的一部分加入到源代碼中,生成操作碼數組;
8)對每一個基本單位設計一個解釋器用來控制該基本單位的運行,解釋器根據當前的操作碼索引,找到當前需要執行操作碼,利用操作碼跳轉到步驟6)中該操作碼唯一對應的新基本塊中去執行,執行結束之后會重新跳回解釋器,直到程序結束。
2.如權利要求1所述的虛擬機保護方法,其特征在于,步驟1)使用clang++將源代碼編譯鏈接成單個.bc文件,具體的編譯命令為:clang++-c-emit-llvm input.cpp-oinput.bc。
3.如權利要求1所述的虛擬機保護方法,其特征在于,步驟3)涉及需要進行依賴分析的指令信息和判斷指令是否已經經過依賴分析的標志信息,其中指令信息存儲在一個向量中,表示為:vectorInstruction;標志信息存儲在一個map中,表示為:mapInstruction,bool,map的key值代表一條指令,value值代表該指令是否經過了依賴分析;在步驟3)對指令信息進行倒序遍歷,拿到一個沒有經過依賴分析的指令進行步驟4)的依賴分析。
4.如權利要求3所述的虛擬機保護方法,其特征在于,步驟4)的依賴分析結果存放在雙重的堆棧stackstackInstruction中,其中內層堆棧stackInstruction存放的是一條指令的分析結果,所有的分析結果都有一個自己的堆棧,外部再用一個堆棧存儲所有指令的分析結果;具體的依賴分析過程是:對于步驟3)拿到的當前vector中沒有經過依賴分析的一條指令,首先為該指令創建自己的堆棧和隊列;然后將該指令入棧,入隊;將隊首指令彈出,然后開始向上尋找該指令的依賴,將尋找到的依賴指令入棧,入隊,并且將該條指令的標志信息即是否經過了依賴分析置為true;繼續彈出隊首尋找依賴,直到隊列為空,代表該指令的所有依賴已經全部尋找完畢;將得到的依賴指令堆棧即內層堆棧加入到分析結果堆棧即外層堆棧;接著在vector中遍歷找到下一個標志信息為false的指令繼續進行依賴分析,直到所有指令均完成了依賴分析。
5.如權利要求4所述的虛擬機保護方法,其特征在于,對于步驟4)得到的依賴分析結果stackstackInstructioninstBlock,instBlock.size()就是要創建的新基本塊的數量,也是操作碼的數量;在步驟5)需要遍歷instBlock,拿出每一組指令依賴分析結果curInsts,然后為curInsts新建一個基本塊instBasicBlock,接著將curInsts中的每一條指令彈出放入到instBasicBlock中;在步驟6)為instBasicBlock分配一個唯一的操作碼并綁定,然后將該instBasicBlock中的所有指令從原基本塊中移除。
該專利技術資料僅供研究查看技術是否侵權等信息,商用須獲得專利權人授權。該專利全部權利屬于北京大學,未經北京大學許可,擅自商用是侵權行為。如果您想購買此專利、獲得商業授權和技術合作,請聯系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/202210017306.2/1.html,轉載請聲明來源鉆瓜專利網。





