吳偉民,許文鋒,林志毅,司 斯,阮奕邦
(廣東工業(yè)大學計算機學院,廣東 廣州 510006)
基于增強型虛擬機的軟件保護技術(shù)*
吳偉民,許文鋒,林志毅,司 斯,阮奕邦
(廣東工業(yè)大學計算機學院,廣東 廣州 510006)
針對目前日益嚴峻的軟件保護問題,對現(xiàn)有基于虛擬機的軟件保護技術(shù)進行分析與研究,對虛擬機保護技術(shù)進行了改進,設計了一種增強型虛擬機軟件保護技術(shù)。采用了虛擬花指令序列與虛擬指令模糊變換技術(shù),并對虛擬機的虛擬指令系統(tǒng)做了改進,從而提高了虛擬機執(zhí)行的復雜程度與迷惑程度,具有高強度的反逆向、防篡改、防破解的特點。實驗分析表明,增強型虛擬機保護技術(shù)明顯優(yōu)于普通型虛擬機保護技術(shù)。
虛擬機;軟件保護;虛擬花指令;模糊變換
計算機軟件是一種知識密集型的數(shù)字產(chǎn)品,軟件的研發(fā)非常復雜,研制及維護周期很長,需要耗費大量的人力物力資源,是軟件開發(fā)人員辛勤勞動的成果。但是,大量軟件破解行為使得商業(yè)軟件和共享軟件作者的利益受到嚴重侵害,他們的生存和發(fā)展將會受到嚴重影響。因此,軟件保護技術(shù)的研究與實現(xiàn)是目前軟件產(chǎn)業(yè)發(fā)展的重中之重。
為了保護軟件,人們提出了一系列的軟件保護技術(shù),如序列號保護方式、授權(quán)文件保護、代碼混淆、加殼、軟件數(shù)字水印等[1],雖然這些技術(shù)取得了一定的成效,但是這些方式的保護強度都不是很高。近年來,軟件保護技術(shù)又出現(xiàn)了一個新的進步,那就是虛擬機技術(shù),它通過對代碼的虛擬化來達到保護軟件的目的[2]?;谔摂M機的軟件保護技術(shù),它虛擬出一套自己設計的指令系統(tǒng),用于將一系列指令放在一個解釋引擎中執(zhí)行。在該指令系統(tǒng)中,大部分常用的匯編指令都可以用虛擬機中的相應指令代替[3]。雖然虛擬機保護技術(shù)在反逆向、反破解方面優(yōu)于其他保護技術(shù),但是逆向工程師通過分析大量虛擬指令以及虛擬機執(zhí)行過程,軟件代碼仍有被逆向還原的可能性[4]。為了增加代碼保護強度、降低被逆向還原的可能性,本文提出了基于增強型虛擬機軟件保護技術(shù),這種新的軟件保護技術(shù)融合了虛擬花指令序列和虛擬指令模糊變換技術(shù),從保護虛擬機本身代碼安全的角度出發(fā),在最大程度上保護了軟件代碼。
在軟件領(lǐng)域經(jīng)常用到有關(guān)虛擬機的概念,比如VMWare,它是指虛擬出一個CPU運行整個操作系統(tǒng),包含軟件、硬件等各方面的虛擬化[3]。本文所指的虛擬機并不是像VMware那樣的虛擬機,而更像是一個進程級的高級語言虛擬機。它擁有自定義獨立的指令系統(tǒng)——虛擬指令系統(tǒng),這種指令系統(tǒng)和Intel的x86指令系統(tǒng)并不在一個層次上。它還將我們所熟悉的x86匯編指令流轉(zhuǎn)換為ByteCode(字節(jié)碼),ByteCode是虛擬機解釋執(zhí)行被保護代碼功能時所需的一串字節(jié)流。Java虛擬機、.Net或者其他腳本語言的虛擬機都是靠解析ByteCode來執(zhí)行的,但它們之間的ByteCode并不通用,因為每一個虛擬機設計的ByteCode都是為自己使用的,并不兼容其他的虛擬機。利用虛擬機技術(shù)保護軟件,用戶可以選擇軟件中需保護代碼塊,把代碼塊反匯編成匯編指令流,然后用自定義的虛擬指令系統(tǒng)中的虛擬指令替換對應的匯編指令,在發(fā)布時,將整個虛擬機嵌入軟件本身一起發(fā)布。在運行被保護代碼時,由虛擬機解釋執(zhí)行ByteCode。
虛擬機保護對PE(Portable Execute)文件的處理流程如圖1所示。PE文件格式是WIN32環(huán)境自帶的跨平臺可執(zhí)行文件格式,常見的EXE、DLL、OCX、SYS、COM 等文件均是PE文件[5]。
虛擬機保護系統(tǒng)首先從PE中提取需保護代碼塊,通常以函數(shù)為單位來提取,然后通過反匯編器反匯編成我們常見的x86匯編指令流,再把匯編指令流轉(zhuǎn)換成ByteCode存儲在PE文件中。轉(zhuǎn)換之后,PE文件中被保護代碼的正確運行需要虛擬機解釋執(zhí)行ByteCode,因此,整個虛擬機其實是內(nèi)嵌在PE文件中的,它包括跳轉(zhuǎn)表、虛擬指令調(diào)度器和虛擬指令系統(tǒng)。
Figure 1 Process of virtual machine software protection圖1 虛擬機軟件保護處理流程
由于虛擬機是通過解釋執(zhí)行ByteCode來完成原始代碼的功能,所以經(jīng)過虛擬機保護后的PE文件會增大,被保護后的代碼塊運行效率會降低,因此,虛擬機保護只適用于保護PE文件中重要的代碼塊,而不是PE文件中的所有代碼。提取方式通常以函數(shù)為單位,根據(jù)函數(shù)的起始地址與結(jié)束地址確定需保護代碼塊。
反匯編器將上一步提取的代碼塊反匯編成匯編指令流,比如,8B442404對應的匯編指令為mov eax,dword ptr[esp+4]。我們具體借助現(xiàn)有成熟的反匯編器來實現(xiàn)這一功能,將匯編語言作為中間語言,這樣有利于快速高效地將x86機器碼轉(zhuǎn)換為ByteCode,從而可以把工作重點放在虛擬機保護核心技術(shù)的研究上。
虛擬機由虛擬指令系統(tǒng)、虛擬指令調(diào)度器和跳轉(zhuǎn)表組成,它負責解釋執(zhí)行ByteCode,執(zhí)行完被保護代碼塊功能后,退出虛擬機,并正確返回至被保護代碼塊下一處x86匯編指令。為了更清楚地認識虛擬機的組成與虛擬機在PE文件結(jié)構(gòu)中是如何操作的,下面以圖的方式展示對一個函數(shù)(functionA)進行虛擬機保護的過程。functionA被虛擬機保護前后,PE文件內(nèi)容對比如圖2所示。
虛擬機的各個組成部分和ByteCode在PE文件中的位置如圖2所示。圖2a中functionA為待保護匯編指令流,經(jīng)過ByteCode轉(zhuǎn)換器轉(zhuǎn)換為ByteCode,并存儲在PE文件最末尾新增區(qū)塊中,在此例中,ByteCode存儲在圖2b的0040D400處。functionA函數(shù)被替換為圖2b中的push/jmp兩條指令。函數(shù)被虛擬機保護后,當需要執(zhí)行函數(shù)時,由push/jmp兩條指令跳轉(zhuǎn)至虛擬機執(zhí)行,由虛擬機解釋執(zhí)行ByteCode完成函數(shù)功能。
Figure 2 PE context comparison of virtual before machine protection and after machine protection圖2 虛擬機保護前后PE文件內(nèi)容對比
(1)虛擬指令調(diào)度器。
虛擬指令調(diào)度器通過讀取ByteCode來調(diào)度虛擬指令,相當于CPU的執(zhí)行調(diào)度器。虛擬指令是一小段匯編程序,各種虛擬指令組成了虛擬指令系統(tǒng)。圖2b中VMDispatcher即是虛擬指令調(diào)度器,它其實也是一條虛擬指令。經(jīng)虛擬機保護后,函數(shù)執(zhí)行時,由push/jmp指令轉(zhuǎn)入虛擬機執(zhí)行。調(diào)度器的調(diào)度過程如下:
①進入虛擬機后,首先執(zhí)行VStartVM指令,它將所有寄存器的值壓入堆棧,然后為虛擬環(huán)境結(jié)構(gòu)(VMContext)分配堆棧空間。VMContext是虛擬機執(zhí)行時要用到的各種虛擬寄存器,即模擬一個CPU的上下文環(huán)境,它用一個結(jié)構(gòu)體來虛擬化所有寄存器。
②執(zhí)行VMDispatcher指令,它通過讀取ByteCode流,調(diào)度虛擬指令。調(diào)度的第一條指令是Vbegin指令,這條指令的ByteCode碼為“1B”,如圖2b所示。
③執(zhí)行Vbegin指令,它把所有寄存器的值賦值給VMContext結(jié)構(gòu),然后跳轉(zhuǎn)至VMDispatcher。
④VMContext結(jié)構(gòu)被初始化后,虛擬機開始真正執(zhí)行被保護代碼的功能,每執(zhí)行一條虛擬指令,都需要跳轉(zhuǎn)至VMDispatcher,由它調(diào)度下一條虛擬指令繼續(xù)執(zhí)行
(2)虛擬指令系統(tǒng)。
虛擬指令的設計分為兩大類,第一類是堆棧虛擬指令,第二類是普通虛擬指令。由原始匯編指令轉(zhuǎn)換為虛擬指令,首先必須經(jīng)過堆棧虛擬指令的處理,然后由普通虛擬指令從棧中取出參數(shù)進行功能操作。部分虛擬指令如圖3所示。
Figure 3 Some virtual instructions圖3 部分虛擬指令
圖3中1、2、3為堆棧虛擬指令,4為普通虛擬指令,其中,esi指向ByteCode,edi指向 VMContext。VPushImm32的功能是把一個32位立即數(shù)入棧。VPopReg32的功能是把當前棧中的值壓入VMContext中的虛擬寄存器。VPushReg32的功能是把VMContext中的虛擬寄存器的值壓入棧中。VAdd的功能是從當前棧中去源操作數(shù)與目的操作數(shù)進行相加,然后把結(jié)果壓入棧中。
這種方法實現(xiàn)虛擬指令系統(tǒng)的優(yōu)點是:需要用到操作數(shù)的虛擬指令不必去管操作數(shù)從哪兒來,這些操作數(shù)交給堆棧虛擬指令處理。原始匯編指令轉(zhuǎn)換為虛擬指令序列如圖4所示,括號中的參數(shù)來自于ByteCode。
Figure 4 Original assemble instruction transformed into virtual instruction series圖4 原始匯編指令轉(zhuǎn)換為虛擬指令序列
(3)跳轉(zhuǎn)表。
跳轉(zhuǎn)表起著映射虛擬指令地址的作用,為了使虛擬機保護系統(tǒng)每次處理PE文件后,ByteCode碼對應的虛擬指令不一樣,增加被逆向還原的難度。虛擬指令存放在PE文件之前,通過隨機的方式為每一條虛擬指令編碼,然后通過公式“虛擬指令地址=[X*4+跳轉(zhuǎn)表地址]”計算出虛擬指令的地址,最后把虛擬指令的地址存放在跳轉(zhuǎn)表中,而這個編碼則寫入ByteCode中,作為映射虛擬指令的ByteCode碼。因此,虛擬機在執(zhí)行的時候,可以逆向計算出虛擬指令的地址。通過這種方法處理,使得同一個PE文件,每次處理后的ByteCode都不一樣。
以圖2b中ByteCode碼“9D”為例,通過公式“虛擬指令地址=[X*4+跳轉(zhuǎn)表地址]”計算出“9D”對應的地址為“00406456”,所以“9D”對應的虛擬指令是VPushImm32。X表示ByteCode,跳轉(zhuǎn)表地址在此例中的值為“00406000”。
ByteCode轉(zhuǎn)換器相當于一個虛擬指令編譯器,它根據(jù)自定義的虛擬指令系統(tǒng),把x86匯編指令流轉(zhuǎn)換為只能被此虛擬機才能識別執(zhí)行的字節(jié)流。
以圖2a“mov eax,dword ptr[esp+4]”指令為例,它被轉(zhuǎn)換成了9D04000000 9D01000000…。下面介紹它的轉(zhuǎn)換方法。這條指令的源操作數(shù)為一內(nèi)存數(shù),內(nèi)存數(shù)的真實結(jié)構(gòu)是[imm+reg*scale+reg2],在轉(zhuǎn)換源操作數(shù)的過程中,需要計算這四個值,這四個值分別為:imm=00000004,scale=00000001,reg=00000024(VMContext中的偏移值),reg2=FFFFFFFF(值為負,表示忽略此寄存器),把這四個值寫入ByteCode中,有了這四個值,虛擬機執(zhí)行時就可以取出[esp+4]表示的內(nèi)存值,因此mov eax,dword ptr[esp+4]指令被轉(zhuǎn)換為如下虛擬指令序列:
生成的ByteCode如圖2b所示,“9D”映射了VpushImm32指令,“9D”后面緊跟著的“00000004”是第一條VpushImm32指令的參數(shù)。其他指令亦是如此:凡是虛擬指令要用到的參數(shù),在此虛擬指令對應的ByteCode后面的數(shù)據(jù)即是參數(shù)。前4條指令是把源操作數(shù)的4個參數(shù)入棧,第5條指令壓入[esp+4]內(nèi)存地址的值,第6條指令是壓入VMContext中的v_eax的偏移,第7條指令取內(nèi)存數(shù)值,壓入當前真實堆棧,第8條指令把當前堆棧值出棧到VMContext中的v_eax。經(jīng)過這一系列的虛擬指令的執(zhí)行,實現(xiàn)了把esp+4對應的內(nèi)存值,賦值給了VMContext中的v_eax。執(zhí)行完mov eax,dword ptr[esp+4]指令后,繼續(xù)執(zhí)行inc eax,虛擬機實際上是把VMContext中的v_eax進行加一操作。虛擬機解釋執(zhí)行完所有ByteCode后,VMContext中的各種虛擬寄存器的值與未經(jīng)虛擬機保護執(zhí)行得到的寄存器的值是相同的。所以,在退出虛擬機時,把虛擬機執(zhí)行得到的VMContext的值一一對應賦值給真實寄存器,這樣才能保證程序繼續(xù)執(zhí)行。總的來說,被保護代碼段被ByteCode轉(zhuǎn)換器轉(zhuǎn)換成ByteCode,虛擬機在解釋執(zhí)行ByteCode的過程中,需要執(zhí)行一系列虛擬指令,才能完成一條原始匯編指令的功能,而一條虛擬指令又是由多條匯編指令組成。因此,把一條原始匯編指令轉(zhuǎn)換為N條匯編指令來執(zhí)行,而且這N條匯編指令邏輯性強,缺一不可,通過這樣的高強度的復雜化,使得逆向還原難度大大增加。
增強型虛擬機軟件保護是針對普通型虛擬機保護的虛擬指令系統(tǒng)做的改進。普通型虛擬指令系統(tǒng)本身并沒有被保護,逆向工程師通過對每一條虛擬指令的功能分析,最終還是可以破解被虛擬機保護的代碼。而作者提出的增強型虛擬機軟件保護融入了兩種技術(shù):一種是虛擬花指令序列,另一種是虛擬指令模糊變換。花指令也稱為偽指令、垃圾指令?;ㄖ噶罴用芗夹g(shù)通過在程序代碼中插入無效指令或不影響原始代碼功能的無用指令來破壞反匯編的結(jié)果和增加代碼分析難度,以達到加密保護的目的[6]。虛擬花指令序列技術(shù)主要是在虛擬機執(zhí)行的虛擬指令序列中加入冗余虛擬指令,用來增加逆向工程師對虛擬機的分析難度。虛擬指令模糊變換技術(shù)是對有效虛擬指令作代碼變換,用來破壞反匯編器的結(jié)果,達到保護代碼的目的。
虛擬花指令序列被執(zhí)行后,它不影響原始虛擬指令序列的執(zhí)行結(jié)果。因此,在設計虛擬花指令序列時,應注意虛擬花指令序列不能改變VMContext中虛擬寄存器的值。為了簡化代碼實現(xiàn),所有的虛擬花指令都不帶操作數(shù)。部分虛擬花指令的實現(xiàn)如圖5所示。
第1、2條虛擬花指令的功能是對VMContext中的v_eax進行出入棧操作,其他虛擬寄存器的出入?;ㄖ噶铑愃朴诘?、2條指令,只是v_eax的值不一樣。第3條是加法花指令,實現(xiàn)方法與普通加法指令相同。
Figure 5 Some virtual junk instructions圖5 部分虛擬花指令
通過簡單的出入棧虛擬花指令、加減法虛擬花指令就可以組合成多種虛擬花指令序列,只要保證不破環(huán)VMContext和堆棧中的值。以下是其中一種虛擬花指令序列的實現(xiàn):
第2、3、4、5條指令是把 VMContext中v_ebx與v_eax的和賦值給v_eax,而第1條指令保存了相加前v_eax的值,執(zhí)行完加法后,第6條指令把相加前的值還原給v_eax,所以經(jīng)過這一系列虛擬花指令的執(zhí)行,并沒有改變虛擬機執(zhí)行的結(jié)果,但是它起到了干擾逆向工程師的作用。以上序列其實是虛擬化了如下花指令:push eax;add eax,ebx;pop eax。
虛擬花指令序列比傳統(tǒng)花指令更具優(yōu)勢,每一種虛擬花指令序列可以放在常規(guī)虛擬指令序列的任何位置。而傳統(tǒng)花指令采用較多的一種形式是無條件跳轉(zhuǎn)指令jmp加花指令,另一種形式是直接程序代碼中的jmp指令后添加花指令[7]。這兩種形式受代碼中jmp指令個數(shù)的限制,如果jmp指令數(shù)太少,則迷惑效果不明顯。
虛擬指令模糊變換是在有效虛擬指令里面加入花指令,又在花指令里面設計一個偽分支,偽分支中加入不可執(zhí)行代碼,通過偽分支來迷惑反匯編器,打亂反匯編結(jié)果,達到保護虛擬指令的目的。反匯編器的工作原理大致有兩種:一種是線性掃描法[8],反匯編器從程序代碼的第一個可執(zhí)行字節(jié)開始,依次逐個地將程序中的二進制代碼反匯編成相應的匯編指令;另一種方法是遞歸掃描法[9],反匯編器沿著程序的指令執(zhí)行控制流來一步一步進行反匯編,將二進制代碼反匯編成相應的匯編指令。在遞歸掃描中,由于反匯編器不會去判斷分支代碼正確與否,它們只是將跳轉(zhuǎn)地址的代碼進行反匯編[9]。因此,如果在虛擬指令中加入一些偽分支,并使得這些偽分支永遠不可能執(zhí)行到,然后在偽分支內(nèi)添加不可執(zhí)行代碼,那么反匯編器很有可能將這些不可執(zhí)行代碼與其后代碼結(jié)合在一起,從而使得反匯編結(jié)果錯誤。虛擬指令模糊變換方法如圖6所示。
Figure 6 Virtual instruction transformation圖6 虛擬指令模糊變換
圖6中VinstructionA為一條虛擬指令,instruction為匯編指令。y的值為非0隨機值,因此這段花指令執(zhí)行cmp指令后,永遠不可能跳轉(zhuǎn)到flag1處執(zhí)行,只會跳轉(zhuǎn)到flag2處執(zhí)行,flag2還原了eax的值,所以這一系列執(zhí)行并沒有影響程序的功能。如果在flag1處添加不可執(zhí)行的亂碼,反匯編器在分析這段代碼時,很有可能將亂碼與其后的代碼結(jié)合在一起,從而使得反匯編結(jié)果出錯。通過這種方法對虛擬指令進行模糊變換,使得反匯編器得不到正確的虛擬指令結(jié)果,逆向工程師很難分析虛擬機的代碼,因此在虛擬機軟件保護方案中,增加虛擬指令模糊變換技術(shù),極大地提高了反逆向、防破解的強度。
硬件環(huán)境:處理器Intel(R)Pentium(R)D CPU 2.8GHz、內(nèi)存4.0GB。
軟件環(huán)境:操作系統(tǒng)32bit Windows 7,反匯編調(diào)試器OllyICE v1.10,普通型虛擬機軟件保護系統(tǒng)BProtect.exe,增強型虛擬機軟件保護系統(tǒng)BProtectPlus.exe,測試用例genfile.exe。
(1)普通型虛擬機保護處理。
使用BProtect.exe對genfile.exe進行虛擬機保護處理,生成genfile_vmp.exe,使用 OllyICE對genfile_vmp.exe進行反匯編調(diào)試,找到VAdd虛擬指令的反匯編結(jié)果,如圖7所示。
(2)增強型虛擬機保護處理。
使用BProtectPlus.exe對genfile.exe進行虛擬機保護處理,生成genfile_vmpplus.exe,使用OllyICE對genfile_vmpplus.exe進行反匯編調(diào)試,找到VAdd虛擬指令的反匯編結(jié)果,如圖8所示,生成的ByteCode如圖9所示,跳轉(zhuǎn)表如圖10所示,虛擬花指令代碼如圖11所示。
Figure 7 VAdd’s disassemble result under normal virtual machine protection圖7 普通型虛擬機保護處理下VAdd的反匯編結(jié)果
Figure 8 VAdd’s disassemble result of improved virtual machine protection圖8 增強型虛擬機保護處理下VAdd的反匯編結(jié)果
Figure 9 ByteCode圖9 ByteCode
Figure 10 Jumping table圖10 跳轉(zhuǎn)表
圖8中畫線部分代碼是增強型虛擬機保護對VAdd虛擬指令進行的模糊變換,粗線部分代碼是模糊變換中的不可執(zhí)行亂碼。從圖8與圖7的對比中可看出,VAdd虛擬指令經(jīng)過模糊變換后,je跳轉(zhuǎn)處的不可執(zhí)行代碼確實與其后的兩條正常指令結(jié)合在一起,第一條被結(jié)合的指令是圖6中花指令中的最后一條pop eax,機器碼為58;第二條被結(jié)合的指令是VAdd虛擬指令中的mov ebx,dword ptr[esp],機器碼為8B1C24。因此,它達到了使反匯編器的反匯編結(jié)果出錯的目的。經(jīng)驗證,模糊變換后的虛擬指令能正常運行,整個程序的運行也正常,并且使用OllyICE的花指令去除插件,也不能將虛擬指令中的花指令去掉。
Figure 11 Virtual junk code圖11 虛擬花指令代碼
而圖7中未經(jīng)過任何改變的VAdd虛擬指令,只有五條匯編指令,很容易被逆向工程師得知此虛擬指令的功能。但是,增強型虛擬機軟件保護技術(shù)融合了虛擬指令模糊變換技術(shù)后,反匯編結(jié)果出錯,使得虛擬指令的破解難度明顯增強。
下面再來分析驗證虛擬花指令序列在虛擬機軟件保護中起的重要作用。在增強型虛擬機軟件保護方案中,增加了虛擬花指令序列,圖9中陰影部分為虛擬花指令序列的ByteCode,根據(jù)3.3節(jié)中虛擬指令地址公式計算得出虛擬花指令的地址。下面驗證虛擬機執(zhí)行時,是否執(zhí)行了新增加的虛擬花指令序列。計算虛擬花指令地址以圖9中陰影部分第一個字節(jié)“25”為例。本次實驗中,公式中的“跳轉(zhuǎn)表地址”為00406000。所以25*4+00406000=00406094,從圖10跳轉(zhuǎn)表中查找00406094處的值為00406636,再從圖11中可以看到,此處對應的虛擬花指令正是RPush_Veax。通過同樣的計算方法可以計算出圖9陰影部分剩下的五個字節(jié)分別對應的虛擬指令是:RPush_Vebx、RPush_Veax、RAdd、RPop_Veax、RPop_Veax。因此,新增加的六個ByteCode碼確實有執(zhí)行,并且按照以上六條虛擬花指令的順序執(zhí)行完,并沒有改變程序的任何結(jié)果,但是增加了虛擬機執(zhí)行的虛擬指令數(shù)量,提高了虛擬機執(zhí)行的復雜度,起到了迷惑逆向工程師的作用。經(jīng)驗證,添加虛擬花指令序列的程序運行正常,而未添加虛擬花指令序列的普通型虛擬機保護強度明顯弱于增強型虛擬機保護。
經(jīng)過以上實驗結(jié)果分析表明,融入了虛擬花指令序列和虛擬指令模糊變換的增強型虛擬機軟件保護強度優(yōu)于普通型虛擬機軟件保護強度。
本文提出了新的增強型虛擬機保護技術(shù),融入了虛擬花指令序列與虛擬指令模糊變換,前者通過一系列不影響程序功能的虛擬指令序列,干擾逆向工程師的分析效率;后者通過對虛擬指令構(gòu)造不可到達的偽分支,使得反匯編器解析虛擬指令時,把偽分支的亂碼與其后的正常代碼結(jié)合在一起,從而造成反匯編結(jié)果錯誤。這樣從兩個方面增加了反逆向的難度,達到進一步保護軟件的目的。
實驗結(jié)果也表明了新方法的有效性,能夠在保持正確性的同時增加逆向分析的難度。下一步工作將研究多種變換策略,使得每條虛擬指令盡量使用不同的變換策略,從而進一步增加破解難度,達到最大化保護軟件的目的。
[1] Tang Zhan-yong,Wang Huai-jun,F(xiàn)ang Ding-yi,et al.Research on software protection RISC-based virtual machine technology[J].Microelectronics &Computer,2011,28(8):1-3.(in Chinese)
[2] Bughoho.Virtual machine technology subject argumentation[EB/OL]. [2007-07-07]. http://bbs.pediy.com/showthread.php?t=47633&tcatid=60.(in Chinese)
[3] Shu Bo-cheng,Li Yi-chao,Cao Yue,et al.Research on software protection based on virtual machine[J].Computer Engineering &Science,2008,30(A1):25-28.(in Chinese)
[4] Duan Gang.Encrypt and decrypt[M].Beijing:Publishing House of Electronics Industry,2008.(in Chinese)
[5] Li Lu,Liu Qiu-ju,Xu Ting-rong.On unpacking technology for PE files[J].Computer Applications and Software,2010,27(9):279-282.(in Chinese)
[6] Wang Hai-ping,Cao Lin,Sun Guo-zhi,et al.Study of stochastic junk code encryption algorithm [J].Journal of Computer Applications,2006,26(2):338-340.(in Chinese)
[7] Sun Guo-zi,Cai Qiang,Cheng Dan-wei,et al.Study on encryption algorithm of sub-function junk code[J].Computer Engineering and Applications,2009,45(3):130-132.(in Chinese)
[8] Kruegel C,Robertson W,Valeur F,et al.Static disassembly of obfuscated binaries[C]∥Proc of the 13th Conference on USENIX Security Symposium,2004:18.
[9] Schwarz B,Debray S,Andrews G.Disassemble of executable code revisited[C]∥Proc of the 9th Working Conference on Reverse Engineering,2002:45-54.
附中文參考文獻:
[1] 湯戰(zhàn)勇,王懷軍,房鼎益,等.基于精簡指令集的軟件保護虛擬機技術(shù)研究與實現(xiàn)[J].微電子學與計算機,2011,28(8):1-3.
[2] Bughoho.虛擬機技術(shù)專題討論[EB/OL].[2007-07-07].http://bbs.pediy.com/showthread.php?t=47633&tcatid=60.
[3] 舒柏程,李毅超,曹躍,等.基于虛擬機的軟件保護技術(shù)研究[J].計算機工程與科學,2008,30(A1):25-28.
[4] 段鋼.加密與解密[M].北京:電子工業(yè)出版社.2008.
[5] 李露,劉秋菊,徐汀榮.PE文件中脫殼技術(shù)的研究[J].計算機應用與軟件,2010,27(9):279-282.
[6] 王海平,曹林,孫國梓,等.隨機花指令加密算法研究[J].計算機應用,2006,26(2):338-340.
[7] 孫國梓,蔡強,陳丹偉.子程序花指令加密算法研究[J].計算機工程與應用,2009,45(3):130-132.
Software protection technique based on improved virtual machine
WU Wei-min,XU Wen-feng,LIN Zhi-yi,SI Si,RUAN Yi-bang
(Faculty of Computer,Guangdong University of Technology,Guangzhou 510006,China)
For the increasingly serious software protection problem,the software protection technique based on virtual machine is analyzed,studied and improved,and thus a new software protection technique based on improved virtual machine is proposed.The proposal uses virtual junk code sequence and virtual instruction transformation technique,improves the virtual instruction system of original virtual machine,and hence increases complexity and confusion for virtual machine execution and has the advantages of high anti-reversing,tamper-proof and anti cracking.Experimental analysis proves that the improved virtual machine protection technique outperforms other virtual machine protection techniques.
virtual machine;software protection;virtual junk code;fuzy transform
TP309
A
10.3969/j.issn.1007-130X.2014.04.015
2012-09-26;
2013-01-28
通訊地址:510006廣東省廣州市番禺區(qū)廣州大學城外環(huán)西路100號廣東工業(yè)大學計算機學院
Address:Faculty of Computer,Guangdong University of Technology,100Waihuan Rd West,Guangzhou Higher Education Mega
Center,Panyu District,Guangzhou 510006,Guangdong,P.R.China
1007-130X(2014)04-0655-07
吳偉民(1956-),男,廣東深圳人,教授,研究方向為數(shù)據(jù)結(jié)構(gòu)和算法,可視計算,編譯和虛擬機技術(shù),智能系統(tǒng)。E-mail:wuwm@gdut.edu.cn
WU Wei-min,born in 1956,professor,his research interests include data structure and algorithm,visual computing,compiler and virtual machine technology,and intelligent system.
許文鋒(1985-),男,湖南永興人,碩士,研究方向為軟件保護技術(shù)。E-mail:154529332@qq.com
XU Wen-feng,born in 1985,MS,his research interest includes software protection technology.
林志毅(1981-),男,福建連江人,博士,講師,研究方向為自然計算和模式識別。E-mail:16045411@qq.com
LIN Zhi-yi,born in 1981,PhD,lecturer,his research interests include natural computing,and pattern recognition.
司斯(1987-),男,甘肅天水人,碩士,研究方向為數(shù)據(jù)結(jié)構(gòu)和算法。E-mail:Sisi563846762@163.com
SI Si,born in 1987,MS,his research interests include data structure,and algorithm.
阮奕邦(1991-),男,廣東陽江人,研究方向為軟件保護技術(shù)。E-mail:ruanyibang@qq.com
RUAN Yi-bang,born in 1991,his research interest includes software protection technology.