張潤潔 吳毅堅(jiān) 趙文耘
1(復(fù)旦大學(xué)軟件學(xué)院 上海 201203) 2(復(fù)旦大學(xué)計(jì)算機(jī)科學(xué)技術(shù)學(xué)院 上海 201203) 3(上海市數(shù)據(jù)科學(xué)重點(diǎn)實(shí)驗(yàn)室 上海 200433)
代碼混淆是一種在保證代碼功能性不變的前提下將原有代碼轉(zhuǎn)化為在形式上難于閱讀和理解的代碼變換技術(shù),能夠提升軟件逆向工程的難度[1]。隨著代碼混淆研究的發(fā)展,混淆技術(shù)在代碼保護(hù)強(qiáng)度和保護(hù)代價(jià)方面做到了很好的平衡,被應(yīng)用到了數(shù)字水印[2]、版權(quán)保護(hù)[3]等很多實(shí)用領(lǐng)域。代碼混淆器的發(fā)展也日趨成熟,Java混淆器ProGuard[4]、JavaScript混淆器JavaScript Obfuscator[13]等在工業(yè)界得到廣泛應(yīng)用。
目前,隨著軟件項(xiàng)目復(fù)雜性的提高,一個(gè)項(xiàng)目通常由多種語言一起編寫,且不同類型代碼間通常具有關(guān)聯(lián)關(guān)系。例如在基于Struts2的 Web項(xiàng)目中,action的名稱在前臺(tái)JavaScript代碼、Struts配置代碼和后臺(tái)Java代碼之間必須保持一致。然而,傳統(tǒng)的混淆方法通常只針對(duì)局部混淆,當(dāng)混淆了一個(gè)或者部分子系統(tǒng)的代碼后,可能造成混淆后的代碼元素不再相互關(guān)聯(lián),導(dǎo)致整個(gè)軟件系統(tǒng)無法組裝運(yùn)行。因此,為實(shí)現(xiàn)全局混淆,需要對(duì)關(guān)聯(lián)代碼進(jìn)行特殊處理。目前通常采取人工設(shè)置混淆配置項(xiàng)的方式,逐一標(biāo)識(shí)關(guān)聯(lián)性代碼元素的混淆方式。混淆人員需要花費(fèi)大量精力處理源代碼細(xì)節(jié),且繁瑣的配置項(xiàng)極易引入錯(cuò)誤,造成引用程序集失效的問題,導(dǎo)致混淆后的項(xiàng)目無法正常運(yùn)行。
本文設(shè)計(jì)了跨語言的代碼元素及其關(guān)聯(lián)關(guān)系的描述規(guī)則,其中定義統(tǒng)一代碼模型,抽取代碼元素信息,實(shí)現(xiàn)對(duì)不同代碼元素的統(tǒng)一化描述。并提出關(guān)聯(lián)規(guī)則的概念,作為代碼關(guān)聯(lián)關(guān)系的統(tǒng)一描述規(guī)則,結(jié)合正則模式匹配技術(shù),獲取項(xiàng)目代碼關(guān)聯(lián)關(guān)系。在此基礎(chǔ)上,提出跨語言的項(xiàng)目級(jí)代碼混淆方法,實(shí)現(xiàn)對(duì)同一項(xiàng)目中不同類型代碼的代碼元素的統(tǒng)一化混淆以及代碼關(guān)聯(lián)性的自動(dòng)化維護(hù),保證混淆前后代碼關(guān)聯(lián)性的一致,提高了項(xiàng)目整體混淆效率和混淆程度。
本文以業(yè)界常用的基于Struts2框架的Web項(xiàng)目為例,前后臺(tái)代碼與配置代碼三者間存在一定的關(guān)聯(lián)關(guān)系。例如在前臺(tái)JS代碼、Struts配置代碼和后臺(tái)Java代碼中表示Action的名稱的代碼元素是相互關(guān)聯(lián)保持一致的,如圖1所示。
圖1 Struts2項(xiàng)目代碼元素關(guān)聯(lián)性示例
現(xiàn)有混淆方法一般無法深度混淆前后臺(tái)交互的Action名稱。例如,當(dāng)混淆方法對(duì)后臺(tái)Java代碼的方法名進(jìn)行混淆后,仍然無法更改Struts2框架的配置文件中存在的方法名,此時(shí)前臺(tái)發(fā)送的方法調(diào)用請(qǐng)求按照配置文件中的映射規(guī)則,在相應(yīng)的Java文件中找不到相應(yīng)的方法,從而產(chǎn)生錯(cuò)誤。另外,由于前臺(tái)代碼中的字符串通常以明文形式存在,而Action是Struts2中是非常重要的組成部分,因此,為了更好地保護(hù)軟件產(chǎn)品的利益,需要混淆能夠反映代碼的邏輯信息的Action名稱,提升軟件保護(hù)的門檻。
針對(duì)上述問題,我們提出了跨語言的項(xiàng)目級(jí)代碼混淆方法,設(shè)計(jì)了代碼元素及其關(guān)聯(lián)關(guān)系的描述規(guī)則,對(duì)不同類型代碼中的各類代碼元素進(jìn)行統(tǒng)一化的描述。通過獲取項(xiàng)目代碼關(guān)聯(lián)關(guān)系,將相互關(guān)聯(lián)并需要一起混淆的代碼元素梳理在一起,解決了現(xiàn)有混淆方法易造成的混淆后代碼關(guān)聯(lián)性丟失問題。
跨語言的項(xiàng)目級(jí)代碼混淆方法過程,如圖2所示。
圖2 跨語言的項(xiàng)目級(jí)代碼混淆方法過程示意圖
主要包括以下三個(gè)步驟:
(1) 代碼元素信息抽取。以項(xiàng)目程序源代碼和用戶配置文件作為輸入元素,用戶配置文件信息指明源代碼中待混淆代碼元素的所屬文件類型、代碼文件范圍、代碼元素類型等信息。利用本文定義的描述不同類型代碼中各類代碼元素的統(tǒng)一代碼模型UCM(Unified Code Model)在程序解析工具的支持下分析匹配源代碼,將不同的代碼元素轉(zhuǎn)換成統(tǒng)一的程序抽象形式,為后續(xù)代碼關(guān)聯(lián)關(guān)系的獲取以及混淆執(zhí)行提供了統(tǒng)一形式的輸入元素。
(2) 關(guān)聯(lián)關(guān)系識(shí)別。本文定義了描述項(xiàng)目代碼映射規(guī)則的關(guān)聯(lián)規(guī)則CR(Connection Rule),利用正則匹配技術(shù),使用關(guān)聯(lián)規(guī)則作為匹配模式串對(duì)項(xiàng)目配置文件進(jìn)行模式匹配,獲取項(xiàng)目代碼關(guān)聯(lián)關(guān)系,依據(jù)項(xiàng)目關(guān)聯(lián)關(guān)系判定代碼元素的關(guān)聯(lián)性,將相互關(guān)聯(lián)的需要一起混淆的代碼元素梳理在一起。
(3) 混淆執(zhí)行。利用關(guān)聯(lián)關(guān)系識(shí)別步驟中得到的項(xiàng)目關(guān)聯(lián)關(guān)系列表,以保持混淆后代碼關(guān)聯(lián)性為前提生成混淆算法。依據(jù)代碼元素的特征描述信息如代碼文件類型、代碼元素類型、代碼元素名稱等,調(diào)用相應(yīng)的程序修改方法,執(zhí)行混淆,最終得到混淆后的項(xiàng)目代碼。
1.3.1 統(tǒng)一代碼模型
本文定義了描述不同類型代碼中各類代碼元素的統(tǒng)一代碼模型(UCM),如圖3所示。其中,Code Type表示代碼元素類,用于定義不同類型的代碼元素,由不少于一個(gè)的Code Element構(gòu)成。Code Element代表一種名稱確定的代碼元素,并包含多個(gè)具體實(shí)例Instance。Instance對(duì)代碼元素的名稱、起始標(biāo)志、結(jié)束標(biāo)志以及源代碼文件路徑進(jìn)行了明確的定義,用于描述每一個(gè)代碼元素的具體存在信息。Code Pair表示關(guān)聯(lián)代碼元素對(duì),用于定義一對(duì)相互關(guān)聯(lián)的代碼元素,每個(gè)Code Pair由兩個(gè)Code Element構(gòu)成。
圖3 統(tǒng)一代碼模型
1.3.2 代碼元素信息抽取
由于統(tǒng)一代碼模型(UCM)中包含了準(zhǔn)確描述每一個(gè)代碼元素所必須的屬性特征。本文利用統(tǒng)一代碼模型對(duì)軟件項(xiàng)目中具體的源代碼進(jìn)行分析以及匹配,從中抽取代碼元素在源代碼中具體的屬性信息,從而將同一項(xiàng)目中多樣化的代碼元素轉(zhuǎn)換為統(tǒng)一表示形式,為后續(xù)獲取代碼元素間的關(guān)聯(lián)關(guān)系以及跨語言的混淆算法實(shí)施提供了統(tǒng)一的代碼元素對(duì)象。例如,我們對(duì)基于Struts2框架的Web項(xiàng)目中JavaScript代碼的Action名稱,Class代碼中的方法名以及struts.xml文件中的Action名稱和方法名進(jìn)行信息抽取,代碼元素信息抽取結(jié)果如圖4所示。另外,分析源代碼的過程需要程序解析技術(shù)的支持,我們開發(fā)了相應(yīng)的程序解析工具,目前支持Class、JavaScript以及XML、JSP、HTML等各類文本文件類型的源代碼文件。
1.3.3 關(guān)聯(lián)規(guī)則
關(guān)聯(lián)規(guī)則(CR)是項(xiàng)目代碼關(guān)聯(lián)關(guān)系的統(tǒng)一描述規(guī)則,其完整文本模式描述稱為Pattern,代表關(guān)聯(lián)規(guī)則整體的文本模式,由多個(gè)子模式(Sub_pattern)組成。Sub_pattern代表子文本模式,Sub_pattern之間相互獨(dú)立,獨(dú)立用“#”表示,如圖5所示。
圖5 關(guān)聯(lián)規(guī)則
CR的完整性定義為:CR={P,F(xiàn)Q,F(xiàn)S,F(xiàn)L,F(xiàn)T,F(xiàn)H,F(xiàn)R,BQ,BS,BL,BT,BH,BR},CR各組成元素的名稱及定義如表1所示。前部元素與后部元素為關(guān)聯(lián)關(guān)系所描述的兩個(gè)關(guān)聯(lián)代碼對(duì)象,例如FS和BS分別為一條關(guān)聯(lián)規(guī)則中前部元素全稱與后部元素全稱的文本模式描述。利用正則表達(dá)式[14]描述文本模式,CR各組成元素均為正則表達(dá)式集合,這源于對(duì)網(wǎng)絡(luò)安全監(jiān)測領(lǐng)域經(jīng)常利用正則表達(dá)描述攻擊特征[15]的借鑒。此外,以基于Struts2框架的Web項(xiàng)目為例,Struts2示例列給出符合框架代碼映射規(guī)則的CR內(nèi)容。
表1 關(guān)聯(lián)規(guī)則組成元素
1.3.4 關(guān)聯(lián)關(guān)系識(shí)別
本文利用正則匹配技術(shù),使用關(guān)聯(lián)規(guī)則作為模式串對(duì)項(xiàng)目配置文件進(jìn)行過濾,匹配結(jié)果即為項(xiàng)目代碼關(guān)聯(lián)關(guān)系列表。當(dāng)關(guān)聯(lián)關(guān)系包含通配符時(shí),需要進(jìn)一步明確代碼間的映射關(guān)系。我們利用包含通配符的關(guān)聯(lián)關(guān)系構(gòu)建模式串,正則匹配代碼元素抽象信息,獲取代碼元素間明確的對(duì)應(yīng)關(guān)系。例如,利用表1中Struts2示例內(nèi)容解析項(xiàng)目配置文件struts.xml中圖6所示代碼片段,得到圖6關(guān)聯(lián)關(guān)系編號(hào)1,即代碼類型為js、html或jsp且名稱為“one_*”的前部元素與代碼文件名為“action.getAction”的后部元素關(guān)聯(lián)。完善后得到圖6關(guān)聯(lián)關(guān)系編號(hào)2,確定了名稱“one_copy”的前部代碼元素與名稱為“copy”后部代碼元素關(guān)聯(lián)。
圖6 關(guān)聯(lián)關(guān)系獲取示意圖
最后,利用關(guān)聯(lián)關(guān)系信息分別對(duì)前部和后部代碼元素進(jìn)行匹配,符合關(guān)聯(lián)關(guān)系信息描述的代碼元素即為關(guān)聯(lián)性代碼元素。在關(guān)聯(lián)性代碼元素中,前部元素與后部元素通過所匹配的關(guān)聯(lián)關(guān)系條目編號(hào)關(guān)聯(lián)在一起,并在后續(xù)的代碼混淆過程中一起混淆,從而實(shí)現(xiàn)關(guān)聯(lián)代碼的混淆聯(lián)動(dòng)。
1.3.5 混淆執(zhí)行
混淆算法依賴于完善后的關(guān)聯(lián)關(guān)系列表,利用列表中關(guān)聯(lián)關(guān)系條目的位置信息替換具有實(shí)際意義的明文信息,使得混淆后代碼元素人眼難辨而機(jī)器可識(shí)。同時(shí),依據(jù)項(xiàng)目關(guān)聯(lián)規(guī)則對(duì)代碼元素名稱的特征描述,獲取代碼元素混淆后的名稱格式,使用關(guān)聯(lián)代碼元素對(duì)具有的相同位置信息作為名稱內(nèi)容,生成混淆后的代碼元素名稱,保證混淆前后代碼元素關(guān)聯(lián)性一致。例如,圖6關(guān)聯(lián)關(guān)系編號(hào)2包含了前部元素“one_copy”與后部元素“copy”關(guān)聯(lián)信息,使用該條關(guān)聯(lián)信息在關(guān)聯(lián)關(guān)系列表中的位置信息替換明文信息后,前部元素“one_copy”被混淆成“A00003_S00006”, 后部元素“copy”被混淆成“S0006”,其中數(shù)字3和數(shù)字6均與該關(guān)聯(lián)信息條目在關(guān)聯(lián)關(guān)系列表中的位置有關(guān)。
最后在明確了混淆算法的前提下,根據(jù)代碼元素的具體屬性特征,如所屬文件類型、代碼元素類型等,調(diào)用相應(yīng)的程序修改方法,執(zhí)行混淆。例如,利用UCM對(duì)圖1示例中前臺(tái)JS代碼的Action名稱元素,后臺(tái)Java代碼的方法名元素以及Struts配置代碼元素進(jìn)行信息抽取,經(jīng)關(guān)聯(lián)關(guān)系識(shí)別和混淆執(zhí)行后,混淆結(jié)果如圖7所示。其中前臺(tái)JS代碼的Action名稱元素 “tree_getLevel”被混淆成“A00001”,后臺(tái)Java代碼方法名元素“get”被混淆成 “S00001”,通過混淆后的Struts配置代碼保持了代碼元素間的關(guān)聯(lián)關(guān)系。
圖7 混淆后Struts2項(xiàng)目代碼元素關(guān)聯(lián)關(guān)系示例
基于本文方法,研發(fā)了跨語言的項(xiàng)目級(jí)代碼混淆工具?;煜ぞ咭罁?jù)用戶配置文件對(duì)項(xiàng)目中不同類型代碼的代碼元素建模,獲取項(xiàng)目代碼關(guān)聯(lián)關(guān)系,生成混淆算法,完成關(guān)聯(lián)性代碼元素的統(tǒng)一混淆并在混淆過程中維護(hù)了代碼關(guān)聯(lián)關(guān)系,最終得到混淆后可正常運(yùn)行的項(xiàng)目代碼。
實(shí)驗(yàn)選取兩個(gè)基于Struts2框架的實(shí)際Web項(xiàng)目源程序作為實(shí)驗(yàn)對(duì)象,分別對(duì)這兩個(gè)項(xiàng)目進(jìn)行混淆實(shí)驗(yàn),實(shí)驗(yàn)設(shè)置信息如表2所示。實(shí)驗(yàn)中,混淆人員通過用戶配置文件描述源代碼具體信息,運(yùn)行工具進(jìn)行代碼混淆。本文分別對(duì)各組實(shí)驗(yàn)的工具運(yùn)行時(shí)間,混淆前后項(xiàng)目程序體積變化情況,被混淆代碼元素的數(shù)量和名稱變換情況進(jìn)行了統(tǒng)計(jì)。從混淆方法的可行性及有效性兩個(gè)方面分析實(shí)驗(yàn)結(jié)果,最后對(duì)本文混淆方法的局限性進(jìn)行說明。
表2 實(shí)驗(yàn)設(shè)置信息
續(xù)表2
2.2.1 混淆方法的可行性評(píng)估
通過記錄各組實(shí)驗(yàn)中工具的運(yùn)行時(shí)間,結(jié)合實(shí)驗(yàn)對(duì)象的有效代碼行數(shù)進(jìn)行分析,如圖8所示。項(xiàng)目A的混淆時(shí)間為76秒,項(xiàng)目B的混淆時(shí)間為95秒,項(xiàng)目代碼有效行數(shù)越多,工具運(yùn)行總時(shí)間越長,但隨著代碼行數(shù)的增長,工具單位時(shí)間處理的代碼行數(shù)并未降低。這是因?yàn)榛煜龝r(shí)間還與單位數(shù)量的代碼行中所包含的關(guān)聯(lián)代碼元素?cái)?shù)量有關(guān)。另外,混淆工具均在較短的有效時(shí)間內(nèi)完成了項(xiàng)目混淆工作。
圖8 有效代碼行數(shù)與混淆時(shí)間
此外,兩組實(shí)驗(yàn)最終均得到了可正常運(yùn)行的混淆后項(xiàng)目程序,利用自動(dòng)化測試工具UFT[5]進(jìn)行功能測試,對(duì)比混淆前后項(xiàng)目功能測試結(jié)果,說明混淆后項(xiàng)目功能的正確性,并統(tǒng)計(jì)各功能模塊覆蓋的被混淆代碼元素?cái)?shù)量。以項(xiàng)目A為例,共混淆81個(gè)Action名稱,功能測試中各測試用例的執(zhí)行情況以及Action名稱覆蓋情況如表3所示。
表3 測試用例執(zhí)行結(jié)果及Action名稱覆蓋表
分析實(shí)驗(yàn)結(jié)果可知,60個(gè)測試用例均執(zhí)行通過,說明混淆前后項(xiàng)目程序保持了功能性的一致,測試覆蓋到的Action名稱數(shù)量占混淆名稱總量的90%以上,反映了混淆前后Action名稱代碼元素關(guān)聯(lián)性的一致。綜上所述,工具能在有效時(shí)間內(nèi)混淆關(guān)聯(lián)代碼,并保證混淆后項(xiàng)目的正常運(yùn)行,說明本文混淆方法以及混淆工具在實(shí)際的項(xiàng)目混淆中是具有可行性的。
2.2.2 混淆方法的有效性評(píng)估
混淆后項(xiàng)目A與項(xiàng)目B的程序體積增長率分別為2.90%及3.10%。由于本文混淆算法選取了較長的標(biāo)識(shí)符替換代碼元素原有名稱,混淆后程序體積均有所增長。但整體來看,混淆后程序體積增長率均不大,這是由于本文混淆算法不會(huì)產(chǎn)生冗余代碼,因此不會(huì)導(dǎo)致程序代碼體積的大幅增加。
兩組實(shí)驗(yàn)中發(fā)生混淆的代碼元素種類及數(shù)量情況如圖9所示。由圖9可知,待混淆項(xiàng)目中關(guān)聯(lián)性代碼元素?cái)?shù)量眾多,且分布于不同類型的代碼中,說明了混淆關(guān)聯(lián)性代碼元素對(duì)于提高項(xiàng)目混淆程度有所幫助,同時(shí)驗(yàn)證了所提方法具備了跨語言混淆的能力。
圖9 混淆代碼元素?cái)?shù)量統(tǒng)計(jì)圖
實(shí)驗(yàn)過程中,我們記錄了混淆前后的Action的名稱的變化情況。以項(xiàng)目A為例,從混淆結(jié)果中隨機(jī)選取10條代碼元素名稱的變換信息,如表4所示。由混淆前后的Action名稱對(duì)比情況可以看出,混淆前名稱里諸如doQuery、bindSqlData這種有意義的名稱,容易給用戶造成聯(lián)想,產(chǎn)生攻擊嘗試,本文混淆方法隱藏了代碼元素名稱所具有的意義,增加了人工閱讀和理解代碼的難度。
表4 以A項(xiàng)目為例混淆前后部分Action名稱對(duì)比表
續(xù)表4
然而,本文方法具有一定的局限性,由于本文方法目前只考慮關(guān)聯(lián)性代碼元素的混淆,因此只能夠處理關(guān)聯(lián)代碼的混淆聯(lián)動(dòng)問題,仍然需要依賴傳統(tǒng)的混淆方法處理局部混淆。此外,本文混淆方法對(duì)于不依賴于變量名的邏輯分析工具仍然是沒有作用的,只提升了人工分析的門檻。
代碼混淆技術(shù)作為一種軟件安全保護(hù)技術(shù)而興起,隨Java語言的迅速發(fā)展而備受關(guān)注,近十幾年來很多組織和研究人員致力于代碼混淆技術(shù)在軟件安全保護(hù)方面的研究。
Collberg等[1]最早對(duì)碼混淆進(jìn)行了準(zhǔn)確定義,將混淆轉(zhuǎn)換分為數(shù)據(jù)混淆、詞法混淆、控制混淆,以及預(yù)防性混淆,并提出普適于高級(jí)語言的混淆算法,但未涉及實(shí)現(xiàn)細(xì)節(jié)??刂苹煜矫娴难芯肯鄬?duì)較多,平展控制流混淆算法[6]及不透明謂詞混淆算法[7]是較為著名的研究成果。本文設(shè)計(jì)跨語言的代碼混淆算法,結(jié)合布局混淆和數(shù)據(jù)混淆兩方面的混淆變換技術(shù),對(duì)不同類型代碼元素進(jìn)行統(tǒng)一化混淆。
Barak 等[8]給出了程序混淆的形式化定義,突破了此前代碼混淆算法評(píng)估只能定性描述的局限。此后利用密碼學(xué)等數(shù)學(xué)理論為重點(diǎn)的代碼混淆技術(shù)成果不斷涌現(xiàn),例如通用混淆被證明是難以實(shí)現(xiàn),而對(duì)某些具體函數(shù)類的混淆構(gòu)造是可以有效實(shí)現(xiàn)的[9],以及利用密碼學(xué)理論對(duì)反混淆的NP復(fù)雜度問題進(jìn)行證明[10]。至今,軟件工程學(xué)與密碼學(xué)現(xiàn)在仍然是代碼混淆技術(shù)的兩個(gè)最主要的研究方向。
混淆模型方面,混淆新模型是程序混淆方面的一個(gè)重點(diǎn)研究方向,Barak等[8]指出雖然研究混淆的不同定義類型具有一定的實(shí)際應(yīng)用意義。例如,對(duì)軟件項(xiàng)目混淆時(shí)可以結(jié)合硬件的輔助,如公鑰混淆[11]以及帶硬件假設(shè)的安全混淆[12]。公鑰混淆與一個(gè)公鑰系統(tǒng)相結(jié)合,輸出的結(jié)果是原函數(shù)的輸出結(jié)果在此公鑰系統(tǒng)下的加密密文。帶硬件假設(shè)的安全混淆中將軟件部分和一個(gè)硬件部分共同組成混淆函數(shù),混淆的功能性由軟件部分和硬件部分共同完成,而安全性只考慮軟件部分的安全性。本文研究工作從混淆軟件整體項(xiàng)目代碼的角度出發(fā),通過設(shè)計(jì)項(xiàng)目級(jí)代碼混淆方法模型,實(shí)現(xiàn)項(xiàng)目關(guān)聯(lián)代碼的統(tǒng)一化混淆,從而提升項(xiàng)目整體的混淆強(qiáng)度。
代碼混淆技術(shù)也帶動(dòng)了很多有效混淆工具的開發(fā),對(duì)現(xiàn)實(shí)軟件產(chǎn)品內(nèi)部核心算法和知識(shí)產(chǎn)權(quán)進(jìn)行保護(hù)。ProGuard[4]面向 Java類文件提供壓縮和優(yōu)化功能,利用布局混淆和數(shù)據(jù)混淆來實(shí)現(xiàn)混淆保護(hù),通過刪除或者重命名類、字段、方法與屬性,最大程度地優(yōu)化字節(jié)碼文件。在JS語言方面,Javascript Obfuscator[13]通過布局混淆將對(duì)JS源代碼轉(zhuǎn)換成不可讀的形式,并具有較強(qiáng)壓縮能力。目前混淆工具的設(shè)計(jì)通常只針對(duì)特定編程語言類型的代碼,本文基于所提方法研發(fā)跨語言的項(xiàng)目級(jí)代碼混淆工具,能夠?qū)崿F(xiàn)跨語言的代碼混淆以及關(guān)聯(lián)代碼元素關(guān)聯(lián)性的維護(hù),使得混淆后的項(xiàng)目程序能夠正常運(yùn)行,從而實(shí)現(xiàn)對(duì)現(xiàn)實(shí)軟件產(chǎn)品全局業(yè)務(wù)邏輯代碼的有效保護(hù)。
本文從提升軟件項(xiàng)目整體混淆效果的角度出發(fā),提出跨語言的項(xiàng)目級(jí)代碼混淆方法。通過設(shè)計(jì)描述不同類型代碼的各類代碼元素的統(tǒng)一代碼模型,以及定義關(guān)聯(lián)規(guī)則對(duì)項(xiàng)目關(guān)聯(lián)關(guān)系進(jìn)行統(tǒng)一化描述,實(shí)現(xiàn)了項(xiàng)目關(guān)聯(lián)關(guān)系的識(shí)別和自動(dòng)化維護(hù)以及跨語言的代碼混淆,提高了項(xiàng)目代碼整體的混淆程度,提升了軟件保護(hù)的門檻?;谒岱椒?,研發(fā)跨語言的項(xiàng)目級(jí)代碼混淆工具,并在基于Struts2框架的真實(shí)源代碼項(xiàng)目中進(jìn)行了混淆實(shí)驗(yàn),對(duì)所提方法及技術(shù)的可行性和有效性進(jìn)行說明。
然而,本文方法目前局限于混淆項(xiàng)目關(guān)聯(lián)代碼,代碼的局部邏輯混淆仍然依賴于傳統(tǒng)的混淆方法。另外,所提方法中對(duì)于項(xiàng)目關(guān)聯(lián)關(guān)系的獲取仍需解析源代碼文件,因此在實(shí)際應(yīng)用中受到文件解析工具能力的限制。關(guān)聯(lián)規(guī)則目前僅限于描述二元元素間的關(guān)聯(lián)關(guān)系,如何進(jìn)一步完善關(guān)聯(lián)規(guī)則的統(tǒng)一化的定義,設(shè)計(jì)更為通用的描述規(guī)則以適應(yīng)更多類型的項(xiàng)目是我們需要繼續(xù)研究的問題。
[1] Collberg C,Thomborson C,Low D.A taxonomy of obfuscating transformations[R].Technical Report 148,University of Auckland,1997:325-350.
[2] Giacobazzi R.Hiding information in completeness holes:New perspectives in code obfuscation and watermarking[C]//Software Engineering and Formal Methods (SEFM),2008:7-18.
[3] Zhu W,Thomborson C.A provable scheme for homomorphic obfuscation in software security[C]//Communication,Network and Information Security (CNIS’05),2005:208-212.
[4] Proguard.ProGuard Java Optimizer and Obfuscator[EB/OL].2016-09-20.http://www.guardsquare.com/en/proguard.
[5] HPE UFT.The complete solution for automation of web,mobile,API,and packaged applications[EB/OL].2015-11.https://www.hpe.com/h20195/V2/GetPDF.aspx/4AA5-6938ENW.pdf.
[6] Chow S,Johnson H.An approach to the obfuscation of control flow of sequential computer programs[C]//Proceedings of the 4th International Conference on Information Security.Springer Verlag London,2001:144-155.
[7] Collberg C,Thomborson C,Low D.Manufacturing cheap,resilient,and stealthy opaque constructs[C]//Proceedings of the 25th ACM Sigplan-sigact Symposium on Principles of Programming Languages,1998:184-196.
[8] Barak B,Goldreich O,Impagliazzo R.On the impossibility of obfuscating programs[M].Journal of ACM,2001:1-18.
[9] Bitansky N,Canetti R,Paneth O,et al.More on the impossibility of virtual black-box obfuscation with auxiliary input[R].Cryptology ePrint Archive,Report 701,2013.
[10] Andrew W.Deobfuscation is in np[EB/OL].2002-08-21.http://www.cs.princeton.edu/~appel/papers/deobfus.pdf.
[11] Ostrovsky R,Skeith W E.Private searching on streaming data[M].Journal of Cryptology.Springer New York,2007,20(4):1432-1378.
[12] Goyal V,Ishai Y,Sahai A.Founding cryptography on tamper-proof hardware tokens[M]//Theory of Cryptography (TCC),Springer berlin heidelberg,2010:308-326.
[13] 宣以廣,周華.基于字符熵的JavaScript代碼混淆自動(dòng)檢測方法[J].計(jì)算機(jī)應(yīng)用與軟件,2015,32(1):309-312.
[14] 朱文琰,鄭肖雄.基于正則表達(dá)式構(gòu)建學(xué)習(xí)的網(wǎng)頁信息抽取方法[J].計(jì)算機(jī)應(yīng)用與軟件,2017,34(2):14-19,79.
[15] 張樹壯,羅浩,方濱興,等.一種面向網(wǎng)絡(luò)安全檢測的高性能正則表達(dá)式匹配算法[J].計(jì)算機(jī)學(xué)報(bào),2010,33(10):1976-1986.