自適應(yīng)混淆的虛擬的制造方法
【專利摘要】本發(fā)明能夠產(chǎn)生用于在自適應(yīng)VM執(zhí)行環(huán)境中執(zhí)行的混淆的字節(jié)碼。VM編譯器編譯高級(jí)代碼以獲得字節(jié)碼15b,并且應(yīng)用V-ISA定義以在字節(jié)碼中產(chǎn)生組合兩個(gè)或更多的單獨(dú)的指令的優(yōu)化的指令。VM執(zhí)行環(huán)境適于解釋并執(zhí)行所述優(yōu)化的指令。
【專利說明】自適應(yīng)混淆的虛擬機(jī)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及虛擬機(jī),更具體地,本發(fā)明涉及用于在虛擬機(jī)環(huán)境中運(yùn)行混淆的軟件的技術(shù)。
【背景技術(shù)】
[0002]指令集或者指令集架構(gòu)(ISA)是與編程相關(guān)的計(jì)算機(jī)架構(gòu)的一部分,包括本地?cái)?shù)據(jù)類型、指令、寄存器、尋址模式、存儲(chǔ)器架構(gòu)、中斷和異議處理以及外部I/o。ISA包括操作碼(機(jī)器語言)的集合的規(guī)范以及由特別的處理器實(shí)施的本地命令。
[0003]指令集架構(gòu)區(qū)別于微架構(gòu),所述微架構(gòu)是用來實(shí)施指令集的一組處理器設(shè)計(jì)技術(shù)。具有不同的微架構(gòu)的計(jì)算機(jī)可以共享共同的指令集。例如,Intel Pentium和AMDAthlon實(shí)施幾乎完全相同版本的x86指令集,但具有不同的內(nèi)部設(shè)計(jì)。
[0004]TIMI (技術(shù)無關(guān)的機(jī)器接口)是擴(kuò)展ISA的可能性的技術(shù)的示例。TIMI是由低級(jí)軟件實(shí)施的ISA,且功能上類似當(dāng)前被稱作虛擬機(jī)(VM)的東西,所述低級(jí)軟件將--ΜΙ碼翻譯為“本地”機(jī)器代碼。它被設(shè)計(jì)為增加計(jì)算機(jī)平臺(tái)以及為它所編寫的應(yīng)用的壽命,從而允許整個(gè)平臺(tái)被移動(dòng)至十分不同的硬件而不必修改任何軟件,例外是其將TIMI翻譯為本地機(jī)器代碼以及實(shí)施由所產(chǎn)生的本地代碼使用的服務(wù)的代碼。這允許軟件從例如復(fù)雜指令集計(jì)算機(jī)(CISC)架構(gòu)移動(dòng)至精簡指令集計(jì)算(RISC)架構(gòu),而除了前述的低級(jí)代碼以外不必重新寫入或重新編譯與它相關(guān)聯(lián)的軟件或OS的任何部分。
[0005]VM是機(jī)器的(即計(jì)算 機(jī)的)軟件實(shí)現(xiàn),其執(zhí)行如物理機(jī)器的程序。VM可以基于它們的使用以及與任何真實(shí)的機(jī)器的對(duì)應(yīng)程度分為兩大主要類別。系統(tǒng)VM提供完整的系統(tǒng)平臺(tái),所述系統(tǒng)平臺(tái)支持完整的操作系統(tǒng)(OS)的執(zhí)行。進(jìn)程VM被設(shè)計(jì)為運(yùn)行單個(gè)程序,這意味著它支持單個(gè)進(jìn)程。通常,在VM內(nèi)部運(yùn)行的軟件被限制到由VM提供的資源和抽象。
[0006]系統(tǒng)VM (也稱作硬件VM)允許在不同的VM之間共享底層物理機(jī)器資源,每個(gè)VM運(yùn)行它自己的操作系統(tǒng)。提供虛擬化的軟件層被稱作VM監(jiān)督程序或管理程序。管理程序可以在裸硬件上運(yùn)行(類型I或本地VM),或者在操作系統(tǒng)之上運(yùn)行(類型2或托管VM)。
[0007]進(jìn)程VM (也稱作應(yīng)用VM)作為在OS內(nèi)的普通應(yīng)用運(yùn)行,并且支持單個(gè)進(jìn)程。它通常當(dāng)進(jìn)程開始時(shí)被創(chuàng)建,并且當(dāng)所述進(jìn)程退出時(shí)被消滅。它的目的是提供平臺(tái)獨(dú)立的編程環(huán)境,所述編程環(huán)境提取掉底層硬件或操作系統(tǒng)的細(xì)節(jié),并且允許程序在任何平臺(tái)上以相同的方式執(zhí)行。進(jìn)程VM提供高級(jí)抽象,即,高級(jí)編程語言的抽象(與系統(tǒng)VM的低級(jí)ISA抽象相比)。進(jìn)程VM使用解釋器來實(shí)施。進(jìn)程VM的示例是用于Java編程語言應(yīng)用的Java虛擬機(jī)、用作針對(duì)數(shù)個(gè)解釋語言的抽象層的Parrot虛擬機(jī)、以及用于運(yùn)行.NET框架應(yīng)用的通用語言運(yùn)行時(shí)VM。
[0008]公知的處理器架構(gòu)是在操作速度、代碼大小以及功耗之間權(quán)衡的優(yōu)化。所述權(quán)衡取決于處理器作為目標(biāo)的應(yīng)用的類型。這已經(jīng)導(dǎo)致相當(dāng)大的數(shù)目的處理器架構(gòu),每一個(gè)具有獨(dú)特的指令集。如果應(yīng)用將在各種各樣的計(jì)算設(shè)備的網(wǎng)絡(luò)上可用,由此潛在地具有許多不同的處理器,則所述應(yīng)用需要克服移植性難題。[0009]在開發(fā)時(shí)期,VM可以用來實(shí)現(xiàn)與實(shí)際硬件環(huán)境的完全獨(dú)立性,在所述硬件上將部署軟件程序。因?yàn)樗鰬?yīng)用僅需要在單個(gè)VM上被測試,所以這改善了開發(fā)效率。在各種目標(biāo)平臺(tái)上的VM解釋器負(fù)責(zé)硬件依賴性。
[0010]可以區(qū)分實(shí)施指令集架構(gòu)(1-1SA)和虛擬指令集架構(gòu)(ν-1SA),所述實(shí)施指令集架構(gòu)(Ι-1SA)即由硬件實(shí)施的實(shí)際ISA,所述虛擬指令集架構(gòu)(V-1SA)即呈現(xiàn)給軟件的虛擬的ISA。VM是調(diào)解兩者的專門的不可移植的應(yīng)用。為了在特定平臺(tái)上執(zhí)行基于V-1SA的可移植的應(yīng)用,必須首先使用這樣的平臺(tái)的特定1-1SA來構(gòu)造并測試所述VM。
[0011]在圖1中,示出了軟件在ι-1SA計(jì)算機(jī)環(huán)境中可以如何與硬件交互的示例。將硬件和軟件組件的堆疊可視化,其中,所述堆疊的相鄰層是通信地連接的。硬件處理器I使用由1-1SA層2定義的處理器特定的指令集與軟件層3交互,并且可能與軟件層4、5和6交互。在圖1的示例中,軟件層3、4、5和6分別包含設(shè)備驅(qū)動(dòng)程序代碼、內(nèi)核代碼、操作系統(tǒng)代碼以及應(yīng)用軟件。
[0012]在圖2a中,示出了軟件在實(shí)施系統(tǒng)VM的V-1SA計(jì)算機(jī)環(huán)境中可以如何與硬件交互的示例。將硬件和軟件組件的堆疊可視化,其中,所述堆疊的相鄰層是通信地連接的。硬件處理器I通過由1-1SA層2定義的處理器特定的指令集與VM7交互。VM7將處理器特定的指令翻譯為如由V-1SA層8定義的虛擬指令集。VM7使用由V-1SA層8定義的虛擬指令集與軟件層3交互,并且可能與軟件層4、5和6交互。在圖2a的示例中,軟件層3、4、5和6分別包含設(shè)備驅(qū)動(dòng)程序代碼、內(nèi)核代碼、操作系統(tǒng)代碼以及應(yīng)用軟件。
[0013]在圖2b中,示出了軟件在實(shí)施進(jìn)程VM的V-1SA計(jì)算機(jī)環(huán)境中可以如何與硬件交互的示例。將硬件和軟件組件的堆疊可視化,其中,所述堆疊的相鄰層是通信地連接的。硬件處理器I使用由1-1SA層2定義的處理器特定的指令集與軟件層3交互,并且可能與軟件層4和5交互。在圖2b的示例中,軟件層3、4和5分別包含設(shè)備驅(qū)動(dòng)程序代碼、內(nèi)核代碼以及操作系統(tǒng)代碼。操作系統(tǒng)代碼5使用OS特定的API與VM7交互。可選擇地或可替換地,硬件處理器I通過由1-1SA層2定義的處理器特定的指令集與VM7交互。VM7將OSAPI和/或處理器特定的指令翻譯為如由V-1SA層8定義的虛擬指令集。VM7使用由V-1SA層8定義的虛擬指令集與應(yīng)用軟件6交互。
[0014]類似于硬件處理器架構(gòu),VM在它們的核心架構(gòu)上根據(jù)設(shè)計(jì)目標(biāo)的高級(jí)屬性而不同,諸如例如對(duì)即時(shí)(JIT)編譯的傾向、穩(wěn)健性和面向?qū)ο蟆Mǔ?,VM設(shè)計(jì)是精簡的。V-1SA通常類似最簡單種類的1-1SA (例如,RISC),從而在應(yīng)用方面增加它們的靈活性,所述應(yīng)用可以在它們上運(yùn)行,并且限制將VM傳送到另一個(gè)1-1SA的努力。
[0015]VM公知為用作防范軟件反向工程的安全措施。這樣的VM可以使用未入文獻(xiàn)的且可能多元化的指令集或者針對(duì)對(duì)手提供額外的障礙的混淆技術(shù)。VM設(shè)計(jì)公知為支持非傳統(tǒng)的指令以挫敗靜態(tài)分析企圖。
[0016]混淆技術(shù)的目的一般地在于在使軟件的最終表示難以理解的同時(shí)維持原始軟件片的語義。
[0017]因?yàn)榇蟛糠周浖惴ㄒ砸恍└呒?jí)編程語言的形式表達(dá),所以編譯為機(jī)器級(jí)(針對(duì)一些定義的機(jī)器)的簡單動(dòng)作可以被認(rèn)為是本身混淆的形式,尤其當(dāng)采用深度優(yōu)化時(shí)。
[0018]很大一部分公知的混淆技術(shù)在機(jī)器級(jí),例如,直接在Java字節(jié)碼上或在x86平臺(tái)上操作。更有效的混淆技術(shù)在最高可能的抽象層操作,以便完全地開發(fā)上下文的信息。這樣高級(jí)的混淆技術(shù)當(dāng)它們依賴難以簡化的應(yīng)用至程序數(shù)據(jù)和控制流程兩者的數(shù)學(xué)構(gòu)造時(shí)特別有效。高級(jí)的混淆技術(shù)實(shí)現(xiàn)它們的混淆屬性,而不依賴一個(gè)或多個(gè)目標(biāo)處理器的特性。
[0019]用于實(shí)施程序的高級(jí)混淆的設(shè)備被稱作代碼轉(zhuǎn)換器。代碼轉(zhuǎn)換器通常以高級(jí)編程語言將源代碼轉(zhuǎn)換為源代碼的混淆的變體,所述高級(jí)編程語言可以與原始源代碼的編程語言相同。
[0020]混淆的程序的測試目的在于驗(yàn)證混淆的應(yīng)用實(shí)施與原始的程序相同的功能。用于不同的目標(biāo)機(jī)器的編譯器可以產(chǎn)生與原始的應(yīng)用表現(xiàn)得不同的代碼。因此有必要針對(duì)每個(gè)目標(biāo)平臺(tái)執(zhí)行功能測試。在嵌入式軟件應(yīng)用中,潛在地存在許多不同的目標(biāo)平臺(tái),每個(gè)平臺(tái)具有不同的指令集和不同的編譯器工具鏈。
[0021]可以理解的是,編譯可以包括鏈接。
[0022]為了減少所要求的測試運(yùn)行的數(shù)目,公知的是,可以編譯混淆的源代碼以在VM上運(yùn)行。圖3示出了用于與VM—起使用的現(xiàn)有技術(shù)的工具鏈的示例。工具鏈?zhǔn)境隽擞纱a轉(zhuǎn)換器12a將源代碼11轉(zhuǎn)換為源代碼的混淆的版本13a的步驟。由VM編譯器14a根據(jù)VM的V-1SA將源代碼的混淆的版本13a編譯為字節(jié)碼15a,即混淆的邏輯的表示。字節(jié)碼15a在VM執(zhí)行環(huán)境16a中是可執(zhí)行的。
[0023]通過使用工具鏈中的VM,可以避免需要多條工具鏈來將源代碼11轉(zhuǎn)換為用于特定1-1SA的混淆的字節(jié)碼。
[0024]代碼轉(zhuǎn)換器12a使用混淆工具集以將源代碼11轉(zhuǎn)換為源代碼的混淆的版本13a?;煜ぞ呒ǔ0蔀樘貏e的應(yīng)用激活的混淆技術(shù)的集合。
[0025]程序的高級(jí)混淆當(dāng)在目前狀況的指令集上執(zhí)行且針對(duì)目前狀況的指令集進(jìn)行編譯時(shí)一般導(dǎo)致性能上的顯著降低以及代碼大小上的增加。VM技術(shù)的使用進(jìn)一步降低了性能,尤其當(dāng)VM不支持諸如提前(AOT)或即時(shí)(JIT)編譯之類的優(yōu)化技術(shù)時(shí)。因此,高級(jí)混淆技術(shù)和公知的VM技術(shù)的組合導(dǎo)致性能上的戲劇性的降低。需要不遭受上述性能缺點(diǎn)的用于在VM環(huán)境中運(yùn)行混淆的軟件的改善的技術(shù)。
【發(fā)明內(nèi)容】
[0026]本發(fā)明能夠產(chǎn)生用于在自適應(yīng)VM執(zhí)行環(huán)境中執(zhí)行的字節(jié)碼。
[0027]根據(jù)本發(fā)明的一個(gè)方面,提出了一種用于產(chǎn)生用于在VM執(zhí)行環(huán)境中執(zhí)行的字節(jié)碼的計(jì)算機(jī)實(shí)施的方法。所述方法包括:由VM編譯器編譯高級(jí)代碼以獲得字節(jié)碼15b。所述編譯包括應(yīng)用V-1SA定義以在字節(jié)碼15b中產(chǎn)生組合兩個(gè)或更多的單獨(dú)的指令的優(yōu)化的指令。VM執(zhí)行環(huán)境適于解釋并執(zhí)行優(yōu)化的指令。
[0028]因此,可以產(chǎn)生混淆的字節(jié)碼,所述混淆的字節(jié)碼在VM中運(yùn)行,所述VM特別地適于混淆的字節(jié)碼。通過包括由VM執(zhí)行環(huán)境識(shí)別的在字節(jié)碼中的優(yōu)化的指令來實(shí)現(xiàn)性能增益。即,將單一(復(fù)雜)的指令解釋并映射到本地指令的序列,去除了從VM的虛擬堆棧中讀出中間值以及將中間值寫入VM的虛擬堆棧的需要。
[0029]高級(jí)代碼是例如源代碼的混淆版本或者包括復(fù)雜語義的任何其它形式的高級(jí)代碼。
[0030]權(quán)利要求2的實(shí)施例有利地使字節(jié)碼的混淆能夠以高級(jí)中間代碼被準(zhǔn)備。
[0031]高級(jí)中間代碼是例如源代碼的混淆版本或者包括復(fù)雜語義的任何其它形式的高級(jí)中間代碼。
[0032]權(quán)利要求3的實(shí)施例有利地使復(fù)雜的指令能夠在轉(zhuǎn)換階段被定義,所述轉(zhuǎn)換階段使高級(jí)中間代碼能夠包含復(fù)雜的指令,并且使自適應(yīng)產(chǎn)生的VM執(zhí)行環(huán)境能夠識(shí)別所述復(fù)雜的指令。
[0033]權(quán)利要求4的實(shí)施例有利地使代碼轉(zhuǎn)換器和VM編譯器的功能能夠被組合在單一模塊中,并且使它的功能能夠被組合在組合的進(jìn)程中。
[0034]權(quán)利要求5的實(shí)施例有利地使自適應(yīng)VM執(zhí)行環(huán)境能夠被動(dòng)態(tài)地產(chǎn)生。此外,它允許用于產(chǎn)生字節(jié)碼的混淆和/或V-1SA被及時(shí)改變,在這種情況下,將重新產(chǎn)生VM執(zhí)行環(huán)境以遵守改變的字節(jié)碼。
[0035]權(quán)利要求6的實(shí)施例有利地使自適應(yīng)VM執(zhí)行環(huán)境能夠當(dāng)需要它時(shí)被產(chǎn)生并準(zhǔn)備好,即使V-1SA頻繁地改變。
[0036]權(quán)利要求7的實(shí)施例有利地使自適應(yīng)VM執(zhí)行環(huán)境能夠當(dāng)需要它時(shí)被產(chǎn)生并準(zhǔn)備好,而沒有使用產(chǎn)生VM執(zhí)行環(huán)境的處理能力。
[0037]根據(jù)本發(fā)明的進(jìn)一步的方面,提出了如用在上述方法中的一個(gè)或多個(gè)中使用的代碼轉(zhuǎn)換器、VM編譯器、代碼轉(zhuǎn)換器-編譯器、VM源代碼產(chǎn)生器以及目標(biāo)編譯器。
[0038]根據(jù)本發(fā)明的一個(gè)方面,提出了計(jì)算機(jī)程序元件,其當(dāng)由處理器執(zhí)行時(shí)適于執(zhí)行上述方法中的一個(gè)或多個(gè)。
[0039]在下文中,將進(jìn)一步詳細(xì)地描述本發(fā)明的實(shí)施例,然而,應(yīng)當(dāng)理解的是,這些實(shí)施例不可以被解釋為限制本發(fā)明的保護(hù)范圍。
【專利附圖】
【附圖說明】
[0040]將通過參考附圖中示出的示例性實(shí)施例來更詳細(xì)地解釋本發(fā)明的各方面,在所述附圖中:
圖1示出了在現(xiàn)有技術(shù)的1-1SA計(jì)算機(jī)環(huán)境中的硬件和軟件組件的堆疊的表示的示
例;
圖2a示出了在現(xiàn)有技術(shù)的實(shí)施系統(tǒng)VM的V-1SA計(jì)算機(jī)環(huán)境中的硬件和軟件組件的堆疊的表示的示例;
圖2b示出了在現(xiàn)有技術(shù)的實(shí)施進(jìn)程VM的V-1SA計(jì)算機(jī)環(huán)境中的硬件和軟件組件的堆疊的表示的示例;
圖3示出了現(xiàn)有技術(shù)的帶有中間結(jié)果的工具鏈的示例;
圖4示出了本發(fā)明的示例性實(shí)施例的帶有中間結(jié)果的工具鏈;以及 圖5示出了本發(fā)明的示例性實(shí)施例的帶有中間結(jié)果的另一個(gè)工具鏈。
【具體實(shí)施方式】
[0041]本發(fā)明通過使V-1SA的所選的虛擬指令集適應(yīng)于由實(shí)施高級(jí)混淆技術(shù)的代碼轉(zhuǎn)換器產(chǎn)生的代碼和數(shù)據(jù)轉(zhuǎn)換來減少高級(jí)混淆的軟件應(yīng)用的虛擬機(jī)執(zhí)行的損失。
[0042]本發(fā)明不同于諸如提前(AOT)和即時(shí)(JIT)編譯之類的其它優(yōu)化技術(shù)?,F(xiàn)存的優(yōu)化在指令級(jí)操作,并且通常優(yōu)化(一組)指令的執(zhí)行。本發(fā)明使得能夠在源代碼級(jí)進(jìn)行優(yōu)化,其中,更抽象的信息可以用來增加性能。此外,使用A0T/JIT編譯器是困難且昂貴的技術(shù),因?yàn)槊總€(gè)平臺(tái)不僅需要簡單且可移植的VM解釋器以將V-1SA協(xié)調(diào)至1-1SA,而且需要按比例縮小的使特定1-1SA的知識(shí)嵌入的本地編譯器。
[0043]本發(fā)明創(chuàng)建虛擬指令集以作為一組復(fù)雜的特別代碼構(gòu)造,所述特別代碼構(gòu)造是特定混淆和數(shù)據(jù)轉(zhuǎn)換技術(shù)所固有的,所述特定混淆和數(shù)據(jù)轉(zhuǎn)換技術(shù)實(shí)現(xiàn)了更深一級(jí)的混淆?;煜夹g(shù)將代碼轉(zhuǎn)換應(yīng)用至軟件應(yīng)用的高級(jí)表示(例如,它的源代碼)。這帶來功能上相同但非常難以進(jìn)行反向工程的軟件的混淆的高級(jí)表示。然后,針對(duì)V-1SA,即意在執(zhí)行代碼所處的平臺(tái),編譯混淆的高級(jí)表示(例如,混淆的源代碼)。
[0044]可以針對(duì)額外的保護(hù)應(yīng)用機(jī)器級(jí)的進(jìn)一步的混淆。一般接受的是,與單獨(dú)的低級(jí)混淆相比,高級(jí)混淆可以抵抗大得多的攻擊種類。通常用于高級(jí)混淆的數(shù)學(xué)構(gòu)造的示例是仿射轉(zhuǎn)換、多項(xiàng)式轉(zhuǎn)換、矩陣轉(zhuǎn)置以及混合布爾代數(shù)邏輯。
[0045]根據(jù)本發(fā)明選擇了特別的(虛擬機(jī))指令集,其有效地支持了由高級(jí)混淆技術(shù)產(chǎn)生的源代碼。解釋器可以使這樣的知識(shí)嵌入并將模式映射入有效且緊湊的指令執(zhí)行。
[0046]這樣的映射可以要么是靜態(tài)的,意味著其在構(gòu)建用于給定的平臺(tái)的虛擬機(jī)的時(shí)候已經(jīng)被建立,要么是動(dòng)態(tài)的,意味著在第二階段已經(jīng)傳遞了關(guān)于這樣的映射的信息,并且已經(jīng)在機(jī)車(loco)中產(chǎn)生相關(guān)的機(jī)器指令序列。雖然第一種方法更干脆且不依賴在運(yùn)行時(shí)間的任何形式的字節(jié)碼翻譯,但是第二種方法為虛擬指令集的動(dòng)態(tài)多元化打開了通道。例如,虛擬指令集可以對(duì)于每個(gè)應(yīng)用不同,或者可以在單個(gè)應(yīng)用的執(zhí)行期間改變。
[0047]除了低開銷的解釋執(zhí)行之外,本發(fā)明有利地使整體安全級(jí)別提高。
[0048]圖4示出了本發(fā)明的示例性實(shí)施例的用于實(shí)施自適應(yīng)混淆的VM的工具鏈。工具鏈?zhǔn)境隽巳缦虏襟E:由代碼轉(zhuǎn)換器12b將源代碼11轉(zhuǎn)換為高級(jí)中間代碼13b。由VM編譯器14b根據(jù)VM的V-1SA將高級(jí)中間代碼13b編譯為字節(jié)碼15b,即混淆的邏輯的表示。將會(huì)理解的是,編譯可以包括鏈接。字節(jié)碼15b可以在VM執(zhí)行環(huán)境16b中執(zhí)行。代碼轉(zhuǎn)換器12b使用混淆工具集以將源代碼11轉(zhuǎn)換為高級(jí)中間代碼13b?;煜ぞ呒ǔ0梢詾樘貏e的應(yīng)用激活的混淆技術(shù)的集合。
[0049]高級(jí)中間代碼13b是例如源代碼的混淆版本或者包括復(fù)雜語義的任何其它形式的高級(jí)中間代碼。
[0050]代碼轉(zhuǎn)換器12b是如圖3所示的代碼轉(zhuǎn)換器12a的修改版本。在高級(jí)混淆分析期間,代碼轉(zhuǎn)換器12b確定VM執(zhí)行環(huán)境16b的V-1SA,其中,針對(duì)用于將源代碼11轉(zhuǎn)換為高級(jí)中間代碼13b的混淆技術(shù)來優(yōu)化V-1SA。更準(zhǔn)確地說,特定指令可以被包括在V-1SA中以執(zhí)行復(fù)雜混淆構(gòu)造(的至少一部分),其否則將需要幾種類屬指令。由代碼轉(zhuǎn)換器12b產(chǎn)生定義由此確定的V-1SA的V-1SA定義21。
[0051]因?yàn)槿魏沃噶畹慕忉尵哂谢旧瞎潭ǖ拈_銷,即,復(fù)雜混淆構(gòu)造的解釋具有與類屬指令的解釋基本上相同的開銷,所以執(zhí)行效率借助如下事實(shí)來增加:減少了高級(jí)中間代碼13b中的指令的總數(shù)目。
[0052]V-1SA定義21通常包括機(jī)器定義(例如,定義寄存器和存儲(chǔ)器模型),指令編碼(用來構(gòu)建VM解釋器中的分析程序以及VM工具鏈中的匯編程序)以及指令語義(用來構(gòu)建VM解釋器中的指令處理程序以及編譯器中的指令選擇器/調(diào)度器)。
[0053]VM編譯器14b使用V-1SA定義21,以使用規(guī)定的指令集格式產(chǎn)生字節(jié)碼15b。
[0054]VM源代碼產(chǎn)生器22從V-1SA定義21中產(chǎn)生VM源代碼23。將VM源代碼產(chǎn)生器22設(shè)計(jì)為VM源代碼23,使得其可與與寬范圍的目標(biāo)平臺(tái)兼容。
[0055]目標(biāo)編譯器24將VM源代碼23編譯為VM解釋器代碼25,即使用硬件的1-1SA的VM的表示,所述VM是在所述硬件上操作的。運(yùn)行VM解釋器代碼25創(chuàng)建用于執(zhí)行字節(jié)碼15b的VM執(zhí)行環(huán)境16b。
[0056]因?yàn)榇a轉(zhuǎn)換器12b產(chǎn)生有效地映射至關(guān)聯(lián)的V-1SA定義21的高級(jí)中間代碼13b,所以VM編譯器14b可以構(gòu)建在執(zhí)行中緊湊且快速的字節(jié)碼15b。由此實(shí)現(xiàn)了混淆的源代碼基元的更有效的執(zhí)行。
[0057]代碼轉(zhuǎn)換器12b可以以各種方式確定VM執(zhí)行環(huán)境16b的V-1SA。
[0058]在示例性的實(shí)施例中,代碼轉(zhuǎn)換器12b的代碼轉(zhuǎn)換器邏輯以及混淆工具集被配置為具有在整個(gè)V-1SA上的受限的影響。在該示例性實(shí)施例中,機(jī)器定義(例如,它是基于堆棧還是基于寄存器的,字大小、存儲(chǔ)器存取邏輯、系統(tǒng)調(diào)用和異常機(jī)制以及算數(shù)標(biāo)志)和一般編碼規(guī)則(例如,指令大小、尋址模式以及即刻(immediates))被固定,尤其是被優(yōu)化,使得解釋引起低的開銷,并且因此不取決于使用哪些混淆構(gòu)造。V-1SA包括在常規(guī)的V-1SA中也可以找到的基本的一般指令。雖然這些指令因?yàn)樘囟ㄇ覐?fù)雜的指令是優(yōu)選的而可能最終不包含在V-1SA形式的混淆的應(yīng)用中,但是它們在它們提供一定程度的靈活性方面仍是有用的。受代碼轉(zhuǎn)換器12b特別地影響的V-1SA的部分是復(fù)雜指令部分。由混淆工具集使能的每個(gè)特別的混淆方法可以定義并被關(guān)聯(lián)到一個(gè)指令。當(dāng)代碼轉(zhuǎn)換器12b選擇特別的方法時(shí),它也保證對(duì)應(yīng)的V-1SA定義輸出21包括所述關(guān)聯(lián)的指令。
[0059]在另一個(gè)示例性的實(shí)施例中,代碼轉(zhuǎn)換器12b的代碼轉(zhuǎn)換器邏輯以及混淆工具集可以被配置用于更復(fù)雜的方法,所述方法根據(jù)由代碼轉(zhuǎn)換器12b選擇的混淆邏輯包含虛擬機(jī)定義中的改變、指令編碼以及基本指令集。
[0060]由代碼轉(zhuǎn)換器12b產(chǎn)生的V-1SA定義21在它可以支持的指令的數(shù)目方面不受限。因?yàn)橹噶畈檎乙话闶遣檎也僮鳎圆淮嬖谠诰幋a優(yōu)化方面的真實(shí)的好處,雖然不排除編碼優(yōu)化的發(fā)生。
[0061]V-1SA定義21被用作創(chuàng)建VM執(zhí)行環(huán)境16b的基礎(chǔ)。V-1SA定義21以能夠產(chǎn)生高級(jí)編程語言構(gòu)造的格式規(guī)定了針對(duì)特別的V-1SA組件的動(dòng)作,所述高級(jí)編程語言構(gòu)造實(shí)施受所述組件控制的動(dòng)作。
[0062]編譯器14b被配置為支持V-1SA定義21,以便從高級(jí)中間代碼13b中產(chǎn)生字節(jié)碼15b。因?yàn)楝F(xiàn)存的編譯器工具通常支持多指令集,并且如果不太復(fù)雜所述現(xiàn)存的編譯器工具由此可以被配置為使用V-1SA定義,所以可以使用所述現(xiàn)存的編譯器工具。指令集一般被包括在編譯器的后端中。例如,GNU編譯器內(nèi)部地針對(duì)正被編譯的應(yīng)用使用后端獨(dú)立的中間表示(IR),并且使用目標(biāo)特定代碼產(chǎn)生器以針對(duì)目標(biāo)機(jī)器選擇優(yōu)化的序列指令。
[0063]如果V-1SA定義包含IR內(nèi)不容易識(shí)別的復(fù)雜指令,則不可以使用現(xiàn)存的編譯器,并且需要修改的編譯器。
[0064]如圖5所示,代碼轉(zhuǎn)換器12b和VM編譯器14b可以被組合在代碼轉(zhuǎn)換器-編譯器模塊17中。然后,在組合的代碼轉(zhuǎn)換-編譯進(jìn)程中執(zhí)行源代碼11的轉(zhuǎn)換以及高級(jí)中間代碼13b的編譯。V-1SA定義21由代碼轉(zhuǎn)換器-編譯器模塊17產(chǎn)生,并且由代碼轉(zhuǎn)換器-編譯器模塊17內(nèi)部地用在編譯步驟中。
[0065]以下的示例示出了軟件程序的簡單的源代碼,所述軟件程序被混淆,并接著被映射到V-1SA。與現(xiàn)有技術(shù)的VM方法進(jìn)行比較,以展示不同和性能增益。使用Java標(biāo)記法,但是可以理解的是,本發(fā)明不限于Java源代碼。
[0066]以下的源代碼11提供了從值i = 5開始的計(jì)數(shù)器,以I的步進(jìn)遞增所述計(jì)數(shù)器。如果到達(dá)j = 6的閾值,則執(zhí)行動(dòng)作。為了保持該示例簡單的目的,沒有進(jìn)一步規(guī)定所述動(dòng)作,并且所述動(dòng)作由“做某事”識(shí)別。
public static void main(String[] args) {
int i, j;
i = 5;
j = increment(i);
if (j == 6) {
//做某事
}
}
public static int increment(int i){
return i + I
}
將源代碼11輸入到代碼轉(zhuǎn)換器12b中。代碼轉(zhuǎn)換器12b的混淆工具集定義以下的至遞增函數(shù)的輸入和輸出的轉(zhuǎn)換,并且將其應(yīng)用至源代碼11。
轉(zhuǎn)換 A — Ta(X) = (x*28) + 10轉(zhuǎn)換 B — Tb(y) = (y*14) — 24然后,所產(chǎn)生的源代碼的混淆的版本13b變成:public static void main(String[] args) {int i, j;
i = 150;/** Ta 域 **/
j = increment(i);/氺氺 Ta
域中的輸入?yún)?shù),返回
在Tb域中的值**/
if (j == 60) {/** Tb 域林/
Il做某事
}
}
public static int increment(int i){
return i / 2 — 15/** 從 Ta 域到 Tb 域 **/
}
代碼轉(zhuǎn)換器12b進(jìn)一步創(chuàng)建了用于遞增函數(shù)的虛擬指令集,其定義被輸出為V-1SA定義21??赡艿氖牵A(yù)定 義V-1SA定義。VM編譯器14b將V-1SA定義21應(yīng)用至源代碼的混淆的版本13b的編譯以產(chǎn)生以下的字節(jié)碼15b。.main:
Osipush 1503istore—I
4iload—I
5invokestatic #16 <.1ncrement)
8istore—2
9iload—2
10bipush 60
12 if—icmpne 23 (+11)
15 …do something …
23 return.1ncrement:
0iload—0
1xc_obfuscated_inc_operation
2ireturn
相比之下,現(xiàn)有技術(shù)的VM編譯器14a將從源代碼的相同的混淆的版本中產(chǎn)生以下的字節(jié)碼15a。.main:
Osipush 150
3istore—I
4iload—I
5invokestatic #16 <.1ncrement)
8istore—2
9iload—2
10bipush 60
12 if—icmpne 23 (+11)
15 …do something …
23 return.1ncrement:
0iload—0
1iconst—2
2idiv
3bipush 15
5isub
6ireturn
與在現(xiàn)有技術(shù)的VM執(zhí)行環(huán)境16a中執(zhí)行現(xiàn)有技術(shù)的字節(jié)碼15a相比,在VM執(zhí)行環(huán)境16b中執(zhí)行字節(jié)碼15b更有效率。在每次需要從堆棧中讀出輸入?yún)?shù)并將結(jié)果寫回到VM的堆棧中的情況下,不必通過將四個(gè)單獨(dú)的指令(iconst_2、idiv、bipush 15、isub)映射到它們相應(yīng)的本地指令中就實(shí)現(xiàn)性能增益。作為替代,優(yōu)化的指令,即單個(gè)(復(fù)雜)的指令xc_obfuscated_inc_operation僅被解釋并被映射至本地指令的序列(除以2,減去15),作為替代,去除了從VM的虛擬堆棧中讀出中間值并將中間值寫入VM的虛擬堆棧的需要。[0067]VM執(zhí)行環(huán)境16b可以動(dòng)態(tài)地產(chǎn)生,即,基本上與字節(jié)碼15b的產(chǎn)生同時(shí)地產(chǎn)生。這使VM執(zhí)行環(huán)境16b能夠在源代碼的混淆的版本13b至字節(jié)碼15b的編譯中適于由VM編譯器14b使用的特定V-1SA定義21。
[0068]V-1SA定義21可以由代碼轉(zhuǎn)換器12b產(chǎn)生??商鎿Q地,預(yù)定義V-1SA定義21,或者存在多個(gè)預(yù)定義的V-1SA定義,可以從中選擇用于產(chǎn)生字節(jié)碼15b的一個(gè)預(yù)定義的V-1SA定義。
[0069]可能的是,使用預(yù)定義的V-1SA定義21對(duì)VM執(zhí)行環(huán)境16b進(jìn)行預(yù)編譯。在這種情況下,VM執(zhí)行環(huán)境不是基本上與字節(jié)碼15b同時(shí)創(chuàng)建的,而對(duì)于字節(jié)碼15b的執(zhí)行已經(jīng)可用。
[0070]雖然軟件的混淆的級(jí)將更少,但可能的是,使用代碼轉(zhuǎn)換器12b中的混淆工具集跳過源代碼11的混淆。在這種變體下,源代碼的混淆的版本13b與源代碼11完全相同。VM編譯器14b將V-1SA定義21應(yīng)用至源代碼以產(chǎn)生字節(jié)碼15b,其本身是混淆的形式。
[0071]將理解的是,關(guān)于任何一個(gè)實(shí)施例描述的任何特征可以被單獨(dú)地使用,或與描述的其它特征相組合使用,并且也可以與任何其它實(shí)施例的一個(gè)或多個(gè)特征相組合使用,或與任何其它實(shí)施例的任何組合相組合使用。本發(fā)明的一個(gè)實(shí)施例可以被實(shí)施為用于與計(jì)算機(jī)系統(tǒng)一起使用的程序產(chǎn)品。程序產(chǎn)品的一個(gè)或多個(gè)程序定義實(shí)施例(包括本文中描述的方法)的功能,并且可以被包含在各種計(jì)算機(jī)可讀的非瞬態(tài)存儲(chǔ)介質(zhì)上。說明性的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)包括但不限于:(i)非可寫存儲(chǔ)介質(zhì)(例如,計(jì)算機(jī)內(nèi)的只讀存儲(chǔ)器設(shè)備,諸如:由CD-ROM設(shè)備可讀的CD-ROM盤、ROM芯片或者任何類型的固態(tài)非易失性半導(dǎo)體存儲(chǔ)器),信息被永久地存儲(chǔ)在其上;以及(ii )可寫存儲(chǔ)介質(zhì)(例如,軟盤驅(qū)動(dòng)器內(nèi)的軟盤或者硬盤驅(qū)動(dòng)器或者任何類型的固態(tài)隨機(jī)存取半導(dǎo)體存儲(chǔ)器或者閃存存儲(chǔ)器),可變信息被存儲(chǔ)在其上。此外,本發(fā)明不限于上述實(shí)施例,其可以在所附權(quán)利要求的范圍內(nèi)變化。
【權(quán)利要求】
1.一種用于產(chǎn)生用于在VM執(zhí)行環(huán)境16b中執(zhí)行的字節(jié)碼15b的計(jì)算機(jī)實(shí)施的方法,所述方法包括: 由VM編譯器14b編譯高級(jí)代碼以獲得所述字節(jié)碼15b, 其中,所述編譯包括: 應(yīng)用V-1SA定義21以在所述字節(jié)碼15b中產(chǎn)生組合兩個(gè)或更多的單獨(dú)的指令的優(yōu)化的指令, 并且其中,所述VM執(zhí)行環(huán)境16b適于解釋并執(zhí)行所述優(yōu)化的指令。
2.根據(jù)權(quán)利要求1所述的方法,進(jìn)一步包括: 由代碼轉(zhuǎn)換器12b將所述源代碼11轉(zhuǎn)換為高級(jí)中間代碼13b, 并且其中,所述VM編譯器14b編譯所述高級(jí)中間代碼13b以獲得所述字節(jié)碼15b。
3.根據(jù)權(quán)利要求2所述的方法,進(jìn)一步包括: 由所述代碼轉(zhuǎn)換器12b產(chǎn)生所述V-1SA定義21。
4.根據(jù)權(quán)利要求2-3的任意一項(xiàng)所述的方法,其中,將所述代碼轉(zhuǎn)換器12b和所述VM編譯器14b組合在代碼轉(zhuǎn)換器-編譯器模塊17中,其中,在組合的代碼轉(zhuǎn)換-編譯進(jìn)程中執(zhí)行所述源代碼11的所述轉(zhuǎn)換以及所述高級(jí)中間代碼13b的所述編譯,并且其中,所述V-1SA定義21由所述代碼轉(zhuǎn)換器-編譯器模塊17產(chǎn)生。
5.根據(jù)權(quán)利要求1-4的任意一項(xiàng)所述的方法,進(jìn)一步包括: 由VM源代碼產(chǎn)生器22使用V-1SA定義21來產(chǎn)生VM源代碼23 ;以及 由目標(biāo)編譯器24編譯所述VM源代碼23以獲得VM解釋器代碼25, 其中,所述VM解釋器代碼25當(dāng)由處理器執(zhí)行時(shí)形成所述VM執(zhí)行環(huán)境16b。
6.根據(jù)權(quán)利要求5所述的方法,其中,基本上同時(shí)獲得所述字節(jié)碼15b和所述VM解釋器代碼25。
7.根據(jù)權(quán)利要求5所述的方法,其中,提前編譯所述VM解釋器代碼25,并且其中,即時(shí)獲得所述字節(jié)碼15b。
8.一種代碼轉(zhuǎn)換器12b,被配置為: 將源代碼11轉(zhuǎn)換為高級(jí)中間代碼13b ;以及 產(chǎn)生V-1SA定義21,所述V-1SA定義21使VM編譯器14b能夠在所述字節(jié)碼15b中產(chǎn)生組合兩個(gè)或更多的單獨(dú)的指令的優(yōu)化的指令。
9.一種VM編譯器14b,被配置為: 編譯高級(jí)代碼以獲得用于在VM執(zhí)行環(huán)境16b中執(zhí)行的字節(jié)碼15b,所述VM執(zhí)行環(huán)境16b適于解釋并執(zhí)行優(yōu)化的指令;以及 應(yīng)用V-1SA定義21以在所述字節(jié)碼15b中產(chǎn)生組合兩個(gè)或更多的單獨(dú)的指令的所述優(yōu)化的指令。
10.一種代碼轉(zhuǎn)換器-編譯器17,被配置為: 將源代碼11轉(zhuǎn)換并編譯為用于在VM執(zhí)行環(huán)境中執(zhí)行的字節(jié)碼15b,所述VM執(zhí)行環(huán)境適于解釋并執(zhí)行優(yōu)化的指令; 產(chǎn)生V-1SA定義21,并且應(yīng)用所述V-1SA定義21以在所述字節(jié)碼15b中產(chǎn)生組合兩個(gè)或更多的單獨(dú)的指令的優(yōu)化的指令。
11.一種VM源代碼產(chǎn)生器22,被配置為:使用V-1SA定義21產(chǎn)生VM源代碼23以使目標(biāo)編譯器24能夠編譯所述VM源代碼23,從而獲得VM解釋器代碼25,所述VM解釋器代碼25當(dāng)由處理器執(zhí)行時(shí)形成所述VM執(zhí)行環(huán)境16b,所述VM執(zhí)行環(huán)境16b適于通過將所述V-1SA定義21應(yīng)用于高級(jí)中間代碼13b的編譯,來解釋并執(zhí)行在由VM編譯器14b獲得的字節(jié)碼15b中的優(yōu)化的指令。
12.—種目標(biāo)編譯器24,被配置為: 編譯VM源代碼23以獲得VM解釋器代碼25,所述VM源代碼23已經(jīng)由VM源代碼產(chǎn)生器22使用V-1SA定義24而產(chǎn)生,所述VM解釋器代碼25當(dāng)由處理器執(zhí)行時(shí)形成VM執(zhí)行環(huán)境16b,所述VM執(zhí)行環(huán)境16b適于通過將所述V-1SA定義21應(yīng)用于高級(jí)中間代碼13b的編譯,來解釋并執(zhí)行在由VM編譯器14b獲得的字節(jié)碼15b中的優(yōu)化的指令。
13.一種計(jì)算機(jī)程序元件,其當(dāng)由處理器執(zhí)行時(shí)適于執(zhí)行根據(jù)權(quán)利要求1-7的任意一項(xiàng)所述的方法。`
【文檔編號(hào)】G06F9/44GK103443765SQ201280016663
【公開日】2013年12月11日 申請日期:2012年1月26日 優(yōu)先權(quán)日:2011年2月1日
【發(fā)明者】E.貝內(nèi)德蒂, A.E.范福雷斯特 申請人:耶德托公司