亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

基于最近執(zhí)行的程序代碼的程序代碼模糊處理的制作方法_2

文檔序號:9376079閱讀:來源:國知局
。然后,該程序代碼可被編譯或解譯。經(jīng)編譯的代碼可以是針對特定處理器的機(jī)器代碼,其中經(jīng)編譯的代碼使用來自針對特定處理器的指令集的指令。此外,所述代碼可以被編譯成字節(jié)代碼。字節(jié)代碼是表示各種操作的代碼。然后,字節(jié)代碼可被進(jìn)一步解譯,以在特定處理器上實(shí)現(xiàn)。這一技術(shù)可例如與虛擬機(jī)(VM) —起使用。然后,可以將VM實(shí)現(xiàn)為運(yùn)行在各種處理器上,但對于將在任意處理器上實(shí)現(xiàn)的應(yīng)用來講,字節(jié)代碼將是相同的,這是因?yàn)閂M所操作的字節(jié)代碼然后會被VM解譯成針對特定處理器的機(jī)器代碼。
[0033]在許多情況中,軟件應(yīng)用必須防御嘗試對代碼進(jìn)行反向工程的攻擊者,如上面的示例中所述的。攻擊者可以使用復(fù)雜的工具來分析采用二進(jìn)制形式的軟件,以便理解軟件正在做什么以及軟件如何工作。代碼模糊處理可用來實(shí)現(xiàn)軟件應(yīng)用,以便使得攻擊者更難理解代碼的操作、修改代碼、移動代碼或從代碼中提取敏感信息。由于攻擊者只能夠訪問可執(zhí)行代碼而不能訪問源代碼,所以模糊處理技術(shù)通常應(yīng)用于可執(zhí)行代碼。
[0034]一種用于對代碼進(jìn)行模糊處理的方式是使得對代碼的解碼(其對執(zhí)行代碼來講是必要的)取決于最近執(zhí)行的代碼。以下實(shí)施例是通過使用在VM中實(shí)現(xiàn)的字節(jié)代碼進(jìn)行描述的。然而,在實(shí)施例中所描述的技術(shù)可以更廣泛地應(yīng)用于其它類型的代碼和處理器。此夕卜,除了對代碼進(jìn)行模糊處理之外,所述實(shí)施例還使應(yīng)用免遭篡改。
[0035]在許多情況中,可能想要在可以容易地觀測到軟件的執(zhí)行的開放平臺上運(yùn)行軟件,但同時(shí)想要隱藏軟件實(shí)際上正在做什么。這可通過使用軟件模糊處理來實(shí)現(xiàn)。這通常用于防止軟件中所使用的知識產(chǎn)權(quán)被盜以及隱藏涉及安全性的軟件的內(nèi)部處理。
[0036]一些工具可用來對軟件進(jìn)行模糊處理(ExeCryptor、VMProtect、CodeVirtualizer、Thermida)。其中許多工具將要保護(hù)的軟件轉(zhuǎn)譯成虛擬機(jī)(VM),其中VM的指令以及如何在存儲器中對其進(jìn)行編碼都是秘密。軟件模糊工具還提供解譯器,從而VM知道VM指令以及如何在存儲器中對其進(jìn)行編碼。解譯器與經(jīng)轉(zhuǎn)譯的應(yīng)用代碼組合在一起形成經(jīng)模糊處理的應(yīng)用。
[0037]—種用來創(chuàng)建快速解譯器(從而代碼模糊處理的開銷較低)的非常流行的方法是使用字節(jié)代碼。針對字節(jié)代碼VM的程序包括多個(gè)字節(jié),其中字節(jié)值指令將被執(zhí)行的操作。例如,字節(jié)值12可表示乘法,字節(jié)值13可表示減法??稍谧鳛閷⒈籚M執(zhí)行的操作的輸入的字節(jié)代碼之間找到立即操作數(shù)。例如,字節(jié)代碼14可表示將16比特的常量與某變量相加,其中常量是從跟隨該字節(jié)代碼的兩個(gè)字節(jié)獲得的。
[0038]現(xiàn)在將描述實(shí)施例的概述。所描述的實(shí)施例對字節(jié)代碼進(jìn)行離線編碼(當(dāng)生成VM代碼時(shí))并且在解譯期間對其進(jìn)行解碼。對字節(jié)代碼的編碼利用最近執(zhí)行的字節(jié)代碼。為了對字節(jié)代碼B進(jìn)行編碼,并且在執(zhí)行B之前未編碼的字節(jié)代碼是L1,并且在1^之前未編碼的字節(jié)代碼是L2,等等,則針對B的經(jīng)編碼的值(稱為B’)是:
[0039]B? = f (B, gCLj..Ln)) ο
[0040]為了提高安全性,L1..Ln值可以是未編碼的字節(jié)代碼,但如果1^..Ln包含經(jīng)編碼的字節(jié)代碼,本發(fā)明同樣是有效的。在執(zhí)行期間,解譯器按照下式對所獲取的字節(jié)代碼進(jìn)行解碼:
[0041]B = P(B^g(L1--Ln))0
[0042]其中,f1是函數(shù)f的逆,滿足:
[0043]f1 (f (x, y) , y) =X0
[0044]在執(zhí)行了字節(jié)代碼B之后,值L1..Lj^移位一個(gè)位置,其中丟棄L n,并且新的L/變成B。換言之:
[0045]Ln=Lnl
[0046]Lnl= Ln2
[0047]...
[0048]L2= L !
[0049]L1= B。
[0050]通過按所示的對字節(jié)代碼進(jìn)行編碼,對其進(jìn)行解碼所需的信息變得只在執(zhí)行代碼期間可用。
[0051]代碼中的分支(其中特定代碼位置可經(jīng)由幾個(gè)控制路徑到達(dá))意味著L1..Ln在代碼中的這些點(diǎn)處不是唯一確定的。下文將描述如何處理這一問題。
[0052]現(xiàn)在將描述兩個(gè)實(shí)施例。第一實(shí)施例是針對f、g和η使用以下配置:
[0053]f (X,y) = x-y
[0054]g(X) =x
[0055]η = I
[0056]由于字節(jié)代碼是使用其值和上一執(zhí)行字節(jié)代碼之差來編碼的,所以該實(shí)施例可被稱為差分字節(jié)代碼。解譯器通過應(yīng)用f1 (其是加法)來對經(jīng)編碼的字節(jié)代碼進(jìn)行解碼。為了正確操作,f中的減法和f1中的加法應(yīng)該在字節(jié)值范圍0..255內(nèi)回繞(wrap around)。
[0057]第二實(shí)施例可使用:
[0058]f (x, y) =x xor y
[0059]g (X1, x2) = S[xJxor S [x2]
[0060]η = 2
[0061]其中xor代表排他性的“或”,S[x]是將字節(jié)映射到字節(jié)的替換操作。S[..]映射可以不具有結(jié)構(gòu),從而攻擊者難以分析是如何對代碼進(jìn)行編碼和解碼的。
[0062]如上節(jié)所述,如果代碼中存在連接點(diǎn)(其中使用跳(jump)來跳到代碼中的不同點(diǎn),這是頻繁發(fā)生的),則L1..Ln不是唯一的。例如,考慮以下4個(gè)未編碼的代碼,其中在代碼B3處存在跳條目目標(biāo):
[0063]BI
[0064]B2
[0065]J:B3
[0066]B4o
[0067]根據(jù)B3是在BI和B2之后執(zhí)行還是經(jīng)由到連接點(diǎn)J的跳來執(zhí)行,L1..1^中的執(zhí)行歷史將有所不同。存在不同的方式來解決這一問題。第一種方法是在使用每個(gè)先前字節(jié)代碼進(jìn)行編碼或解碼之前將其與應(yīng)該應(yīng)用于L1上的η個(gè)掩碼值相關(guān)聯(lián)。掩碼指示哪些比特在引導(dǎo)至字節(jié)代碼的所有執(zhí)行路徑中具有相同值。即,針對在連接點(diǎn)之前與其它字節(jié)代碼共享執(zhí)行歷史中的并行位置的任何字節(jié)代碼,掩碼基于在并行字節(jié)代碼中找到的公共比特。編碼和解碼從而變成:
[0068]B? = f(B, ga^PM1..Ln^PMn))
[0069]B = f1 (B,,g (L1^P M !..Ln^P M n))
[0070]通過掩碼M1,從L1中移除不應(yīng)當(dāng)用作g的自變量的比特,這是因?yàn)樗鼈儾皇呛愣ǖ?。在存儲器中,?yīng)該將掩碼與字節(jié)代碼相鄰地存儲。
[0071]第二種方法是確保L1..Ln總是唯一的。通過將η個(gè)noop (沒有任何效果的字節(jié)代碼)放置于標(biāo)簽J之前以及以J為目標(biāo)的跳之前,總是能夠?qū)崿F(xiàn)這一點(diǎn)。從而,如果η = 2,則上例變成:
[0072]BI
[0073]Β2
[0074]NOOP
[0075]NOOP
[0076]J:B3
[0077]B4
[0078]NOOP
[0079]NOOP
[0080]跳J。
[0081]第三種方法是下移標(biāo)簽J以及將η個(gè)字節(jié)代碼拷貝到以J為目標(biāo)的跳之前的位置。針對η = I,上例變成:
[0082]BI
[0083]Β2
[0084]Β3
[0085]J:Β4
[0086]Β3//拷貝自原始J位置
[0087]跳J0
[0088]在這一變換之后,針對Β4,L1總是Β3。最初,代碼將按照標(biāo)簽J所指示的跳到代碼Β3。取而代之地,標(biāo)簽J下移一個(gè)指令至代碼Β4,并且指令Β3放置于跳指令之前具有跳指令的代碼的其它部分中。如果η是2,則跳目標(biāo)將下移兩個(gè)指令,并且兩個(gè)指令將被放置于跳指令之前。
[0089]在第二種方法和第三種方法中,通過使用noop以及拷貝字節(jié)代碼,跳字節(jié)代碼不應(yīng)被用來使用其自己的字節(jié)代碼來更新執(zhí)行歷史L1..Ln。
[0090]以上實(shí)施例只描述了對字節(jié)代碼(即指明要執(zhí)行的操作的字節(jié))進(jìn)行編碼而沒有描述對位于典型VM中的字節(jié)代碼之間的中間數(shù)據(jù)進(jìn)行編碼。將這一技術(shù)應(yīng)用于中間數(shù)據(jù)是一種直接擴(kuò)展。
[0091]在一種對中間數(shù)據(jù)進(jìn)行編碼的實(shí)施例中,L1..Ln值需要在執(zhí)行經(jīng)保護(hù)的代碼之前的初始值。然后,該初始值還可充當(dāng)程序的密鑰。如果正確的值是不可用的,則不能正確地執(zhí)行代碼。
[0092]
當(dāng)前第2頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1