http://www.paper.edu.cn
利用虛擬機器技術實現軟體保護探討
張路
北京郵電大學電腦科學與技術學院,北京(100876)
E-mail:dwingg@gmail.com
摘 要:本文提出一種新的利用虛擬機器原理的軟體保護手段。闡述了這種手段的完整實現步
驟,並在每個步驟都詳細論述了實際開發中可以利用的各種實用技巧。綜合靈活地運用虛擬
機原理和混亂化技術,將使軟體保護強度提升到新的水準。
關鍵詞:軟體保護,虛擬機器,編碼,解碼,混亂化
中圖分類號:TP309
1.引言
隨著互連網的廣泛普及,軟體盜版現象日益嚴重,商業軟體和共用軟體作者的利益受到
嚴重侵害。雖然軟體的發布一般不包含原始碼,但隨著軟體逆向工程技術的不斷進步,常用
的IA-32體系架構被大量研究。 即使是二進位機器代碼的程式依然能夠在一定程度上被分析,
從而使軟體的註冊與限制措施失效。
為了阻止軟體的逆向工程,目前已經出現了一些保護手段[1]
,主要是通過程式整體加密
和檢測調試器的方式。但由於在運行時程式必須在解密的條件下才能正常運行,調試器的檢
測一般也只能在程式原始入口之前有效。所以這種方法是不可靠的。本文提出一種新的保護
機制,它利用了虛擬機器技術,有效地解決這個問題。
虛擬機器(Virtual Machine)是相對於物理存在的電腦而言的,是具有真實電腦全部功
能的虛擬電腦[2]
。它可以使用軟體類比一套指令集在使用另一套指令集的硬體裝置上運
行,除了運行速度慢一些之外,沒有功能上的區別。主要用來統一程式啟動並執行平台、分析調
試程式、類比軟硬體等。雖然用軟體類比執行比硬體直接執行慢得多,但由於硬體的不斷髮
展和一些特殊的需求,這項技術仍然很廣泛地用於科研、商業以及個人應用。軟體類比的指
令集可以是真實硬體裝置的, 也可以是虛擬。 由於軟體指令的分析需要首先掌握其指令集,
因此軟體如果含有不同尋常或沒有文檔資料的指令集代碼,即使是很短的一段代碼,分析起
來也會面臨很大困難。如果再加入一些後文將要提出的一些反分析技術,將非常有效地實現
軟體的保護。
2.虛擬機器軟體保護流程
虛擬機器軟體保護可分為兩個部分:首先是保護部分,即把待保護的代碼塊轉化成虛擬機器
代碼,其次是執行部分,即在發布已受保護的軟體之後,交付使用者使用時,虛擬機器指令正確
地執行虛擬機器代碼。
將原代碼進行保護的總體流程如圖1所示:
2.1 提取待保護的代碼塊
由於經過虛擬機器轉化之後的代碼量會有很大增長,並且執行速度大幅下降,所以一般不
需把原來的整個程式全部轉化, 只需選取其中有關軟體註冊或不想被逆向分析而需要保密的
代碼塊。一般這些部分並不多,而且不需要很高的運行效率。
由於虛擬機器指令的特殊性,要保證這部分指令的執行入口只有一處,否則將很難確定經
過混亂化的虛擬機器指令與其它入口位置的對應。一般情況是以函數過程體為單位,可保證代
碼塊只有單一入口。
因為軟體大多使用進階語言開發,為了簡化定位待保護代碼塊的難度,可在進階語言待
保護程式段的前後加入不影響程式啟動並執行特殊標記, 這樣就能有利於程式自動定位並提取待
保護的代碼塊。
2.2 機器指令解碼
前面提取的代碼塊是原始機器指令流。為了降低轉化成虛擬機器指令的複雜度,並且利於
統一不同平台機器指令的轉化,要先把原始機器指令轉化成易於理解和分析的中間指令。
這種中間指令要有廣泛的適用性,支援各種平台指令。所有中間指令均使用統一的格式
(指令操作符、第一運算元、第二運算元、……) 。其中指令操作符是指令的核心,用於表
示指令的動作,如傳送、運算、跳轉等等;每個運算元都由(訪問字寬、定址方式、定址參
數)組成,運算元訪問字寬一般有8位,16位,32位,64位等,定址方式考慮到目前CISC架
構的定址複雜性,可以概括成立即數定址、寄存器定址和支援各種變址的寄存器定址。這樣
各種平台的指令流都能轉化並統一成一種中間指令序列進入下一步轉換。
2.3 指令轉換
在得到統一格式的中間代碼後,就可以向虛擬機器指令轉換了,因此這是整個保護流程中
最有意義的一個步驟。虛擬機器指令集和硬體指令集不同,前者不受到硬體設計的限制,可以
儘可能有利於向軟體保護的方向設計。為此,做出以下考慮:
(1)選用精簡指令集。為了加大指令序列分析的難度,選用RISC類指令集更有利,並能
簡化代碼的轉換以及虛擬機器解譯器的設計與實現。
(2)擴大寄存器的數量,並統一寄存器編號,其中包含所有的特殊寄存器,如指令指示
器、狀態寄存器。
(3)取消跳轉指令。這類指令可由直接讀寫指令指標來實現,在沒有直接跳轉指令的
情況下,程式流程的分析將更有迷惑性。
可以看出, 這些手段都會使轉化後的虛擬機器指令變得更多, 但這對於軟體保護並無弊端。
2.4 混亂化
如果上面的幾項手段不足以妨礙逆向分析者, 那麼可在轉換後的虛擬機器代碼繼續做強度
可控的隨機混亂處理, 這種轉化方式也被稱之為“代碼混淆[3]
”。 其手段主要有以下幾種方法:
2.4.1 間接使用常數
無論是原始機器代碼還是直接轉換後的虛擬機器指令代碼,指令中的常數是不變的,這會
給逆向分析者提供線索,尤其是間接跳轉指令的地址位移常數。為消除這些線索,可把所有
使用常數的單一指令轉化成多種指令運算產生。這種產生演算法是複雜多變的,可根據加密強
度隨機播放。
2.4.2 無意義指令填充
在代碼中分散添加一些無關緊要的隨機指令對程式正確執行無影響, 但對於逆向分析者
來說無疑使分析工作增加許多幹擾性。 這些無意義指令可根據加密強度隨機穿插在有效指
令中。
2.4.3 無效指令填充
在虛擬機器代碼邏輯上不會執行到地方,加入不完整或無定義的指令代碼,可以一定程度
上幹擾靜態逆向分析。由於上面所設計的指令集沒有顯式絕對跳轉指令,因此一般可以在隱
式絕對跳轉指令後添加幾個位元組的無效指令。
2.4.4 指令亂序化
根據兩條指令如果不涉及同一寄存器、 同一記憶體且不影響狀態寄存器和指令跳轉的情況
下可以互換的原理,可以儘可能地交換相鄰的指令。不但可使程式的流程出現小幅度混亂,
更可使無意義指令與有效指令相互融合,加強無意義指令的作用。圖2給出一個指令片段亂
序化的樣本:
2.4.5 代碼流程扭曲變換
一般的程式流程如果沒有跳轉,則是至上而下順序執行的。如果將順序打亂,使連續順
序執行的指令數量降低到一定程度,就可以使逆向分析變得更加困難,還可以提高無效指令
的填充率。這種轉換可稱之為“扭曲變換[4]
”,變換樣本如圖3:
2.5 編碼
這一步驟將虛擬機器指令轉化成二進位代碼的形式。 一般的指令編碼原則要求統一併且有
一定的規律,以便於編碼與解碼,這一點在硬體實現上尤為重要。但如果為了軟體保護而加
強反編碼的難度,就要實施特別的編碼策略。
最簡單高效的基本方法是編碼隨機化。即每次實施保護,都隨機播放指令運算元、寄存
器編號所對應的二進位代碼。這種編碼可以一對多,即多種二進位代碼對應一種指令;還可
以增加隨機填充的冗餘標誌位。這些手段要和虛擬機器解譯器相配合。
2.6 寫回原程式檔案
最終得到的虛擬機器二進位代碼要寫回到原始程式檔案中, 同時要寫入的還有虛擬機器解釋
器。因為經過一系列轉換與混亂化操作後,虛擬機器代碼量可能遠大於原始機器代碼量,因此
一般需要擴大原程式的空間,把虛擬機器代碼和解譯器附在程式的空閑地區或尾部。原始被保
護的程式碼可以被清空,也可以存入一部分虛擬機器代碼或虛擬機器解譯器(如圖4所示) ,並
在被保護的各個程式碼片段的入口處寫入跳轉入虛擬機器解譯器的指令, 還包括對應虛擬機器代碼入
口地址參數。
虛擬機器代碼可以做一遍壓縮加密處理,並在解譯器執行的時候邊解密解壓邊執行。但這
一步對於軟體保護並不重要, 分析者可以很容易地跟蹤解譯器程式並完整還原被壓縮加密的
虛擬機器代碼。
2.7 虛擬機器解譯器
上面6個步驟都是軟體的保護工作,而這一部分要獨立出來並附在可分發的程式檔案。
主要作用是解釋執行上面所設計並動態產生的虛擬機器指令集。 由於一開始將主要用於軟體保
護的虛擬機器指令集設計成RISC類,這樣虛擬機器解譯器的編寫就簡單一些。虛擬機器代碼的複
雜性主要依靠代碼混亂化程度。 虛擬機器解譯器還要注意進入和離開解譯器時以及調用外部程
序段的前後時硬體寄存器的儲存和還原,解譯器本身盡量不使用系統堆棧,否則會與虛擬機器
指令的堆棧使用相衝突。
3.總結
理論上,只要軟體在使用者平台上能正常運行,就無法避免軟體通過某種途徑遭受修改而
失去保護[5]
。但要延緩保護的時間到一定程度是可以做到的。綜合應用虛擬機器技術並利用與
其相關的各種反分析技巧,軟體保護將達到一個新的水平。
4.致謝
感謝我的導師漆濤教授對本文提出的修改意見。
參考文獻
[1] 熊麗,童恒慶.軟體保護技術的發展現狀與展望[J].軟體導刊,2005, (19) :41-44.
[2] 毛速.虛擬機器的應用[J].寧夏工程技術,2003,2(2) :154-156.
[3] 羅宏,蔣劍琴,曾慶凱.用於軟體保護的代碼混淆技術[J].電腦工程,2006,32(11) :177-179.
[4] 劉濤濤.扭曲變換加密[EB/OL].http://liutaotao.com/nqby.txt,2006-7-7.
[5] 石禮娟.軟體保護方案研究[J].農業網路資訊,2006, (6) :124,125,129.
Software Protection Using Virtual Machine
Zhang Lu
Department of Computer Science and Technology,Beijing University of Posts and
Telecommunications,Beijing (100876)
Abstract
This paper provides a new way of software protection using virtual machine theory. And describes the
whole process of implement of this way. Then discusses detailedly some actual technique in every step
of the development. Making use of virtual machine theory and confusion technique integratedly and
deftly, can improve software protection strength to a new level.
Keywords:Software protection,Virtual machine,Encode,Decode,Confusion
作者簡介:張路,男,1982 年生,碩士研究生,主要研究方向是資料壓縮與加密,同時對
軟體保護技術有深刻的理解與研究。