本發(fā)明涉及軟件安全領(lǐng)域,具體而言,涉及一種虛擬機指令的混淆方法及裝置、虛擬機保護系統(tǒng)。
背景技術(shù):
隨著軟件工業(yè)的飛速發(fā)展,軟件的安全日益重要,如何保證軟件的完整性成為一個重要的問題。代碼混淆作為一種重要的軟件保護手段用在越來越多場合。o-llvm代碼混淆的實現(xiàn)方式主要有以下幾種:(1)虛假分支插入,通過在程序的流程中插入永遠不會被執(zhí)行到的虛假分支來達到干擾破解者分析的目的;(2)流程復(fù)雜化,通過將程序原來簡單的控制流轉(zhuǎn)換為復(fù)雜的控制流來加大分析難度;(3)ir層面的指令替換,通過恒等方式將原有指令進行變換,例如加法轉(zhuǎn)換為等價的減法。但是,上述幾種實現(xiàn)方式仍然可以被反編譯,存在一定的風(fēng)險,例如:對于第(1)種實現(xiàn)方式,插入的虛假分支容易被識別,通過符號執(zhí)行等手段可以識別出虛假分支,并將其刪除;對于第(2)種實現(xiàn)方式,雖然經(jīng)過流程復(fù)雜化依然可以通過符號執(zhí)行確定正確的程序流程,從而被還原;(3)對于第三種實現(xiàn)方式,通過反編譯等手段,還原出來的代碼,只要稍加理解,依然可以識別原來的邏輯。
通過o-llvm混淆后的代碼依然可以被正確反編譯,通過理解反編譯的高級語言代碼來實現(xiàn)理解軟件的邏輯也是有可能的。因此,相關(guān)技術(shù)中提供的上述o-llvm代碼混淆的實現(xiàn)方式仍然存在易被反編譯的風(fēng)險。
技術(shù)實現(xiàn)要素:
根據(jù)本申請實施例的一個方面,提供了一種虛擬機指令的混淆方法,包括:對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令,其中,所述目標(biāo)輸出指令為編譯器(compiler)后端(backend)輸出的與所述待編譯程序?qū)?yīng)的指令;將所述目標(biāo)指令作為編譯器的最終輸出指令并輸出該最終輸出指令。
根據(jù)本申請實施例的另一方面,還提供了一種虛擬機指令的混淆裝置,包括:混 淆模塊,用于對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令,其中,所述目標(biāo)輸出指令為編譯器后端輸出的與所述待編譯程序?qū)?yīng)的指令;輸出模塊,用于將所述目標(biāo)指令作為編譯器的最終輸出指令并輸出該最終輸出指令。
根據(jù)本申請實施例的另一方面,還提供了一種虛擬機指令的校驗系統(tǒng),包括:虛擬機解釋引擎和虛擬機保護編譯器;其中,所述虛擬機保護編譯器,用于對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令;以及將所述目標(biāo)指令作為所述虛擬機保護編譯器的最終輸出指令并輸出該最終輸出指令;其中,所述目標(biāo)輸出指令為虛擬機保護編譯器后端輸出的與所述待編譯程序?qū)?yīng)的指令;所述虛擬機解釋引擎,用于加載并執(zhí)行所述虛擬機保護編譯器輸出的所述最終輸出指令。
在本申請實施例中,采用對編譯器后端輸出的與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,并輸出進行代碼混淆處理后的目標(biāo)指令的技術(shù)手段,從而代替了相關(guān)技術(shù)中將與待編譯程序?qū)?yīng)的未經(jīng)代碼混淆處理后的指令作為最終輸出指令的方案,提高了反編譯的難度,進而解決了相關(guān)技術(shù)中反編譯方案仍然存在易被反編譯的風(fēng)險的技術(shù)問題。
附圖說明
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:
圖1為根據(jù)本申請實施例1的一種可選的虛擬機保護(virtualmachineproject,簡稱為vmp)系統(tǒng)的架構(gòu)示意圖;
圖2為根據(jù)本申請實施例1的一種可選的虛擬機保護(virtualmachineproject,簡稱為vmp)編譯器的結(jié)構(gòu)示意圖;
圖3為根據(jù)本申請實施例1的一種可選的vmpcompiler的另一結(jié)構(gòu)框圖;
圖4為根據(jù)本申請實施例的一種可選的虛擬機解釋引擎的工作流程示意圖;
圖5是根據(jù)本申請實施例的一種可選的虛擬機指令的混淆方法的示意圖;
圖6是根據(jù)本申請實施例的一種可選的用于實現(xiàn)虛擬機指令的混淆方法的計算機終端的結(jié)構(gòu)示意圖;
圖7是根據(jù)本申請實施例的一種可選的虛擬機指令的混淆裝置的結(jié)構(gòu)框圖;
圖8是根據(jù)本申請實施例的一種可選的虛擬機指令的保護系統(tǒng)的結(jié)構(gòu)框圖;
圖9是根據(jù)本申請實施例的一種可選的虛擬機指令的保護系統(tǒng)的另一結(jié)構(gòu)框圖。
具體實施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分的實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應(yīng)當(dāng)屬于本發(fā)明保護的范圍。
需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本發(fā)明的實施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤?。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
為了便于理解,現(xiàn)將本申請實施例中可能涉及到的術(shù)語解釋如下:
1.bc:全稱bytecode,字節(jié)碼,表示生成的虛擬機指令,其區(qū)別于nativecode(即直接運行在物理機上的代碼);
2.guest:客戶機,運行字節(jié)碼指令的虛擬機;
3.host:宿主機,運行客戶機的物理機,區(qū)別于客戶機;
4.opcode:指令操作碼,用于指明指令操作類型;
5.llvm:全稱lowlevelvirtualmachine,一款開源的編譯器框架;
6.ir:全稱intermediaterepresentation,中間表示,編譯器對于源程序進行掃描后生成的內(nèi)部表示,代表源程序的語義和語法結(jié)構(gòu);
7.o-llvm:obfuscator-llvm,基于llvm框架開發(fā)的代碼混淆工具;
8.基于棧的虛擬機:進程級虛擬機的一種實現(xiàn)方式,指令執(zhí)行時用于運算的輸入操作數(shù)和輸出操作數(shù)均存放在棧中;
9.基于寄存器的虛擬機:進程級虛擬機的一種實現(xiàn)方式,指令執(zhí)行時用于運算的輸入操作數(shù)和輸出操作數(shù)均存放在寄存器中;
10.加殼:軟件加密保護的一種方法,通過將原程序做壓縮加密變換,并在外層增加一層殼代碼來實現(xiàn)軟件保護。殼代碼優(yōu)先于原程序執(zhí)行,其功能是還原原程序內(nèi)容,并跳回還原后的原程序執(zhí)行。
11.risc:精簡指令集,cpu的一種設(shè)計模式,這種指令集對指令的種類和尋址方式等做了簡化。
12.代碼混淆:又稱為花指令,是將計算機程序的代碼,轉(zhuǎn)換成一種功能上等價,但是難于閱讀和理解的形式的行為。
實施例1
根據(jù)本申請實施例,還提供了一種虛擬機指令的混淆方法實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執(zhí)行指令的虛擬機保護系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
如圖1所示:虛擬機保護系統(tǒng)在對指令進行校驗時大致分為兩個過程:
(一)字節(jié)碼生成過程,對應(yīng)于模塊vmp編譯器(compiler)
被保護代碼(即待編譯程序的程序代碼)以c語言源代碼形式提供,通過avmpcompiler最終生成虛擬機字節(jié)碼。需要說明的是,源代碼的表現(xiàn)形式不僅限于c語言,還可以為fortran語言、ada語言等。
(二)字節(jié)碼解釋執(zhí)行過程,對應(yīng)于模塊vmpsdk,其中,vmpsdk中主要依據(jù)虛擬機解釋引擎來完成字節(jié)碼的執(zhí)行過程。
其中,圖1中的普通邏輯指的是不會被vmp保護的代碼,由于其安全性比較低,所以不是軟件需要保護的核心邏輯(即圖1中的核心程序.h.c)。其作用是負責(zé)初始化和調(diào)用vmpsdk。目前由于各種系統(tǒng)的程序的啟動過程都不一致,vmpsdk沒有針對不同系統(tǒng)做不同的初始化處理,所以需要普通邏輯代碼來初始化和調(diào)用vmpsdk。例如,android程序的入口點是在java代碼中,而ios程序的入口點在object-c中,這些代碼就是普通邏輯,負責(zé)初始化和調(diào)用vmpsdk。
當(dāng)需要調(diào)用被保護代碼的功能時通過vmpsdk來調(diào)用被保護代碼,vmpsdk加載并執(zhí)行虛擬機字節(jié)碼文件。
其中,對于上述實施例及其優(yōu)選實施例中所涉及的虛擬機可以通過以下架構(gòu)實現(xiàn), 但不限于此:
1)虛擬cpu架構(gòu):
1.32位risc指令集,內(nèi)存地址和寄存器均為32位。
2.指令編碼存儲格式為小端模式。
3.指令尋址方式為立即數(shù)和寄存器尋址,針對內(nèi)存的訪問必須通過load/store指令完成;
2)內(nèi)存架構(gòu)
如圖2所述,圖2左側(cè)的主機(host)代表運行時的被保護程序,圖2右側(cè)的客戶端(guest)代表運行的vm。
host通過vmpsdk來調(diào)用vm,由于vmpsdk封裝了vm實現(xiàn)細節(jié),所以host可以做到平臺無關(guān),即可以兼容目前所有主流操作系統(tǒng)以及cpu。
guest以沙盒模式運行,具有自己獨立的內(nèi)存地址空間,guest內(nèi)存空間被劃分為以下部分:
1)以0x0開始的無效地址空間,即圖2中的無效區(qū)域;
2)虛擬機字節(jié)碼(vmbytecodes)區(qū)域,用于存放需要運行的虛擬機指令;
3)堆區(qū)域(vmheap),滿足虛擬機代碼執(zhí)行時動態(tài)內(nèi)存分配需求;
4)棧區(qū)域(vmstack),滿足虛擬機代碼運行時臨時變量以及返回地址存放等臨時空間分配需求。
需要說明的是,上述實施例及其可選實施例中所涉及的編譯器和虛擬機解釋引擎可以以軟件或硬件的形式實現(xiàn),對于后者,可以表現(xiàn)為可以實現(xiàn)編譯器和虛擬機解釋引擎的功能的計算機或處理器等,但不限于此。
圖3左側(cè)為llvm前端(frontend)30,支持各種編程語言,例如圖3中左側(cè)所示的c前端(支持c/c++語言的前端)、公式翻譯(formulatranslation,簡稱為fortran)前端(即支持fortran語言的前端)、ada語言等。圖3中間為llvmir32,用于支持llvm的中間表示語言;圖3右側(cè)為llvm后端34,llvm項目支持已有的多種后端(backend),包括x86后端和powerpc后端等。本申請實施例中的vmpcompiler在此基礎(chǔ)上增加了一種新型的后端vmprisc后端,并實現(xiàn)了從llvmir到vmprisc指令集的生成過程。
虛擬機解釋引擎作為vmp保護程序工具中的重要組件,其工作流程如圖4所示,包括:
步驟s402,取指令過程,獲取當(dāng)前虛擬機pc寄存器指向的虛擬機字節(jié)碼內(nèi)容;
步驟s404,解碼指令,根據(jù)讀取的虛擬機字節(jié)碼內(nèi)容,解碼出虛擬機指令結(jié)構(gòu);
步驟s406,調(diào)用指令模擬函數(shù),根據(jù)指令解碼結(jié)果,調(diào)用相應(yīng)指令的處理過程,模擬指令的運行;
步驟s408,移動pc,將pc步進一條指令,也就是pc=pc+4;
步驟s410,判斷停機條件,如果不滿足停機條件則轉(zhuǎn)步驟s402,否則結(jié)束。
本申請實施例中主要對編譯器的指令編譯過程進行改進,即主要針對ir至后端的指令編譯過程進行改進。圖5是根據(jù)本申請實施例的一種可選的虛擬機指令的混淆方法的示意圖。需要說明的是,圖5中所示流程可以運行于上述虛擬機保護系統(tǒng)中,但不限于此。如圖5所示,本申請實施例提供的虛擬機指令的混淆方法包括步驟s502-504:
步驟s502,對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令,其中,上述目標(biāo)輸出指令為編譯器后端輸出的與上述待編譯程序?qū)?yīng)的指令;
可選地,步驟s502在具體實現(xiàn)時,可以表現(xiàn)為以下實現(xiàn)過程,但不限于此:在編譯待編譯程序時,將上述待編譯程序的源代碼轉(zhuǎn)換為中間表示ir指令;對于上述待編譯程序的每一條上述ir指令,從指令模板庫中選擇與上述ir指令匹配的上述目標(biāo)指令。
需要說明的是,“從指令模板庫中選擇與上述ir指令匹配的上述目標(biāo)指令”中的選擇過程可以按照與上述目標(biāo)輸出指令對應(yīng)的指令的優(yōu)先級確定最終選定的指令,也可以隨機從指令模板庫中選擇。對于后者,可選地,可以通過以下方式實現(xiàn):在上述指令模板庫中查找與上述目標(biāo)輸出指令具有相同功能的所有指令;在上述所有指令中隨機選擇一條指令作為最終選定的指令。當(dāng)然對于上述選擇過程,在具體實施時,可以根據(jù)實際情況靈活調(diào)整:例如,在指令模板庫中不存在與上述目標(biāo)輸出指令功能相同的指令時,則直接利用相關(guān)技術(shù)中與待編譯程序?qū)?yīng)的未經(jīng)代碼混淆處理的指令作為最終輸出指令;在指令模板庫中僅存在一條與上述目標(biāo)輸出指令功能相同的指令時,則僅能選擇指令模板庫中的這一條指令;在指令模板庫中存在多條與上述目標(biāo)輸出指令功能相同的指令時,則可以隨機從多條指令中選擇一條指令作為最終選定的指令。
具體地,上述指令模板庫中存儲的指令可以是根據(jù)不同的指令變換規(guī)則得到的,例如,通過以下至少之一方式獲?。?/p>
(1)將上述目標(biāo)輸出指令擴展為用于實現(xiàn)與上述目標(biāo)輸出指令相同功能的指令序列,并將上述指令序列存儲至上述指令模板庫;
可選地,可以按照以下之一方式進行指令的擴展:
第一種方式,利用等價算術(shù)構(gòu)造規(guī)則擴展:即利用上述目標(biāo)輸出指令與指令序列之間的等價關(guān)系進行擴展,其中,上述等價關(guān)系用于指示上述目標(biāo)輸出指令與上述指令序列之間所滿足的運算規(guī)則。以加減運算規(guī)則為例,可以利用大數(shù)運算流程進行構(gòu)造,假設(shè)原指令為addr1,13,利用7811-7798=13這一恒等式,將指令擴充為addr1,7811;subr1,7798兩條指令。
第二種方式,利用棧操作變換構(gòu)造規(guī)則進行擴展,即修改上述目標(biāo)輸出指令的棧操作方式。由于函數(shù)調(diào)用過程中是通過棧來傳遞參數(shù)的,數(shù)據(jù)壓棧通常通過push指令完成,因此,利用棧操作變換構(gòu)造規(guī)則進行擴展就是通過將棧操作復(fù)雜化來實現(xiàn)。例如pushr1指令變換為movr2,sp;subr2,4;str1,[r2]的指令序列,這里改變了r2,實際規(guī)則中在變換前會保存r2的值,并且在變換后恢復(fù)r2的值。
(2)將上述目標(biāo)輸出指令替換為其它指令,并將上述其它指令存儲至上述指令模板庫,其中,該其它指令為用于實現(xiàn)與上述目標(biāo)輸出指令相同功能的指令;可選地,該“替換”過程可以通過以下之一方式實現(xiàn):
第一種方式,利用使用頻率低于預(yù)設(shè)閾值的指令替換所述目標(biāo)輸出指令;即利用生僻指令替換構(gòu)造規(guī)則。例如arm中mvn指令是一條生僻指令,movr0,-5指令可以等效轉(zhuǎn)換為mvnr0,4。相對來說,mov指令使用頻率較高,人工閱讀是非常方便的,而mvn指令使用頻率較少,人工閱讀比較困難,這樣,替換后便進一步增強了反編譯的難度。
第二種方式,利用上述目標(biāo)輸出指令的邊際效應(yīng)所對應(yīng)的操作替換上述目標(biāo)輸出指令,即指令的邊際效應(yīng)構(gòu)造規(guī)則。通常一條機器指令除了其操作碼描述的操作外,還有一些邊際效應(yīng),例如pushr1指令其主要操作是將r1壓入當(dāng)前棧頂,同時還有將sp減去4的操作。這里將sp減去4的操作即為pushr1的邊際效應(yīng)。邊際效應(yīng)構(gòu)造規(guī)則就是忽略指令的主要功能而僅考慮邊際效應(yīng)的方式來構(gòu)造替換指令。
(3)在上述目標(biāo)輸出指令中插入垃圾指令,并將插入上述垃圾指令的目標(biāo)輸出指令存儲至上述指令模板庫??蛇x地,在上述目標(biāo)輸出指令中插入垃圾指令的方式有多種,例如可以通過以下之一方式實現(xiàn):
第一種方式,基于恒等式的虛假分支加入規(guī)則,即在上述目標(biāo)輸出指令中插入無效的分支指令(又稱為虛假分支指令),得到上述垃圾指令,其中,上述無效的分支指 令是在執(zhí)行上述待編譯程序時不會被執(zhí)行到的指令。例如a*(a+1)始終是偶數(shù),可以隨機產(chǎn)生一個立即數(shù)n,并計算n*(n+1),并將結(jié)果與2進行取模運算,判斷最終結(jié)果是否為0。其中結(jié)果為1所在的分支代碼永遠不會被執(zhí)行到,是虛假分支。在虛假分支中可以隨機構(gòu)造一些復(fù)雜計算,例如移位,位運算等。假設(shè)指令序列a1,a2,a3;其中對a2做虛假分支加入,則插入虛假分支后的指令序列為a1,r=n*(n+1),if(r%2==0)doa2elseb1,b2,b3enda3。其中指令序列b1,b2,b3則為干擾分析的垃圾指令。
第二種方式,無效寄存器賦值方式:即在上述目標(biāo)輸出指令中插入無效的分支指令,并構(gòu)造上述無效的分支指令中涉及指定寄存器地址的指令,其中,上述指定寄存器地址滿足以下條件:在上述無效的分支指令執(zhí)行過程中,在上述寄存器地址被讀取后,未執(zhí)行訪問上述指定寄存器地址所對應(yīng)寄存器的操作。例如,基于前面所述的虛假分支中的垃圾指令,如果該垃圾指令中一開始讀取了某個寄存器的值,而分支之后沒有訪問該寄存器的操作,則可以針對該寄存器構(gòu)造垃圾運算指令。假設(shè)a1,r=n*(n+1),if(r%2==0)doa2elseb1,b2,b3enda3為上述構(gòu)造出來的指令序列,a3之后的指令沒有讀取r1寄存器的內(nèi)容,而b1,b2,b3中有讀取r1的內(nèi)容,則可以針對r1構(gòu)造垃圾指令序列c1,c2,c3,并將其加入a1之后。
步驟s504,將上述目標(biāo)指令作為編譯器的最終輸出指令并輸出該最終輸出指令。
需要說明的是,上述實施例及其可選實施例中所涉及的編譯器和虛擬機解釋引擎可以以軟件或硬件的形式實現(xiàn),對于后者,可以表現(xiàn)為可以實現(xiàn)編譯器和虛擬機解釋引擎的功能的計算機或處理器等,但不限于此。
需要說明的是,對于前述的各方法實施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因為依據(jù)本發(fā)明,某些步驟可以采用其他順序或者同時進行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實施例均屬于優(yōu)選實施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。
通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到根據(jù)上述實施例的方法可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當(dāng)然也可以通過硬件,但很多情況下前者是更佳的實施方式。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)(如rom/ram、磁碟、光盤)中,包括若干指令用以使得一臺終端設(shè)備(可以是手機,計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述的方法。
實施例2
實施例1中所示方法可以運行于移動終端、計算機終端或者類似的運算裝置中執(zhí)行。以運行在計算機終端上為例,圖6是本申請實施例的一種用于實現(xiàn)虛擬機指令的混淆方法的計算機終端的硬件結(jié)構(gòu)框圖。如圖6所示,計算機終端60可以包括一個或多個(圖中僅示出一個)處理器602(處理器602可以包括但不限于微處理器mcu或可編程邏輯器件fpga等的處理裝置)、用于存儲數(shù)據(jù)的存儲器604、以及用于通信功能的傳輸裝置606。本領(lǐng)域普通技術(shù)人員可以理解,圖6所示的結(jié)構(gòu)僅為示意,其并不對上述電子裝置的結(jié)構(gòu)造成限定。例如,計算機終端60還可包括比圖6中所示更多或者更少的組件,或者具有與圖6所示不同的配置。
存儲器604可用于存儲應(yīng)用軟件的軟件程序以及模塊,如本申請實施例中的虛擬機指令的混淆方法對應(yīng)的程序指令/模塊,處理器602通過運行存儲在存儲器604內(nèi)的軟件程序以及模塊,從而執(zhí)行各種功能應(yīng)用以及數(shù)據(jù)處理,即實現(xiàn)上述的虛擬機指令的混淆方法。存儲器604可包括高速隨機存儲器,還可包括非易失性存儲器,如一個或者多個磁性存儲裝置、閃存、或者其他非易失性固態(tài)存儲器。在一些實例中,存儲器604可進一步包括相對于處理器602遠程設(shè)置的存儲器,這些遠程存儲器可以通過網(wǎng)絡(luò)連接至計算機終端60。上述網(wǎng)絡(luò)的實例包括但不限于互聯(lián)網(wǎng)、企業(yè)內(nèi)部網(wǎng)、局域網(wǎng)、移動通信網(wǎng)及其組合。
傳輸裝置606用于經(jīng)由一個網(wǎng)絡(luò)接收或者發(fā)送數(shù)據(jù)。上述的網(wǎng)絡(luò)具體實例可包括計算機終端60的通信供應(yīng)商提供的無線網(wǎng)絡(luò)。在一個實例中,傳輸裝置606包括一個網(wǎng)絡(luò)適配器(networkinterfacecontroller,nic),其可通過基站與其他網(wǎng)絡(luò)設(shè)備相連從而可與互聯(lián)網(wǎng)進行通訊。在一個實例中,傳輸裝置606可以為射頻(radiofrequency,rf)模塊,其用于通過無線方式與互聯(lián)網(wǎng)進行通訊。
可選地,在本實施例中,上述計算機終端可以位于計算機網(wǎng)絡(luò)的多個網(wǎng)絡(luò)設(shè)備中的至少一個網(wǎng)絡(luò)設(shè)備。
在本實施例中,上述計算機終端可以執(zhí)行虛擬機指令的混淆方法中以下步驟的程序代碼:對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令,其中,上述目標(biāo)輸出指令為編譯器后端輸出的與上述待編譯程序?qū)?yīng)的指令;將上述目標(biāo)指令作為編譯器的最終輸出指令并輸出該最終輸出指令。
處理器可以通過傳輸裝置調(diào)用存儲器存儲的信息及應(yīng)用程序,以執(zhí)行下述步驟:在編譯待編譯程序時,將上述待編譯程序的源代碼轉(zhuǎn)換為中間表示ir指令;對于上述待編譯程序的每一條上述ir指令,從指令模板庫中選擇與上述ir指令匹配的上述目 標(biāo)指令。
處理器可以通過傳輸裝置調(diào)用存儲器存儲的信息及應(yīng)用程序,以執(zhí)行下述步驟:在上述指令模板庫中查找與上述目標(biāo)輸出指令具有相同功能的所有指令;在上述所有指令中隨機選擇一條指令作為最終選定的指令。
可選的,上述處理器還可以執(zhí)行如下步驟的程序代碼:將上述目標(biāo)輸出指令擴展為用于實現(xiàn)與上述目標(biāo)輸出指令相同功能的指令序列,并將上述指令序列存儲至上述指令模板庫;將上述目標(biāo)輸出指令替換為其它指令,并將上述其它指令存儲至上述指令模板庫,其中,該其它指令為用于實現(xiàn)與上述目標(biāo)輸出指令相同功能的指令;在上述目標(biāo)輸出指令中插入垃圾指令,并將插入上述垃圾指令的目標(biāo)輸出指令存儲至上述指令模板庫。
本領(lǐng)域普通技術(shù)人員可以理解,圖6所示的結(jié)構(gòu)僅為示意,計算機終端也可以是智能手機(如android手機、ios手機等)、平板電腦、掌上電腦以及移動互聯(lián)網(wǎng)設(shè)備(mobileinternetdevices,mid)、pad等終端設(shè)備。圖6其并不對上述電子裝置的結(jié)構(gòu)造成限定。例如,計算機終端6還可包括比圖6中所示更多或者更少的組件(如網(wǎng)絡(luò)接口、顯示裝置等),或者具有與圖6所示不同的配置。
本領(lǐng)域普通技術(shù)人員可以理解上述實施例的各種方法中的全部或部分步驟是可以通過程序來指令終端設(shè)備相關(guān)的硬件來完成,該程序可以存儲于一計算機可讀存儲介質(zhì)中,存儲介質(zhì)可以包括:閃存盤、只讀存儲器(read-onlymemory,rom)、隨機存取器(randomaccessmemory,ram)、磁盤或光盤等。
實施例3
本申請實施例還提供一種虛擬機指令的混淆裝置。圖7是根據(jù)本申請實施例的一種可選的虛擬機指令的混淆裝置的結(jié)構(gòu)框圖,如圖7所示,該裝置包括:
混淆模塊70,用于對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令,其中,上述目標(biāo)輸出指令為編譯器后端輸出的與上述待編譯程序?qū)?yīng)的指令;
輸出模塊72,連接至混淆模塊70,用于將上述目標(biāo)指令作為編譯器的最終輸出指令并輸出該最終輸出指令。
可選地,混淆模塊70,還用于在編譯待編譯程序時,將待編譯程序的源代碼轉(zhuǎn)換為ir指令;以及對于待編譯程序的每一條ir指令,從指令模板庫中選擇與ir指令匹 配的上述目標(biāo)指令。需要說明的是,混淆模塊70在“從指令模板庫中選擇與ir指令匹配的上述目標(biāo)指令”過程中的選擇過程可以按照與上述目標(biāo)輸出指令對應(yīng)的指令的優(yōu)先級確定最終選擇的指令,也可以隨機從指令模板庫中選擇。對于后者,可以表現(xiàn)為以下實現(xiàn)形式:混淆模塊70,還用于在上述指令模板庫中查找與上述目標(biāo)輸出指令具有相同功能的所有指令。
其中,上述指令模板庫中存儲的指令通過以下至少之一方式獲?。壕唧w地,上述指令模板庫中存儲的指令可以根據(jù)不同的指令變換規(guī)則得到,例如,通過以下至少之一方式獲?。?/p>
(1)將上述目標(biāo)輸出指令擴展為用于實現(xiàn)與上述目標(biāo)輸出指令相同功能的指令序列,并將上述指令序列存儲至上述指令模板庫;
可選地,可以按照以下之一方式進行指令的擴展:
第一種方式,利用等價算術(shù)構(gòu)造規(guī)則擴展:即利用上述目標(biāo)輸出指令與指令序列之間的等價關(guān)系進行擴展,其中,上述等價關(guān)系用于指示上述目標(biāo)輸出指令與上述指令序列之間所滿足的運算規(guī)則。以加減運算規(guī)則為例,可以利用大數(shù)運算流程進行構(gòu)造,假設(shè)原指令為addr1,13,利用7811-7798=13這一恒等式,將指令擴充為addr1,7811;subr1,7798兩條指令。
第二種方式,利用棧操作變換構(gòu)造規(guī)則進行擴展,即修改上述目標(biāo)輸出指令的棧操作方式。由于函數(shù)調(diào)用過程中是通過棧來傳遞參數(shù)的,數(shù)據(jù)壓棧通常通過push指令完成,因此,利用棧操作變換構(gòu)造規(guī)則進行擴展就是通過將棧操作復(fù)雜化來實現(xiàn)。例如pushr1指令變換為movr2,sp;subr2,4;str1,[r2]的指令序列,這里改變了r2,實際規(guī)則中在變換前會保存r2的值,并且在變換后恢復(fù)r2的值。
(2)將上述目標(biāo)輸出指令替換為其它指令,并將上述其它指令存儲至上述指令模板庫,其中,該其它指令為用于實現(xiàn)與上述目標(biāo)輸出指令相同功能的指令;可選地,該“替換”過程可以通過以下之一方式實現(xiàn):
第一種方式,利用使用頻率低于預(yù)設(shè)閾值的指令替換所述目標(biāo)輸出指令;即利用生僻指令替換構(gòu)造規(guī)則。例如arm中mvn指令是一條生僻指令,movr0,-5指令可以等效轉(zhuǎn)換為mvnr0,4。相對來說,mov指令使用頻率較高,人工閱讀是非常方便的,而mvn指令使用頻率較少,人工閱讀比較困難,這樣,替換后便進一步增強了反編譯的難度。
第二種方式,利用上述目標(biāo)輸出指令的邊際效應(yīng)所對應(yīng)的操作替換上述目標(biāo)輸出指令,即指令的邊際效應(yīng)構(gòu)造規(guī)則。通常一條機器指令除了其操作碼描述的操作外, 還有一些邊際效應(yīng),例如pushr1指令其主要操作是將r1壓入當(dāng)前棧頂,同時還有將sp減去4的操作。這里將sp減去4的操作即為pushr1的邊際效應(yīng)。邊際效應(yīng)構(gòu)造規(guī)則就是忽略指令的主要功能而僅考慮邊際效應(yīng)的方式來構(gòu)造替換指令。
(3)在上述目標(biāo)輸出指令中插入垃圾指令,并將插入上述垃圾指令的目標(biāo)輸出指令存儲至上述指令模板庫??蛇x地,在上述目標(biāo)輸出指令中插入垃圾指令的方式有多種,例如可以通過以下之一方式實現(xiàn):
第一種方式,基于恒等式的虛假分支加入規(guī)則,即在上述目標(biāo)輸出指令中插入無效的分支指令,得到上述垃圾指令,其中,上述無效的分支指令是在執(zhí)行上述待編譯程序時不會被執(zhí)行到的指令。例如a*(a+1)始終是偶數(shù),可以隨機產(chǎn)生一個立即數(shù)n,并計算n*(n+1),并將結(jié)果與2進行取模運算,判斷最終結(jié)果是否為0。其中結(jié)果為1所在的分支代碼永遠不會被執(zhí)行到,是虛假分支。在虛假分支中可以隨機構(gòu)造一些復(fù)雜計算,例如移位,位運算等。假設(shè)指令序列a1,a2,a3;其中對a2做虛假分支加入,則插入虛假分支后的指令序列為a1,r=n*(n+1),if(r%2==0)doa2elseb1,b2,b3enda3。其中指令序列b1,b2,b3則為干擾分析的垃圾指令。
第二種方式,無效寄存器賦值方式:即在上述目標(biāo)輸出指令中插入無效的分支指令,并構(gòu)造上述無效的分支指令中涉及指定寄存器地址的指令,其中,上述指定寄存器地址滿足以下條件:在上述無效的分支指令執(zhí)行過程中,在上述寄存器地址被讀取后,未執(zhí)行訪問上述指定寄存器地址所對應(yīng)寄存器的操作。例如,基于前面所述的虛假分支中的垃圾指令,如果該垃圾指令中一開始讀取了某個寄存器的值,而分支之后沒有訪問該寄存器的操作,則可以針對該寄存器構(gòu)造垃圾運算指令。假設(shè)a1,r=n*(n+1),if(r%2==0)doa2elseb1,b2,b3enda3為上述構(gòu)造出來的指令序列,a3之后的指令沒有讀取r1寄存器的內(nèi)容,而b1,b2,b3中有讀取r1的內(nèi)容,則可以針對r1構(gòu)造垃圾指令序列c1,c2,c3,并將其加入a1之后。
需要說明的是,本實施例中的模塊是可以通過軟件或硬件的形式來實現(xiàn)的,例如,對于后者可以通過以下方式實現(xiàn),但不限于此:混淆模塊70和輸出模塊72位于同一處理器中;混淆模塊70和輸出模塊72分別位于第一處理器和第二處理器中。
實施例4
本申請實施例還提供一種虛擬機指令的保護系統(tǒng)。圖8是根據(jù)本申請實施例的一種可選的虛擬機指令的保護系統(tǒng)的結(jié)構(gòu)框圖。如圖8所示,該系統(tǒng)包括:虛擬機保護編譯器80和虛擬機解釋引擎82;其中,
虛擬機保護編譯器80,用于對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令;以及將上述目標(biāo)指令作為上述虛擬機保護編譯器的最終輸出指令并輸出該最終輸出指令;其中,上述目標(biāo)輸出指令為虛擬機保護編譯器后端輸出的與上述待編譯程序?qū)?yīng)的指令。
可選地,虛擬機保護編譯器80,還用于在編譯待編譯程序時,將上述待編譯程序的源代碼轉(zhuǎn)換為ir指令;以及對于上述待編譯程序的每一條上述ir指令,從指令模板庫中選擇與上述ir指令匹配的上述目標(biāo)輸出指令。
可選地,虛擬機保護編譯器80,用于在上述指令模板庫中確定與上述ir指令匹配的所有指令;在該所有指令中隨機選擇一條指令作為最終選定的指令。
在一個可選實施例中,虛擬機保護編譯器80,還用于通過以下之一方式獲取上述指令模板庫中存儲的指令:(1)將上述目標(biāo)輸出指令擴展為用于實現(xiàn)與上述目標(biāo)輸出指令相同功能的指令序列,并將上述指令序列存儲至上述指令模板庫;(2)將上述目標(biāo)輸出指令替換為其它指令,并將上述其它指令存儲至上述指令模板庫,其中,該其它指令為用于實現(xiàn)與上述目標(biāo)輸出指令相同功能的指令;(3)在上述目標(biāo)輸出指令中插入垃圾指令,并將插入上述垃圾指令的上述目標(biāo)輸出指令存儲至上述指令模板庫。
虛擬機解釋引擎82,用于加載并執(zhí)行虛擬機保護編譯器輸出的最終輸出指令。
在一個可選實施例中,如圖9所示,虛擬機保護編譯器80,包括:編譯器前端800,用于接收指定編程語言格式的待編譯程序的源代碼;中間表示ir端802,用于將上述源代碼轉(zhuǎn)換為上述ir指令;編譯器后端804,用于對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令;以及將上述目標(biāo)指令作為上述虛擬機保護編譯器的最終輸出指令并輸出該最終輸出指令。編譯器前端800、ir端802和編譯器后端804的優(yōu)選實現(xiàn)方式可以參見圖3所示實施例中的llvm前端30、llvmir32和llvm后端34,需要注意的是,圖9中的編譯器后端和圖3中的llvm后端在功能上是不同的。
可選地,編譯器前端800可以支持多種編程語言格式的源代碼輸入;和/或上述編譯器后端804可以支持多種類型的指令集。
需要說明的是,虛擬機保護編譯器80和虛擬機解釋引擎82的優(yōu)選實施方式可以參見實施例1中虛擬機保護編譯器和虛擬機解釋引擎的描述,但不限于此,例如,虛擬機保護編譯器80和虛擬機解釋引擎82的結(jié)構(gòu)或功能多于或少于實施例1中所述的虛擬機保護編譯器和虛擬機解釋引擎,以及其應(yīng)用場景包括但不限于實施例1所述的場景。
實施例5
本申請的實施例還提供了一種存儲介質(zhì)??蛇x地,在本實施例中,上述存儲介質(zhì)可以用于保存上述實施例1所提供的虛擬機指令的混淆方法所執(zhí)行的程序代碼。
可選地,在本實施例中,上述存儲介質(zhì)可以位于計算機網(wǎng)絡(luò)中計算機終端群中的任意一個計算機終端中,或者位于移動終端群中的任意一個移動終端中。
可選地,在本實施例中,存儲介質(zhì)被設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:對與待編譯程序?qū)?yīng)的目標(biāo)輸出指令進行代碼混淆處理,得到目標(biāo)指令,其中,上述目標(biāo)輸出指令為編譯器后端輸出的與上述待編譯程序?qū)?yīng)的指令;將上述目標(biāo)指令作為編譯器的最終輸出指令并輸出該最終輸出指令。
可選地,在本實施例中,存儲介質(zhì)被設(shè)置為存儲用于執(zhí)行以下步驟的程序代碼:在編譯待編譯程序時,將上述待編譯程序的源代碼轉(zhuǎn)換為中間表示ir指令;對于上述待編譯程序的每一條上述ir指令,從指令模板庫中選擇與上述ir指令匹配的上述目標(biāo)指令
上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
在本發(fā)明的上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關(guān)描述。
在本申請所提供的幾個實施例中,應(yīng)該理解到,所揭露的技術(shù)內(nèi)容,可通過其它的方式實現(xiàn)。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。
另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時, 可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可為個人計算機、服務(wù)器或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:u盤、只讀存儲器(rom,read-onlymemory)、隨機存取存儲器(ram,randomaccessmemory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。