康彥
(合肥工業(yè)大學(xué),安徽 合肥 230031)
代碼混淆技術(shù)在軟件保護(hù)中的應(yīng)用研究
康彥
(合肥工業(yè)大學(xué),安徽 合肥 230031)
伴隨著越來越多的逆向工程工具的出現(xiàn),使得軟件被篡改、盜版的威脅也逐漸增大.攻擊者通過對程序的逆向工程獲取程序的重要算法和核心數(shù)據(jù).文章通過對代碼混淆技術(shù)的定義、混淆方法分類、混淆應(yīng)用和評價等方面詳細(xì)闡述代碼混淆技術(shù)在軟件保護(hù)中的實際意義和應(yīng)用,并指出了代碼混淆技術(shù)未來的發(fā)展方向.
代碼混淆;軟件保護(hù);逆向工程
隨著Internet的不斷發(fā)展,使得各種軟件的傳播越來越廣泛和迅速.隨之而來的,軟件被盜版、篡改的軟件安全問題也愈發(fā)的嚴(yán)重起來.根據(jù)《2010年度中國軟件盜版率調(diào)查報告》顯示,相對于軟件產(chǎn)品的價值盜版率達(dá)24%.同時伴隨著程序設(shè)計語言(諸如Java,.NET等)的發(fā)展,出來了許多以使用與平臺無關(guān)的中間代碼發(fā)布的軟件.其代碼與源代碼極為相似.這些軟件比起普通的二進(jìn)制代碼更易受到來自惡意用戶逆向工程和分析.伴隨這各類逆向工程技術(shù)的出現(xiàn),使得對此類軟件的保護(hù)愈發(fā)的困難.因此,對于軟件知識產(chǎn)權(quán)的保護(hù),除了使用法律外,我們還需在技術(shù)上加以保護(hù).軟件保護(hù)的技術(shù)很多,其中代碼混淆技術(shù)就是一種重要的手段.代碼混淆是指采用混淆策略對應(yīng)用程序進(jìn)行混淆變換,使得變換后的軟件功能與原程序保持一致.但是其更難以被靜態(tài)分析和篡改.
代碼混淆是一種保持語義的程序變換技術(shù),它將程序P依據(jù)一系列混淆策略k變換到P'(如圖1),使對P'進(jìn)行篡改更為困難,但是P和P'必須保證語義上的一致性,兩者在軟件功能上應(yīng)該保持相同.簡言之,代碼混淆技術(shù)中變換的是程序本身,而不是程序所描述的功能.而代碼混淆的目的是為了增大其被逆向工程的難度.通常來說,如果使用足夠多的計算、存儲資源和足夠長的時間,對一個程序進(jìn)行逆向工程總是可能的.同樣,不管使用什么樣的混淆策略也無法保證程序永遠(yuǎn)不會被逆向工程,我們所關(guān)注的是盡可能的提高混淆后程序P′逆向工程難度,使逆向工程的代價遠(yuǎn)大于其收益.從而保護(hù)軟件不被盜版或篡改.

依據(jù)代碼混淆策略和對象的不同,代碼混淆技術(shù)一般可分為名稱混淆、流程混淆、數(shù)據(jù)混淆和預(yù)防混淆等方法. 3.1名稱混淆
名稱混淆也稱為布局混淆,主要是刪除和改名.即刪除與實際執(zhí)行無關(guān)的信息和修改程序中各類標(biāo)示符的名稱.刪除主要是去除程序中的注釋與程序執(zhí)行無法使用到的代碼等.刪除之后不但可以壓縮程序的大小、提高程序加載的速度和運行效率,還可以使程序被逆向工程的難度增加.改名的意義是將表意的名稱替換為無意義的名稱.以.Net中名稱混淆為例,主要分為兩類方法:
a.名稱替換
.Net的元數(shù)據(jù)中有一個NameTable,這個表里面保存了所有類型,方法,屬性,字段等的名稱.這一類混淆的本質(zhì)就是從NameTable里面進(jìn)行一對一的名稱替換.實現(xiàn)的方式可能是多樣的.可以IL級替換,也可以直接元數(shù)據(jù)級替換,或者其它達(dá)到相同效果的方式.
b.名稱擦除、索引破壞
這類混淆只能在元數(shù)據(jù)級進(jìn)行操作,要求對元數(shù)據(jù)的全部結(jié)構(gòu)十分清楚,有一定難度.它的本質(zhì),讓名稱索引數(shù)組越界.元數(shù)據(jù)中類型,方法,屬性,字段等的定義處是通過一個整形的index值指向NameTable的,index所對應(yīng)的字符串就是它的名稱.這類混淆就是直接修改這個index值,如將它改為-1.如果還要進(jìn)一步做,可以再刪除NameTable中無用的字符串,以及刪除NameTable有用但重復(fù)的字符串.再修改索引,讓名稱相同的指向同一個字符串.
名稱混淆是最基礎(chǔ)的混淆技術(shù),大多數(shù)代碼混淆工具都不同程度地使用到此類技術(shù).
3.2 流程混淆
流程混淆指的是對程序的執(zhí)行流程進(jìn)行混淆變換,使得程序的執(zhí)行流程變得難以理解,增大逆向工程的難度,一般情況下,在對程序執(zhí)行流程進(jìn)行混淆時,需要加入一些冗余的流程和計算,這樣勢必會導(dǎo)致程序執(zhí)行效率的下降.因此,在使用流程混淆時,我們需要根據(jù)程序的執(zhí)行效率的不同要求來設(shè)計不同程度的混淆策略.流程混淆技術(shù)大致可以分為如下兩類:
a.增加混淆控制
通過添加冗余的、復(fù)雜的程序流程,可以在不改變程序語義的情況下,增加其被逆向工程的難度.例如,原程序中相鄰的兩個基本語句塊A和B,因兩者中間沒有任何控制轉(zhuǎn)移語句.
其執(zhí)行順序一定是依次發(fā)生.下圖中我們通過在兩者之間增加不同的跳轉(zhuǎn)控制條件,已決定后者的執(zhí)行.在圖中我們能發(fā)現(xiàn)雖然流程更加復(fù)雜了,但所增加的跳轉(zhuǎn)控制并沒有影響語句塊B的執(zhí)行.

b.控制流重組
控制流重組是指將原程序中控制流在語義不變的前提下進(jìn)行重新組織.如,可將一個被調(diào)用的方法直接嵌入到調(diào)用方法中,反過來,方法中一段基本語句塊也可轉(zhuǎn)換成一個新的方法,調(diào)用之.通過此類變換后,原程序的控制流程圖被不同程度的破壞,使得系統(tǒng)的總體框架變得很難理解,從來提供程序的混淆強(qiáng)度.
3.3 數(shù)據(jù)混淆
數(shù)據(jù)混淆主要是對程序中的重要數(shù)據(jù)進(jìn)行混淆處理,對程序中的數(shù)據(jù)結(jié)構(gòu)進(jìn)行轉(zhuǎn)換,以不規(guī)律的方式組織數(shù)據(jù),從而增加程序逆向工程的難度.常用的方法有以下幾種:
a.動態(tài)生成靜態(tài)數(shù)據(jù)
程序中靜態(tài)數(shù)據(jù),如字符串常量等,極易被逆向工程獲取,可以利用函數(shù)動態(tài)生成的進(jìn)行代替.對靜態(tài)數(shù)據(jù)進(jìn)行動態(tài)生成提高了逆向工程的難度,同時也會帶來一定的程序執(zhí)行效率的降低.在實際應(yīng)用中因適當(dāng)選擇.
b.轉(zhuǎn)換數(shù)組組織
數(shù)組是高級程序設(shè)計語言中最簡單、最常用的一種數(shù)據(jù)結(jié)構(gòu).對于數(shù)組的混淆包括將大數(shù)組拆分為若干小數(shù)組,合并若干小數(shù)組為一個數(shù)組或修改數(shù)組的維數(shù).對數(shù)組結(jié)構(gòu)使用適當(dāng)?shù)霓D(zhuǎn)換,可以隱藏數(shù)組數(shù)據(jù)所代表的實際含義.
c.轉(zhuǎn)換類結(jié)構(gòu)
類結(jié)構(gòu)的轉(zhuǎn)換是指合并類、分裂類和類型隱蔽.類合并是將代碼中的2個或多個類合并成一個類,從而改變類之間原來的關(guān)系,隱蔽程序設(shè)計的思路.如果有必要,甚至可以將程序中所有的類都合并成一個類.類的分裂是將一個初始的類轉(zhuǎn)換成2個或以上個新類來代替.類型隱蔽主要是利用如Java、.Net中的接口(interface)進(jìn)行類型映射操作來實現(xiàn). 3.4預(yù)防混淆
預(yù)防混淆一般是根據(jù)一些已有反編譯器的特點而設(shè)計的特殊混淆方法.已有的反編譯器基本上都存在弱點或者Bug.利用好這些漏洞,就可以很好的提高程序的反編譯強(qiáng)度.如VS.Net中自帶的混淆器Dotfuscator就包含有針對反編譯器ILDASM的預(yù)防混淆策略.
4.1 應(yīng)用
代碼混淆技術(shù)應(yīng)用很廣泛,目前,主要應(yīng)用于以下4個領(lǐng)域:
(1)關(guān)鍵算法保護(hù).對于程序中重要的算法采用必要的代碼混淆,以確保算法策略不被攻擊者分析獲取,防止程序被惡意攻擊或篡改.
(2)軟件知識產(chǎn)權(quán)保護(hù).隨著網(wǎng)絡(luò)軟件和移動應(yīng)用迅速發(fā)展,軟件盜版也愈發(fā)的嚴(yán)重,使用代碼混淆技術(shù)可以提高軟件的逆向工程難度,是保護(hù)軟件知識產(chǎn)權(quán)的有效技術(shù)手段之一.
(3)惡意代碼取證.在網(wǎng)絡(luò)信息取證中,惡意代碼通過代碼混淆產(chǎn)生多種變種,給計算機(jī)信息安全帶來許多新的挑戰(zhàn).所以,研究惡意代碼所使用的代碼混淆技術(shù),對于惡意代碼的特征提取就有著非常重要的意義.
4.2 評價
如何評價代碼混淆的效果,通常從強(qiáng)度(Potency)、彈性(Resilience)、代價(Cost)、隱蔽性(Stealth)等4個方面來評價:
(1)強(qiáng)度.指經(jīng)過混淆交換后的程序被逆向工程的復(fù)雜程度.一般來說,增加代碼的長度;增加程序控制結(jié)構(gòu)中的分支數(shù)、循環(huán)嵌套數(shù)及函數(shù)調(diào)用的深度;加大類的繼承高度等方法都可以提高代碼混淆變換的強(qiáng)度.
(2)彈性.指經(jīng)過混淆變換后的程序?qū)Ψ椿煜ぞ叩牡挚苟?它包括以下兩個方面,一個是反混淆工具編寫者編碼所需的代價,另一個方面是反混淆工具運行所需要的時空代價.
(3)代價.指經(jīng)過混淆變換后的程序在執(zhí)行時和原程序相比所增加的時間和空間的額外消耗.
(4)隱蔽性.是指經(jīng)過混淆變換后的程序與原程序之間的相似程度.
綜上所述,通過適當(dāng)?shù)拇a混淆變換,加大了程序被逆向工程的難度,一定程度上起保護(hù)了軟件不被惡意篡改,保護(hù)了軟件的知識產(chǎn)權(quán).提高惡意用戶通過分析程序獲取軟件重要數(shù)據(jù)和算法的難度.但代碼混淆技術(shù)尚處于發(fā)展階段,缺乏相應(yīng)的理論基礎(chǔ),沒有準(zhǔn)確的度量代碼混淆算法有效性的評估模型.在以后發(fā)展中,我們將需要一套完整的理論體系和相應(yīng)的度量與評價模型.和其他軟件保護(hù)技術(shù)結(jié)合起來,為軟件安全提供更為有效的保護(hù).
〔1〕Collberg C,Thomborson C,Low D.A taxonomy of obfuscating transformations.Technical Report 148,University of Auckland.1997.
〔2〕A.Barak,O.Goldreich,R.Impagliazzo,S.Rudich,A.Sahai,S. Vadhan,And K.Yang.On the(im)possibility of software obfuscation.Crypto01.2001.
〔3〕羅宏,蔣劍琴,曾慶凱.用于軟件保護(hù)的代碼混淆技術(shù)[J].計算機(jī)工程,2006(11).
〔4〕王一賓,陳意云.代碼迷惑技術(shù)研究進(jìn)展[J].吉林大學(xué)學(xué)報(信息科學(xué)版),2008(04).
TP393
A
1673-260X(2014)03-0017-02