衣李娜
摘要:隨著計(jì)算機(jī)技術(shù)的快速發(fā)展,計(jì)算機(jī)軟件的安全存在著一定的威脅,包括軟件的攻擊和重組。Java程序混淆技術(shù)是一種特殊的編碼技術(shù),可以抵制逆向工程和重組工程,保護(hù)軟件知識(shí)產(chǎn)權(quán)。
關(guān)鍵詞:Java程序;混淆技術(shù);軟件;編碼
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2012)35-8414-02
Java程序可以在平臺(tái)上迅速傳播,Java語言很容易被反編碼。Java程序混淆也就是在不改變?cè)x的情況下,對(duì)Java程序程序進(jìn)行混淆,混淆后的程序很難被反編碼,或者發(fā)編碼后的程序可讀性非常差,就可以達(dá)到保護(hù)軟件的目的。Java程序混淆技術(shù)被廣泛地用于軟件知識(shí)產(chǎn)權(quán)領(lǐng)域。
1Java程序混淆技術(shù)的原理
混淆技術(shù)[1]實(shí)際上就是代碼變換技術(shù),通過變換,將原始程序P變換為新的程序P1,它們的功能相似或者相近,代碼安全性非常高。
如果原始程序P,經(jīng)過混淆變換T,變換為新的程序P1,也就是P1=T(P),這個(gè)軟件混淆變化必須滿足以下條件:如果P結(jié)束,那么P1也必須結(jié)束,并且輸出結(jié)果與P相同;如果P無法結(jié)束,或者以錯(cuò)誤狀態(tài)結(jié)束,那么P1不一定結(jié)束;對(duì)于P和P1的計(jì)算任務(wù),P1比P消耗的時(shí)間長,而且保持在一個(gè)特定的范圍內(nèi);攻擊者如果想要將P1恢復(fù)成P,那么所需要消耗的時(shí)間遠(yuǎn)遠(yuǎn)大于將P轉(zhuǎn)換為P1的時(shí)間。
2Java程序混淆技術(shù)的分類
2.1數(shù)據(jù)混淆
數(shù)據(jù)混淆[2]是指對(duì)程序的組成元素,如常量、變量和數(shù)據(jù)結(jié)構(gòu)進(jìn)行混淆變換,增大攻擊者反編碼的難度。
1)分裂和合并變量混淆:分裂變量混淆指的是在保持程序原義的前提下,將一些比較簡單的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型分解成一些變量的組合,就可以達(dá)到隱藏原始程序的效果。
合并變量混淆指的是將幾個(gè)數(shù)值變量或者整型數(shù)據(jù)合并成一個(gè)變量或數(shù)據(jù),從而達(dá)到隱藏原始數(shù)據(jù)的目的。
2)數(shù)組重構(gòu)混淆:數(shù)組是程序中的基本數(shù)據(jù)結(jié)構(gòu),對(duì)數(shù)組進(jìn)行重構(gòu)混淆,包括數(shù)組分裂變換、數(shù)組合并變換、數(shù)組平滑變換以及數(shù)組折疊變換。數(shù)組分裂變換指的是將一個(gè)數(shù)組分裂成兩個(gè)或者兩個(gè)以上的數(shù)組;數(shù)組合并變換是指將兩個(gè)或兩個(gè)以上的數(shù)組合并為一個(gè)數(shù)組;數(shù)組平滑變換是指減少數(shù)組的維數(shù);數(shù)組折疊變換是指增加數(shù)組的維數(shù)。
3)將靜態(tài)數(shù)據(jù)轉(zhuǎn)換為與程序相關(guān)的數(shù)據(jù):靜態(tài)數(shù)據(jù),特別是字符串?dāng)?shù)據(jù),包含大量信息。通過混淆變換,可以將靜態(tài)數(shù)據(jù)轉(zhuǎn)換為一個(gè)函數(shù)或者一段子程序,在執(zhí)行程序的時(shí)候,可以通過程序調(diào)用生成相應(yīng)的字符串,從而增加程序的復(fù)雜程度。
2.2詞法混淆
詞法混淆是變換函數(shù)和變量的名稱,違背Java見名知義的軟件原則。詞法混淆是根據(jù)Java虛擬機(jī)規(guī)范中的類文件結(jié)構(gòu)的有關(guān)規(guī)定,混淆常量池中存儲(chǔ)的類、字段、方法以及變量等名稱的“CONSTANT_Utf8_info”類型數(shù)據(jù)。詞法混淆主要有三種方法:用名稱相同但是類型不同的字段進(jìn)行替換;有意義的標(biāo)識(shí)符用沒有任何意義的字符來替換;用Java虛擬機(jī)不限制但是Java語言禁止的字符或者字符串來代替原始的字符或者字符串。詞法變化具有單向性,不需要額外的執(zhí)行代價(jià),所以程序的復(fù)雜幾乎不受影響,在實(shí)踐中應(yīng)用比較廣泛。
詞法混淆還包括移除和改名。移除是指將程序中的注釋、調(diào)試信息等格式化信息刪除掉,這種方法具有單向性,一旦混淆無法恢復(fù),操作簡單,但是強(qiáng)度很差。改名是指將程序中的常量名、變量名等標(biāo)識(shí)符改為沒有意義的標(biāo)識(shí)符。
2.3控制混淆
1)循環(huán)條件插入變換:通過不透明謂詞把一個(gè)循環(huán)的終止條件變得更加復(fù)雜。
2)分支插入變換:對(duì)于一串語句,加入一個(gè)控制條件,增加程序的復(fù)雜程度??梢约右粋€(gè)不透明謂詞,構(gòu)造一個(gè)不會(huì)執(zhí)行的分支,或者另兩個(gè)分支上的語句都和原語句相同,從而影響后面語句的執(zhí)行。
3)將可制約的控制流轉(zhuǎn)換為不可制約的控制流:利用不透明謂詞,加入一個(gè)假分支,將一個(gè)循環(huán)變換為多個(gè)循環(huán),增加控制流圖的翻譯難度。
4)并行化代碼:并行程序比串行程序更復(fù)雜,難以被分析。使用并行技術(shù),可以構(gòu)造不透明謂詞,混淆程序的控制流??梢詫⒋谐绦虿⑿谢€可以在程序中添加代碼,增加程序的理解難度。
5)控制順序混淆:一般情況下,Java類文件包含了很多控制信息,對(duì)這些控制轉(zhuǎn)換信息進(jìn)行掩藏可以通過打亂表達(dá)式、方法的順序,增加程序的理解難度。
2.4類結(jié)構(gòu)混淆
1)類合并:類合并[3]指的是將兩個(gè)或兩個(gè)以上的類合并成一個(gè)類,包括各個(gè)類所包含的變量和函數(shù),從而破壞系統(tǒng)的類,隱藏系統(tǒng)的整體設(shè)計(jì)。根據(jù)重命名的變量和方法,如果合并的類中有相同標(biāo)識(shí)符的函數(shù)和變量,那么就將它們改為不重復(fù)的變量或函數(shù);如果合并的類中,構(gòu)造函數(shù)的標(biāo)識(shí)符和參數(shù)都是相同的,那么就增加一個(gè)偽造的參數(shù);如果合并的兩個(gè)類之間存在著繼承的關(guān)系,那么為了區(qū)分標(biāo)識(shí)符相同的函數(shù),可以增加一個(gè)布爾型的私有變量。
2)類分裂:類分裂指的是將一個(gè)類C拆分成C1和C2兩個(gè)類,并且C2是C1的子類。另外還要保證C中的變量和方法,由C1繼承或者由C2包含。
3)類型隱藏:
在Java中,除了類之外,還有接口,接口也是一種類型。通過接口,可以聲明待混淆類的變量和方法,從而實(shí)現(xiàn)類型的隱藏。另外,如果引入的所有接口只服務(wù)于一個(gè)類,那么很容易被識(shí)別,為了使自動(dòng)分析變得困難,可以使引入的接口同時(shí)為幾個(gè)類服務(wù)。
3Java程序混淆技術(shù)的算法
1)濫用標(biāo)識(shí)符混淆算法:濫用標(biāo)識(shí)符混淆算法[4]是指用同一個(gè)標(biāo)識(shí)符代替一個(gè)類中出現(xiàn)的所有標(biāo)識(shí)符,主要是通過Java中標(biāo)識(shí)符中的重命名來實(shí)現(xiàn)的。
2)重載無關(guān)聯(lián)方法算法:重載無關(guān)聯(lián)方法算法與擴(kuò)展轉(zhuǎn)換和方法重載有很大的關(guān)系。這種方法是將被混淆類中的所有實(shí)體用相同的標(biāo)識(shí)符來重命名。在Java程序中,如果某個(gè)編譯時(shí)刻通過了一個(gè)象征性的參考,那么混淆操作一定會(huì)被執(zhí)行,如果用這種方法對(duì)已操作程序反編譯,并重新執(zhí)行,就會(huì)改變程序的代碼。
3)非法標(biāo)識(shí)符替換算法:非法標(biāo)識(shí)符替換算法[5]是將程序中的普通標(biāo)識(shí)符用關(guān)鍵詞和非法字符結(jié)合的字符串或者純粹的關(guān)鍵詞來代替。這種混淆算法,很容易迷惑大多數(shù)的反編譯軟件。
4)重寫靜態(tài)方法算法:重寫靜態(tài)方法算法可以處理一些被編譯過的Java類。它的混淆變化非常細(xì)微,很難被察覺,從而增加了攻擊者的難度。
4Java程序混淆技術(shù)的應(yīng)用
1)保護(hù)DRM技術(shù)。DRM技術(shù)的安全性和關(guān)鍵數(shù)據(jù)的保護(hù)有很大的關(guān)系,采用Java程序混淆技術(shù),可以保護(hù)DRM技術(shù)的關(guān)鍵數(shù)據(jù)信息。
2)保護(hù)算法。如果開發(fā)者想要將一個(gè)新算法應(yīng)用到軟件中的時(shí)候,可以通過代碼混淆技術(shù)混淆算法的一部分,從而增加算法的理解難度,達(dá)到保護(hù)算法的目的。
3)代碼抗篡改。當(dāng)進(jìn)行網(wǎng)絡(luò)軟件操作或者執(zhí)行相關(guān)任務(wù)的時(shí)候,代碼的安全是相當(dāng)重要的。軟件設(shè)計(jì)者可以采用Java程序混淆技術(shù)保護(hù)操作軟件,防止外來用戶或者惡意主機(jī)篡改代碼。
4)病毒變種。殺毒技術(shù)的重要方法就是模式匹配。對(duì)于病毒碼,如果采用混淆技術(shù),那么就可以產(chǎn)生很多不同特征的病毒變種,威脅到網(wǎng)絡(luò)安全。
5結(jié)束語
Java程序混淆技術(shù)在不改變程序功能的基礎(chǔ)上,增加攻擊者對(duì)程序反編譯的難度,提高軟件知識(shí)產(chǎn)權(quán)的保護(hù)力度,因此混淆技術(shù)在代碼保護(hù)方面,應(yīng)用非常廣泛。今后的混淆技術(shù)不僅要加大混淆力度,提高防篡改力度,還要考慮混淆算法的運(yùn)行負(fù)擔(dān)。
參考文獻(xiàn)
[1]王建民,余志偉,王朝坤,等.Java程序混淆技術(shù)綜述[J].計(jì)算機(jī)學(xué)報(bào),2011,34(9):105-108.
[2]霍建雷.用于Java軟件保護(hù)的代碼混淆技術(shù)研究與實(shí)現(xiàn)[D].西安:西北大學(xué),2009.
[3]郭玉杰.面向Java的代碼混淆技術(shù)的研究[D].蘇州:江蘇大學(xué),2010.
[4]李新良,羅戈夕.基于Java的代碼混淆算法研究[J].湖南文理學(xué)院學(xué)報(bào):自然科學(xué)版,2010,22(3):58-62.
[5]霍建雷,范訓(xùn)禮,房鼎益.標(biāo)識(shí)符重命名混淆算法及其實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2010,36(1):99-103.