国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Java的代碼混淆算法研究

2010-05-09 07:51李新良羅戈夕
關(guān)鍵詞:重命名標(biāo)識(shí)符字節(jié)

李新良,羅戈夕

?

基于Java的代碼混淆算法研究

李新良1,羅戈夕2

(1. 婁底職業(yè)技術(shù)學(xué)院 電子信息工程系, 湖南 婁底, 417000; 2. 漣源鋼鐵集團(tuán)有限公司 信息自動(dòng)化中心, 湖南 婁底, 417000)

首先介紹了混淆技術(shù)的現(xiàn)狀、原理及分類,然后對(duì)標(biāo)識(shí)符重命名的4種算法進(jìn)行了深入研究,通過(guò)對(duì)算法的偽代碼和性能分析,證明了4種混淆算法具有很好的混淆效果,能夠很好地保護(hù)Java軟件,為Java軟件的反編譯和逆向工程提高了程序復(fù)雜度、抗攻擊能力,且不增加程序額外的執(zhí)行開(kāi)銷. 本文研究的算法對(duì)移動(dòng)代碼和軟件知識(shí)產(chǎn)權(quán)的保護(hù)能起到積極作用.

反編譯;代碼混淆;標(biāo)識(shí)符重命名混淆

在分布式計(jì)算環(huán)境下,一個(gè)軟件系統(tǒng)可能被部署在多臺(tái)主機(jī)上,而這些主機(jī)并不能保證都是完全可信賴的. 在惡意主機(jī)環(huán)境下,軟件系統(tǒng)可以被逆向工程或被篡改,其機(jī)密性、完整性與可用性受到威脅. 為了防止惡意主機(jī)對(duì)移動(dòng)代理[1]有目的的篡改,代碼混淆技術(shù)被提出,其基本做法是使用代碼混淆技術(shù)對(duì)軟件的代碼進(jìn)行混淆變換,使混淆變換后代碼的分析難度增加,從而在一定程度上阻止對(duì)軟件的篡改. 代碼混淆技術(shù)實(shí)際上是一種用于對(duì)移動(dòng)代碼保護(hù)和軟件知識(shí)產(chǎn)權(quán)進(jìn)行保護(hù)的安全技術(shù). 在實(shí)際應(yīng)用中,對(duì)軟件提供絕對(duì)的安全保護(hù)是不可能,也是沒(méi)有必要的,只要能使攻擊者的攻擊付出較高的代價(jià),就可以認(rèn)為混淆技術(shù)達(dá)到了安全保護(hù)的作用. 因此,代碼混淆技術(shù)就成為保護(hù)Java軟件的有效且容易實(shí)現(xiàn)的保護(hù)技術(shù). 通過(guò)對(duì)Java字節(jié)碼混淆技術(shù)進(jìn)行研究,可以保護(hù)Java軟件開(kāi)發(fā)者的知識(shí)產(chǎn)權(quán),并保障信息安全. 同時(shí)在研究過(guò)程中發(fā)現(xiàn)新問(wèn)題,在解決新問(wèn)題的過(guò)程中也可以推動(dòng)計(jì)算機(jī)科學(xué)的發(fā)展.

1 國(guó)內(nèi)外混淆技術(shù)研究現(xiàn)狀

對(duì)代碼混淆技術(shù)的研究始于上世紀(jì)90年代,由Java語(yǔ)言的迅速發(fā)展而引起. 從1997年開(kāi)始Collbe- rg等人[2]就對(duì)代碼混淆技術(shù)進(jìn)行了深入的基礎(chǔ)性研究,并陸續(xù)發(fā)表了多篇文章,后來(lái)又有更多的人加入到代碼混淆技術(shù)研究的隊(duì)伍中,他們提出了許多好的混淆算法和研究方向,對(duì)代碼混淆技術(shù)的發(fā)展起到了重要的作用. Collberg等人[2]給出了代碼混淆變換的各種類型,以及代碼混淆算法構(gòu)造的具體過(guò)程,同時(shí)實(shí)現(xiàn)了針對(duì)Java字節(jié)碼的混淆算法,后來(lái)Kelly等人[3]構(gòu)造了一種混淆執(zhí)行體機(jī)制,可以自動(dòng)實(shí)現(xiàn)構(gòu)造代碼混淆算法,Tyma等人[3]根據(jù)Java語(yǔ)言的特點(diǎn),提出了一種新的外形混淆技術(shù).

最近國(guó)內(nèi)的一些學(xué)者也認(rèn)識(shí)到代碼混淆技術(shù)在軟件保護(hù)方面的重要性,并做了一些研究,比如,李永祥等人[4]提出并實(shí)現(xiàn)了多分支語(yǔ)句的控制流迷惑技術(shù)和基于函數(shù)指針數(shù)組的迷惑技術(shù),李長(zhǎng)青[5]等人提出了執(zhí)行流重整混淆算法,高鷹[6]等人提出了基于抽象解釋的代碼迷惑有效性比較框架.同時(shí)也有一些學(xué)?;蚪M織對(duì)代碼混淆技術(shù)進(jìn)行了研究和探索,如西北大學(xué)[7]、北京交通大學(xué)[8]、北京郵電大學(xué)[9]等. 目前對(duì)代碼混淆的研究工作主要是基于軟件保護(hù)的.

從上面介紹的國(guó)內(nèi)外混淆技術(shù)的研究現(xiàn)狀可以看出,由于代碼混淆技術(shù)重要的應(yīng)用前景使得越來(lái)越多的計(jì)算機(jī)科學(xué)工作者認(rèn)識(shí)到了它的重要性,并且已經(jīng)做了大量的研究,我們相信在不久的將來(lái)會(huì)有越來(lái)越多的人和機(jī)構(gòu)參與到代碼混淆技術(shù)研究的隊(duì)伍中來(lái).

本文提出基于標(biāo)識(shí)符重命名混淆技術(shù),并提出4種標(biāo)識(shí)符重命名混淆算法,包括濫用標(biāo)識(shí)符、重載無(wú)關(guān)聯(lián)方法、非法標(biāo)識(shí)符替換以及重寫靜態(tài)方法. 對(duì)混淆算法功能有效性和產(chǎn)生的性能過(guò)載進(jìn)行簡(jiǎn)單分析,使用該技術(shù)能使攻擊者的攻擊付出較高的代價(jià),從而達(dá)到了安全保護(hù)目的.

2 軟件混淆技術(shù)介紹

2.1 混淆變換原理

代碼混淆技術(shù)是一種重要的軟件保護(hù)方法,其實(shí)質(zhì)是指對(duì)應(yīng)用程序P進(jìn)行保持語(yǔ)義的變換T,使得變換后的程序P′和原來(lái)的程序P具有相同的功能,即如果P錯(cuò)誤地終止或不能終止,則P′也錯(cuò)誤地終止或不能終止,否則,P′必須終止且產(chǎn)生與P相同的輸出結(jié)果,經(jīng)過(guò)混淆后的P′則更難被靜態(tài)分析和逆向工程所攻擊[10]. 具體的原理如圖1所示. 由圖1可以看出,混淆后程序P′由源程序P經(jīng)混淆變換T處理后得到,在對(duì)P′和P給予相同的輸出A后都得到了相同的輸出B,在這種情況下,源程序P的任何非功能性信息都被丟失,從而增加了對(duì)程序的分析難度,有效地保護(hù)了軟件.

圖1 混淆變換原理圖

2.2 代碼混淆的性能指標(biāo)

對(duì)程序作混淆變換后的效果如何,通常從強(qiáng)度(potency)、耐受性(resilience)、開(kāi)銷(cost)、隱蔽性(stealth)等4個(gè)方面來(lái)評(píng)估. 強(qiáng)度是指混淆變換究竟給原始的程序加上了多大的復(fù)雜度; 耐受性是指變換后的程序?qū)κ褂米詣?dòng)去混淆工具進(jìn)行攻擊的抵抗度; 開(kāi)銷是指經(jīng)過(guò)混淆變換后的程序在執(zhí)行時(shí)由變換所帶來(lái)的額外執(zhí)行時(shí)間和所需存儲(chǔ)空間開(kāi)銷; 隱蔽性是與程序的上下文高度相關(guān)的.

2.3 混淆的分類

根據(jù)混淆對(duì)象和原理的不同,可將代碼混淆技術(shù)分為外形混淆、數(shù)據(jù)混淆、控制混淆和預(yù)防混淆4種.

外形混淆. 外形混淆的基本原理是對(duì)函數(shù)和變量的名稱進(jìn)行替換,使其違背見(jiàn)名知義的軟件工程原則,從而達(dá)到增大攻擊難度的目的. 外形混淆是當(dāng)前Java混淆器所使用的典型方法. 這種混淆變換去除了Java類文件中所包含的源代碼格式信息,它是一種“單向”變換,因?yàn)樽畛醯母袷叫畔⒁坏┍灰瞥?,就無(wú)法再次恢復(fù). 由于這種變換沒(méi)有任何額外執(zhí)行代價(jià),因此程序的時(shí)間和空間復(fù)雜度將不會(huì)受到任何影響. 目前的Java字節(jié)碼混淆工具大多支持這一功能,可見(jiàn)外形混淆具有良好的可行性. 外形混淆有很多分類,其中標(biāo)識(shí)符重命名混淆是它的一個(gè)很重要的分支. 標(biāo)識(shí)符重命名技術(shù)的基本原理是使用簡(jiǎn)單無(wú)意義的名字或特殊的名字替換源程序字節(jié)碼中的標(biāo)識(shí)符. 在本文下面的章節(jié)中將主要研究這種標(biāo)識(shí)符重命名混淆技術(shù).

數(shù)據(jù)混淆. 數(shù)據(jù)混淆是利用數(shù)據(jù)流分析中難點(diǎn)問(wèn)題,向程序中引入引起程序分析精度降低或難度增加的一些因素,從而影響對(duì)程序的分析結(jié)果. 由于正常的程序以符合邏輯的方式來(lái)組織數(shù)據(jù),因此為了增加攻擊者獲取信息的難度,實(shí)現(xiàn)對(duì)程序的有效混淆,數(shù)據(jù)混淆將不對(duì)程序的代碼進(jìn)行特意修改, 只針對(duì)程序中出現(xiàn)的各種數(shù)據(jù)結(jié)構(gòu)進(jìn)行變換.

控制混淆. 控制混淆是一種被廣泛使用的代碼混淆方法,其基本原理是通過(guò)改變程序的判斷條件, 或向程序中添加可控的判斷條件來(lái)增加程序的復(fù)雜度, 并且可以通過(guò)對(duì)程序的結(jié)構(gòu)和執(zhí)行流程的調(diào)

整來(lái)增加反編譯工具對(duì)程序的反編譯時(shí)間.

預(yù)防混淆. 預(yù)防混淆通常針對(duì)一些專用的反編譯工具而設(shè)計(jì). 一般情況下,預(yù)防混淆技術(shù)利用反編譯工具的弱點(diǎn)來(lái)設(shè)計(jì)混淆方案.

下面對(duì)4種混淆技術(shù)進(jìn)行簡(jiǎn)單的分析,外形混淆主要應(yīng)用于迷惑解讀程序的攻擊者,同時(shí)在抵抗反編譯工具領(lǐng)域也起到一定作用;數(shù)據(jù)混淆目前主要針對(duì)的是對(duì)布爾變量的替換;控制混淆是應(yīng)用比較廣泛的一種混淆技術(shù),主要是通過(guò)增加程序的復(fù)雜度來(lái)增強(qiáng)程序的抗攻擊能力;預(yù)防混淆是針對(duì)不同的反編譯軟件而設(shè)計(jì)的.

數(shù)據(jù)混淆和控制混淆為了提高混淆后程序的復(fù)雜度,通常都會(huì)在程序中引入大量的布爾變量或源程序以外的結(jié)構(gòu),大大增加了程序的代碼量和程序的時(shí)空?qǐng)?zhí)行開(kāi)銷,雖然也增加了程序抗攻擊性, 但程序的執(zhí)行效率也大大降低. 而一般的外形混淆技術(shù)雖然沒(méi)有增加程序的執(zhí)行開(kāi)銷,但程序的復(fù)雜度卻不高.

因此,根據(jù)上面的分析,本文將研究一種既能提高程序抗攻擊能力,同時(shí)也不會(huì)降低程序執(zhí)行效率的混淆技術(shù),即標(biāo)識(shí)符重命名混淆技術(shù),該混淆技術(shù)是外形混淆的一個(gè)重要研究方向.

3 標(biāo)識(shí)符重命名混淆算法研究

標(biāo)識(shí)符重命名混淆的基本原理是使用簡(jiǎn)單無(wú)意義的名字替換字節(jié)碼文件中的類名、接口名、方法名以及字段名等. 當(dāng)前的標(biāo)識(shí)符重命名混淆技術(shù)只對(duì)字節(jié)碼中的標(biāo)識(shí)符進(jìn)行簡(jiǎn)單的名字替換,雖然沒(méi)有引入額外的執(zhí)行開(kāi)銷,但抗攻擊能力不高. 為了彌補(bǔ)以上情況的不足,本節(jié)將提出4種標(biāo)識(shí)符重命名混淆算法,這4種混淆算法具有較高的抗攻擊能力,同時(shí)也不會(huì)帶來(lái)額外的執(zhí)行開(kāi)銷.

3.1 重命名的目的

重命名方法的目的是使大型的Java程序更難理解或者更難被反編譯,但不會(huì)引入程序的額外執(zhí)行開(kāi)銷. 首先,這些原始的標(biāo)識(shí)符被一些無(wú)意義或者混亂的標(biāo)識(shí)符代替,使得攻擊者要想恢復(fù)這些原始的標(biāo)識(shí)符變得不可能,因?yàn)楦鷺?biāo)識(shí)符相關(guān)的信息在重命名后完全消失. 另外,這種方法也使得一個(gè)反編譯器將字節(jié)碼文件轉(zhuǎn)換成Java源代碼變得很困難甚至不可能,或者使被反編譯的源代碼不能被重新編譯. 在這2種情況下,對(duì)標(biāo)識(shí)符進(jìn)行重命名并不會(huì)影響被混淆程序的行為.

3.2 代碼混淆的范圍

代碼混淆的范圍即在一個(gè)應(yīng)用程序中能被混淆工具混淆的那部分代碼就是程序的混淆范圍,一般情況下只有程序員自己開(kāi)發(fā)的代碼部分才會(huì)被保護(hù),而標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)中的代碼不會(huì)被保護(hù). 但是混淆的范圍并不會(huì)只局限于程序員自己寫的代碼部分,而用到的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)中的代碼也可以被包含到混淆的范圍中,但需要取得標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)的所屬組織或個(gè)人的同意. 默認(rèn)情況下,參數(shù)標(biāo)識(shí)符和本地變量不在這一混淆系列中,因?yàn)楫?dāng)字節(jié)碼被編譯的時(shí)候這些信息將會(huì)被剝離掉. 一個(gè)程序的混淆范圍可以通過(guò)對(duì)程序中所有的標(biāo)識(shí)符分組來(lái)建立,然后剔除掉那些在重命名后會(huì)帶來(lái)錯(cuò)誤或者誤差行為的標(biāo)識(shí)符.

3.3 標(biāo)識(shí)符重命名混淆算法

以前提到的基于標(biāo)識(shí)符重命名的混淆技術(shù)所使用的普遍方法是,盡可能重復(fù)地使用相同的標(biāo)識(shí)符來(lái)重命名在Java字節(jié)碼混淆范圍內(nèi)的標(biāo)識(shí)符. 由于這些標(biāo)識(shí)符的冗余度,攻擊者很難理解被反編譯的程序. 此外,通過(guò)檢查使用同一標(biāo)識(shí)符的無(wú)關(guān)實(shí)體, 反編譯器也會(huì)被欺騙. 我們所期望的效果是, 現(xiàn)存的反編譯技術(shù)很難或者完全不能對(duì)混淆過(guò)的程序反編譯,因此攻擊者不得不花費(fèi)更多時(shí)間去理解和手工調(diào)試被反編譯的程序. 事實(shí)上,可以通過(guò)靈巧地對(duì)Java字節(jié)碼中標(biāo)識(shí)很難或者完全不能對(duì)混淆過(guò)的程序反編譯,因此攻擊者不得不花費(fèi)更多時(shí)問(wèn)去理解和手工調(diào)試被反編譯的程序. 事實(shí)上, 可以通過(guò)靈巧地對(duì)Java字節(jié)碼中標(biāo)識(shí)符重命名來(lái)達(dá)到這樣的效果. 因此本節(jié)提出了4種標(biāo)識(shí)符重命名算法. 表1給出了4種算法偽代碼實(shí)現(xiàn)中用到的主要符號(hào).

表1 算法中使用的主要符號(hào)

(續(xù)表1)

3.3.1 濫用標(biāo)識(shí)符算法

Java源程序被編譯成Java字節(jié)碼后仍然保留著類、接口、方法等的名字信息,而字節(jié)碼被反編譯后這些名字信息依然清晰可見(jiàn)(例如方法名:getNa- me),因此攻擊者很容易讀懂反編譯后的程序. 為了阻止解讀程序的靜態(tài)攻擊者,就需要對(duì)字節(jié)碼中的標(biāo)識(shí)符進(jìn)行重命名,因此就出現(xiàn)了濫用標(biāo)識(shí)符混淆技術(shù)[5]. 濫用標(biāo)識(shí)符混淆技術(shù)是通過(guò)對(duì)Java字節(jié)碼中的標(biāo)識(shí)符重命名來(lái)實(shí)現(xiàn)的,其目的是最大限度地重復(fù)使用同一個(gè)標(biāo)識(shí)符代替一個(gè)類中出現(xiàn)的所有標(biāo)識(shí)符. 該策略之所以能夠迷惑攻擊者,是因?yàn)楣粽卟坏貌蝗ダ斫獗环淳幾g程序中出現(xiàn)的每個(gè)標(biāo)識(shí)符的行為,同時(shí),標(biāo)識(shí)符所表示的意思跟它出現(xiàn)的上下文有關(guān). 濫用標(biāo)識(shí)符算法使用隨機(jī)生成的名字替換混淆范圍內(nèi)的標(biāo)識(shí)符,隨機(jī)生成名字的機(jī)制是:首先使用隨機(jī)生成的單個(gè)字母進(jìn)行替換,如果同一個(gè)包中類的個(gè)數(shù)大于能夠使用的字母?jìng)€(gè)數(shù),則剩余類中的標(biāo)識(shí)符將會(huì)使用2個(gè)字母的隨機(jī)組合進(jìn)行替換,以此類推,使用3個(gè)字母、4個(gè)字母以及更多個(gè)字母的隨機(jī)組合進(jìn)行替換. 隨機(jī)生成的名字根本沒(méi)有規(guī)律可循,因此提高了靜態(tài)攻擊的難度,延長(zhǎng)程序破解的時(shí)間. 下面是算法的偽代碼實(shí)現(xiàn):

算法1:

輸入:混淆前程序

輸出:混淆后程序

l Foreach C in P //遍歷每個(gè)包中的類或接口

2 s=random() //隨機(jī)生成名字

3 Replace C with S //使用S替換遍歷過(guò)的每個(gè)類或接口名

4 Put C<->s into mapping文件//保存映射關(guān)系

5 Foreach m in C//遍歷類或接口C中的所有成員

6 Replace m with s //用s替換遍歷到的m

7 Put m<->s into mapping文件

8 Foreach t in S //遍歷繼承關(guān)系集合S

9 If t equals m //如果m和t具有繼承關(guān)系

10 Replace t 對(duì)應(yīng)的子類或超類with S //用上面生成S替換t

11 Put t<->s into mapping文件

12 根據(jù)mapping文件更新跟混淆內(nèi)容有關(guān)的字節(jié)碼文件和重寫P

13 end

3.3.2 重載無(wú)關(guān)聯(lián)方法算法

重載無(wú)關(guān)聯(lián)方法的混淆方法,通過(guò)使用相同的標(biāo)識(shí)符重命名被混淆類中的所有實(shí)體方法實(shí)現(xiàn),這種方法在任何情況下都適用. 而這種改變并不影響字節(jié)碼的行為,因?yàn)镴ava程序中的方法實(shí)體,在執(zhí)行混淆操作之前的某個(gè)編譯時(shí)刻通過(guò)一個(gè)象征性的參考, 必然會(huì)被執(zhí)行. 相反,如果用這種混淆方法操作過(guò)的程序被反編譯并被重新編譯執(zhí)行時(shí),這種改變將會(huì)徹底改變程序的行為.

為了解釋上面這種情況,假設(shè)在源代碼中有這樣的方法,這些方法的名字截然不同,但參數(shù)類型和個(gè)數(shù)完全相同. 通過(guò)對(duì)這些方法用相同的名字重命名后,這些方法將變成重載方法. 現(xiàn)在,重新編譯的時(shí)侯,源代碼中這些重載方法被處理時(shí)將會(huì)變得很棘手,此時(shí),Java編譯器不得不選擇那些能夠和參數(shù)類型完全匹配的重載方法. 事實(shí)上,并不能保證原始(即正確)的方法會(huì)被編譯器選擇,因?yàn)榭赡軙?huì)有和輸入類型能夠更好匹配的其它方法存在. 重載無(wú)關(guān)聯(lián)方法的混淆算法不僅使類中的方法具有了重載關(guān)系,同時(shí)避免了破壞超類和子類之間的繼承關(guān)系. 下面是該算法的偽代碼實(shí)現(xiàn).

算法2:

輸入:混淆前程序

輸出:混淆后程序

1 Foreach C in P //遍歷每個(gè)包中的類或接口

2 s=random() //隨機(jī)生成名字

3 Replace C with s //用s替換類或接口名

4 Put C<->s into mapping文件//保存映射關(guān)系

5 Foreach m in C

6 Replace m with s //用S替換類成員

7 Put m<->s into mapping文件

8 根據(jù)集合O,將具有重寫關(guān)系的方法用上面生成的S代替

9 根據(jù)mapping文件更新跟混淆內(nèi)容有關(guān)的字節(jié)碼文件和重寫P

10 End

3.3.3 非法標(biāo)識(shí)符替換算法

前面提出的2種標(biāo)識(shí)符混淆算法增加了攻擊者對(duì)程序的解讀難度, 下面提出的標(biāo)識(shí)符混淆算法將會(huì)增加反編譯工具的反編譯難度. 非法標(biāo)識(shí)符替換合法標(biāo)識(shí)符的混淆算偽代碼實(shí)現(xiàn)如下.

算法3:

輸入:混淆前程序

輸出:混淆后程序

l Foreach C in P //遍歷每個(gè)包中的類或接口

2 p=produce(key[],Illeagal[]) //生成關(guān)鍵字跟非法字符串結(jié)合的名字

3 Replace C with P //名字替換

4 Put C<->p into mapping文件∥保存映射關(guān)系

5 Foreach m in C

6 Replace m with P //使用P替換類成員

7 Put m<->p to mapping文件

8 根據(jù)mapping文件更新跟混淆內(nèi)容有關(guān)的字節(jié)碼文件和重寫P

9 End

3.3.4 重寫靜態(tài)方法算法

Java語(yǔ)言規(guī)范規(guī)定,超類中的靜態(tài)方法不能被子類中的實(shí)體方法重寫,相反,超類中的實(shí)體方法也不能被子類中的靜態(tài)方法重寫. 而Java字節(jié)碼中并沒(méi)有這種限制,在這種情況下,靜態(tài)方法和實(shí)例方法之間不存在任何模棱兩可,因?yàn)镴ava虛擬機(jī)使用不同的指令來(lái)調(diào)用它們中的任意一個(gè). 因此,在這種情況下出現(xiàn)了重寫靜態(tài)方法的混淆算法,對(duì)靜態(tài)方法重命名的混淆方法,會(huì)處理一系列被編譯過(guò)的Java類,并且在任何可能的情況下,都可以使用定義在一個(gè)超類以及具有相同數(shù)量和形參的實(shí)例方法的名字來(lái)重命名靜態(tài)方法. 反編譯存在實(shí)例方法被靜態(tài)方法重寫的混淆代碼,將會(huì)產(chǎn)生一種不正確的Java源代碼.

以前提出的重寫靜態(tài)方法的策略,僅僅單純地使用實(shí)例方法或靜態(tài)方法重寫超類或子類中的靜態(tài)方法或?qū)嶓w方法,雖然也增加了反編譯工具的破解難度,但仍然容易被有經(jīng)驗(yàn)的攻擊者覺(jué)察. 而本文提出的重寫靜態(tài)方法混淆算法在此基礎(chǔ)之上對(duì)重寫的方法進(jìn)行了修改,使得修改后的重寫方法稍微不同于被重寫的方法,這種細(xì)微的修改使得混淆變化不易被察覺(jué),這樣也就額外地增加了靜態(tài)攻擊者的難度. 下面是重寫靜態(tài)方法混淆算法的偽代碼實(shí)現(xiàn):

算法4:

輸入:混淆前程序

輸出:混淆后程序

1 Foreach t in S //遍歷繼承關(guān)系集合中的類t

2 Foreach s_m in t //遍歷類t中的靜態(tài)或?qū)嶓w方法

3 If s_m is 靜態(tài)方法and u_m 存在//如果s_m是靜態(tài)方法并且跟t對(duì)應(yīng)的子類中存在相同簽名的實(shí)體方法

4 s=random() //生成隨機(jī)名字

5 Replace u_m and s_m with S //使用相同的名字替換u_m和s_m

6 Put s<->u_m and s<->s_m to mapping文件

7 else

8 If s_m is靜態(tài)(或?qū)嶓w)方法//如果u_m不存在

9 s_m’=produceFakeMethod(s_m) //偽造同s_m相似的方法

10 Add s_m’to t’ //將偽造的方法插入到類t的超類或子類t’中

11 根據(jù)mapping文件更新跟混淆內(nèi)容有關(guān)的字節(jié)碼文件和重寫P

12 End

3.4 算法分析

程序執(zhí)行開(kāi)銷是衡量一個(gè)混淆方法性能好壞的重要指標(biāo). 本文提出的濫用標(biāo)識(shí)符混淆算法和重載無(wú)關(guān)聯(lián)方法混淆算法,主要致力于消除字節(jié)碼常量池中的象征性信息,而非法標(biāo)識(shí)符替換和重寫靜態(tài)方法這2種混淆算法將會(huì)使被反編譯的程序產(chǎn)生語(yǔ)法和語(yǔ)義錯(cuò)誤. 前兩種混淆算法主要是針對(duì)靜態(tài)攻擊而設(shè)計(jì)的,由它們混淆過(guò)的字節(jié)碼被反編譯后生成的代碼對(duì)于解讀程序的攻擊者來(lái)說(shuō)更難理解, 同時(shí)由于使用簡(jiǎn)短的名字代替原來(lái)的名字,字節(jié)碼文件變得更小. 后2種混淆算法主要是針對(duì)反編譯工具而設(shè)計(jì)的,被這2種算法混淆過(guò)的字節(jié)碼被反編譯且重新編譯的時(shí)候會(huì)產(chǎn)生編譯錯(cuò)誤,以至攻擊者不得不花費(fèi)大量的時(shí)間和精力調(diào)試被反編譯的程序.

因此,本文提出的混淆算法在保證混淆后程序復(fù)雜度的前提下,減小了字節(jié)碼大小和程序的加載時(shí)間,最終降低程序的執(zhí)行開(kāi)銷.

4 結(jié)論

本文首先分析了代碼混淆技術(shù)的現(xiàn)狀、原理及分類,指出了標(biāo)識(shí)符重命名混淆技術(shù)的目的, 然后介紹了重命名混淆的范圍. 最后提出了濫用標(biāo)識(shí)符、重載無(wú)關(guān)聯(lián)方法、非法標(biāo)識(shí)符替換和重寫靜態(tài)方法4種標(biāo)識(shí)符重命名混淆算法. 通過(guò)對(duì)提出算法的性能分析,證明了4種混淆算法具有很好的混淆效果,因此能夠很好地保護(hù)Java軟件.

[1] 朱正平. 移動(dòng)代理安全之代碼迷惑技術(shù)研究[D]. 南寧:廣西大學(xué),2006.

[2] Collberg C, Thomborson C, Low D. A Taxonomy of Obfuscating Transformations[R]. New Zealand: DePt. of Computer Science,University of Auckland, 1997.

[3] Barak B, Goldreich O, Impagliazzo R, et al. On the (Im) possibility of obfuscating Programs[A]. Advances in Cryptology-Crypto 2001[C]. USA: Springer-Verlag, 2001: 57-59.

[4] 李永祥. 代碼迷惑技術(shù)研究[D]. 合肥: 中國(guó)科學(xué)技術(shù)大學(xué), 2005.

[5] 李長(zhǎng)青,李曉永,韓臻. 基于控制轉(zhuǎn)換的軟件保護(hù)研究[J]. 信息安全與通信保密, 2006(10): 146-149.

[6] 高鷹, 陳意云. 基于抽象解釋的代碼迷惑有效性比較框架[J]. 計(jì)算機(jī)學(xué)報(bào), 2007, 30(5): 806-808.

[7] 宋亞奇. 基于代碼混淆的軟件保護(hù)技術(shù)研究[D]. 西安:西北大學(xué), 2005.

[8] 李長(zhǎng)青. 基于控制轉(zhuǎn)換的混淆器構(gòu)造[D]. 北京: 北京交通大學(xué), 2006.

[9] 王飛. Java軟件保護(hù)技術(shù)研究及實(shí)現(xiàn)[D]. 北京: 北京郵電大學(xué), 2007.

[10] 刁俊峰. 軟件安全中的若干關(guān)鍵技術(shù)研究[D]. 北京: 北京郵電大學(xué), 2007.

The study of Java code obfuscation algorithm

LI Xin- liang1, LUO Ge-xi2

(1. Departmen of Electronic and Information Engineering, Loudi Vocational and Technical College, Loudi 417000,China; 2. Information Center, Lianyuan Steel Co.Ltd, Loudi 417000,China)

The status of confusing technology, principles and classification was introduced, and then the identifier rename the four algorithm was studied deeply. Based on the algorithm of pseudo-code and performance analysis, it proven that four kinds of confusion algorithm had very good effect of confusion, and perfectly protected Java software, the software for Java decompilation and reverse engineering to improve the process capability, complexity, and attack the additional costs increased program execution. The algorithm is studied in this paper for mobile code and software protection of intellectual property rights can play a positive role.

de-compilation;code obfuscation; identifier renaming obfuscation

TP 309

A

1672-6146(2010)03-0064-06

10.3969/j.issn.1672-6146.2010.03.017

2010-07-13

李新良(1974-), 女,副教授,碩士研究生,研究方向?yàn)檐浖_(kāi)發(fā)與軟件測(cè)試.

猜你喜歡
重命名標(biāo)識(shí)符字節(jié)
基于底層虛擬機(jī)的標(biāo)識(shí)符混淆方法
No.8 字節(jié)跳動(dòng)將推出獨(dú)立出口電商APP
用好Excel,文件批量重命名其實(shí)很簡(jiǎn)單
批量更改網(wǎng)頁(yè)文件名稱
Windows 10下快速修改文件名
基于區(qū)塊鏈的持久標(biāo)識(shí)符系統(tǒng)①
No.10 “字節(jié)跳動(dòng)手機(jī)”要來(lái)了?
簡(jiǎn)談MC7字節(jié)碼
同目錄下多文件的快速重命名法
數(shù)字美術(shù)館“數(shù)字對(duì)象唯一標(biāo)識(shí)符系統(tǒng)”建設(shè)需求淺議