本發(fā)明涉及移動(dòng)互聯(lián)網(wǎng)app代碼混淆測評領(lǐng)域,特別是涉及一種基于proguard軟件的移動(dòng)互聯(lián)網(wǎng)app代碼混淆測評方法。
背景技術(shù):
隨著移動(dòng)互聯(lián)網(wǎng)和移動(dòng)智能終端的普及和快速發(fā)展,移動(dòng)應(yīng)用程序的數(shù)量呈爆發(fā)式增長,其中android平臺智能終端及其應(yīng)用占據(jù)市場主導(dǎo)地位。然而,面對日益增長的應(yīng)用市場,app被盜版后加入惡意代碼的情況越來越嚴(yán)重,部分破壞者利用這些惡意程序收集用戶隱私、篡改數(shù)據(jù),給用戶帶來巨大的經(jīng)濟(jì)利益損失及安全威脅。對開發(fā)者來說,盜版app不僅影響正版app的下載量,破壞其口碑,還會(huì)帶來一定的經(jīng)濟(jì)損失。針對移動(dòng)應(yīng)用程序的代碼保護(hù)及知識產(chǎn)權(quán)保護(hù)亟待加強(qiáng)。
根據(jù)國家互聯(lián)網(wǎng)應(yīng)急中心(簡稱cncert)發(fā)布的《2015年我國互聯(lián)網(wǎng)網(wǎng)絡(luò)安全態(tài)勢綜述》報(bào)告顯示,目前我國移動(dòng)互聯(lián)網(wǎng)環(huán)境有所惡化,2015年捕獲的新增移動(dòng)互聯(lián)網(wǎng)惡意程序樣本近148萬個(gè),較2014年增長了55.3%,主要針對安卓平臺。從威脅類型來說,排名前三位的惡意行為分別是惡意扣費(fèi)類、流氓行為和遠(yuǎn)程控制類,占比分別為23.6%、22.2%和15.1%。同時(shí),經(jīng)過連續(xù)三年的整治,國內(nèi)主流應(yīng)用商店積極落實(shí)安全責(zé)任,不斷完善安全監(jiān)督、安全審核、社會(huì)監(jiān)督舉報(bào)、惡意程序下架等制度,使安全情況有所好轉(zhuǎn),大量移動(dòng)惡意程序的傳播渠道轉(zhuǎn)移到網(wǎng)盤或廣告平臺等網(wǎng)站。
android應(yīng)用程序的開發(fā)語言是java。由于java源代碼經(jīng)編譯后生成的是一種中間代碼,它保留了程序大量的信息,反編譯后得到的代碼基本可以重構(gòu)程序,使得android應(yīng)用程序在知識產(chǎn)權(quán)保護(hù)上面臨極大的風(fēng)險(xiǎn)。代碼保護(hù)技術(shù)可以防止應(yīng)用程序被盜版,保護(hù)其知識產(chǎn)權(quán),因此針對android智能終端應(yīng)用程序的代碼保護(hù)技術(shù)研究就顯得更加緊迫和重要。
一般來說,移動(dòng)智能終端應(yīng)用程序面對的主要是程序分析及惡意篡改兩種竊取知識產(chǎn)權(quán)的方式。
程序分析,是指對程序進(jìn)行分析并從中獲取重要信息,包括程序的主要算法和數(shù)據(jù)結(jié)構(gòu)等。這種方式通過惡意的程序分析方法來得到正版程序中的重要信息,并將其應(yīng)用到相應(yīng)的產(chǎn)品中,以實(shí)現(xiàn)相同的功能。
惡意篡改是指對應(yīng)用程序的重要信息進(jìn)行篡改,侵害用戶或開發(fā)者的經(jīng)濟(jì)利益或聲譽(yù),常見的方式有對程序中的加密或付費(fèi)模塊進(jìn)行惡意篡改。從本質(zhì)上來說,這種侵犯應(yīng)用程序知識產(chǎn)權(quán)的方式與程序分析的方式是一樣的,它們都是以對程序的深度分析作為基礎(chǔ)。
為了防止惡意主機(jī)對移動(dòng)應(yīng)用有目的的篡改,代碼混淆技術(shù)被提出,其基本做法是使用代碼混淆技術(shù)對軟件的代碼進(jìn)行混淆變換,使混淆變換后的代碼的分析難度增加,從而在一定程度上阻止對軟件的篡改。代碼混淆技術(shù)實(shí)際上是一種用于對移動(dòng)代碼保護(hù)和軟件知識產(chǎn)權(quán)進(jìn)行保護(hù)的安全技術(shù)。在實(shí)際應(yīng)用中,對軟件提供絕對的安全保護(hù)是不可能,也是沒有必要的,只要能使攻擊者的攻擊付出較高的代價(jià),就可以認(rèn)為混淆技術(shù)達(dá)到了安全保護(hù)的作用。因此,代碼混淆技術(shù)就成為容易實(shí)現(xiàn)的保護(hù)安卓app有效保護(hù)技術(shù)。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述存在的問題,本發(fā)明提供一種基于proguard軟件的移動(dòng)互聯(lián)網(wǎng)app代碼混淆測評方法,可以防止惡意主機(jī)對移動(dòng)app有目的的篡改,使用代碼混淆軟件對移動(dòng)app的源代碼進(jìn)行混淆變換,使混淆變換后的代碼的分析難度增加,從而在一定程度上阻止對移動(dòng)app的篡改。按照本發(fā)明公開的測評方法可以開展相關(guān)混淆工作分析,有效地評估經(jīng)過proguard軟件混淆后的代碼安全防護(hù)效果,為達(dá)此目的,本發(fā)明提供一種基于proguard軟件的移動(dòng)互聯(lián)網(wǎng)app代碼混淆測評方法,具體測評方法步驟如下:
1)在集成了proguard的android的編譯環(huán)境中,啟用proguard讓它跟隨ant或eclipse編譯時(shí)一起運(yùn)行,在<project_root>/default.properties文件中設(shè)置proguard.config屬性,路徑可以是絕對路徑或是工程根目錄的相對路徑,若把proguard.cfg文件放在默認(rèn)的位置即工程的根目錄,可以這樣指定它的位置:proguard.config=proguard.cfg;或者把該文件移到任何位置,然后指定絕對路徑:proguard.config=/path/to/proguard.cfg;
2)當(dāng)在release模式下編譯程序時(shí),不管是用antrelease還是用eclipse的導(dǎo)出向?qū)?,編譯系統(tǒng)都會(huì)自動(dòng)檢查proguard.config屬性是否設(shè)置,若已經(jīng)設(shè)置,proguard就會(huì)在打包成.apk文件之前,自動(dòng)處理應(yīng)用程序的字節(jié)碼;
3)proguard開始對源代碼文件文件中的java代碼進(jìn)行壓縮、優(yōu)化、混淆、預(yù)檢;
4)proguard運(yùn)行結(jié)束后,會(huì)生成一個(gè)名為proguard的文件夾,其中有以下文件:dump.txt描述.apk文件中所有類文件間的內(nèi)部結(jié)構(gòu);mapping.txt列出了原始的類,方法和字段名與混淆后代碼間的映射,當(dāng)從release版本中收到一個(gè)bug報(bào)告時(shí),可以用它來翻譯被混淆的代碼;seeds.txt列出了未被混淆的類和成員;usage.txt列出了從apk文件中刪除的代碼;
5)分別挑選其中合適的方法來統(tǒng)計(jì)各項(xiàng)屬性指標(biāo)值,分析各項(xiàng)屬性指標(biāo)值及其變化,對proguard的代碼混淆工作進(jìn)行評價(jià);
6)基于各項(xiàng)屬性指標(biāo)值統(tǒng)計(jì)無法對混淆工具整體混淆效果做出合理評價(jià)的結(jié)論,還需從混淆工具的功能點(diǎn)出發(fā)對代碼混淆工具的工作有效性進(jìn)行評價(jià)。
作為本發(fā)明進(jìn)一步改進(jìn),步驟五各項(xiàng)屬性指標(biāo)值包括指令執(zhí)行率、控制流復(fù)雜度、指令序列相似度、控制流圖相似度。
作為本發(fā)明進(jìn)一步改進(jìn),步驟六混淆工具的功能包括標(biāo)識符重命名、類再封裝、過度重載。
本發(fā)明公開了一種基于proguard軟件的移動(dòng)互聯(lián)網(wǎng)app代碼混淆測評方法:為了防止惡意主機(jī)對移動(dòng)app有目的的篡改,使用代碼混淆軟件對移動(dòng)app的源代碼進(jìn)行混淆變換,使混淆變換后的代碼的分析難度增加,從而在一定程度上阻止對移動(dòng)app的篡改。按照本發(fā)明公開的測評方法可以開展相關(guān)混淆工作分析,有效地評估經(jīng)過proguard軟件混淆后的代碼安全防護(hù)效果,其有益效果如下:
1)本發(fā)明方法可以開展對經(jīng)過proguard軟件混淆過的移動(dòng)app代碼開展有效性評價(jià);
2)本發(fā)明方法可以結(jié)合各項(xiàng)屬性指標(biāo)值統(tǒng)計(jì),以及混淆工具的功能點(diǎn)出發(fā)對代碼混淆工具的工作進(jìn)行全面評估。
附圖說明
圖1為hello.apk類結(jié)構(gòu)圖;
圖2為hello_proguard.apk類結(jié)構(gòu)圖;
圖3為hello.apk與hello_proguard.apk類結(jié)構(gòu)對比圖;、
圖4為proguard過度重載效果圖。
具體實(shí)施方式
下面結(jié)合附圖與具體實(shí)施方式對本發(fā)明作進(jìn)一步詳細(xì)描述:
本發(fā)明提供一種基于proguard軟件的移動(dòng)互聯(lián)網(wǎng)app代碼混淆測評方法,可以防止惡意主機(jī)對移動(dòng)app有目的的篡改,使用代碼混淆軟件對移動(dòng)app的源代碼進(jìn)行混淆變換,使混淆變換后的代碼的分析難度增加,從而在一定程度上阻止對移動(dòng)app的篡改。按照本發(fā)明公開的測評方法可以開展相關(guān)混淆工作分析,有效地評估經(jīng)過proguard軟件混淆后的代碼安全防護(hù)效果。
作為本發(fā)明一種具體實(shí)施例,本發(fā)明提供一種基于proguard軟件的移動(dòng)互聯(lián)網(wǎng)app代碼混淆測評方法,以源代碼文件hello.apk以及經(jīng)過proguard混淆后的測試文件hello_proguard.apk為例,本發(fā)明的具體實(shí)施步驟如下:
1)在集成了proguard的android的編譯環(huán)境中,啟用proguard讓它跟隨ant或eclipse編譯時(shí)一起運(yùn)行,在<project_root>/default.properties文件中設(shè)置proguard.config屬性。路徑可以是絕對路徑或是工程根目錄的相對路徑。若把proguard.cfg文件放在默認(rèn)的位置(工程的根目錄),可以這樣指定它的位置:proguard.config=proguard.cfg;或者把該文件移到任何位置,然后指定絕對路徑:proguard.config=/path/to/proguard.cfg;
2)當(dāng)在release模式下編譯程序時(shí),不管是用antrelease還是用eclipse的導(dǎo)出向?qū)?,編譯系統(tǒng)都會(huì)自動(dòng)檢查proguard.config屬性是否設(shè)置。若已經(jīng)設(shè)置,proguard就會(huì)在打包成.apk文件之前,自動(dòng)處理應(yīng)用程序的字節(jié)碼;
3)proguard開始對hello.apk文件中的java代碼進(jìn)行壓縮、優(yōu)化、混淆、預(yù)檢;
4)proguard運(yùn)行結(jié)束后,會(huì)生成一個(gè)名為proguard的文件夾,其中有以下文件:dump.txt描述.apk文件中所有類文件間的內(nèi)部結(jié)構(gòu);mapping.txt列出了原始的類,方法和字段名與混淆后代碼間的映射,當(dāng)從release版本中收到一個(gè)bug報(bào)告時(shí),可以用它來翻譯被混淆的代碼;seeds.txt列出了未被混淆的類和成員;usage.txt列出了從apk文件中刪除的代碼。
5)分別挑選其中合適的方法來統(tǒng)計(jì)各項(xiàng)屬性指標(biāo)值,如指令執(zhí)行率、控制流復(fù)雜度、指令序列相似度、控制流圖相似度等,分析各項(xiàng)屬性指標(biāo)值及其變化,對proguard的代碼混淆工作進(jìn)行評價(jià)。
6)基于各項(xiàng)屬性指標(biāo)值統(tǒng)計(jì)無法對混淆工具整體混淆效果做出合理評價(jià)的結(jié)論,還需從混淆工具的功能點(diǎn)出發(fā)對代碼混淆工具的工作有效性進(jìn)行評價(jià),proguard在應(yīng)用于安卓時(shí)在代碼混淆方面主要有以下功能:標(biāo)識符重命名、類再封裝、過度重載。
本發(fā)明評測指標(biāo)實(shí)驗(yàn)如下:
表1是本發(fā)明公開的一種基于proguard軟件的移動(dòng)互聯(lián)網(wǎng)app代碼混淆測評方法的屬性指標(biāo)值實(shí)驗(yàn)結(jié)果。
(1)指令執(zhí)行率;
對于程序?qū)傩灾噶頸,可引入指令執(zhí)行率刻畫其特征。指令執(zhí)行率(ie):實(shí)際執(zhí)行的匯編指令條數(shù)占所有反匯編后生成的匯編指令條數(shù)的比重。is表示反匯編后產(chǎn)生的所有指令,即靜態(tài)分析可獲得的所有指令;id表示在動(dòng)態(tài)分析過程中實(shí)際執(zhí)行的指令條數(shù)。于是有
ie=id/is(1);
經(jīng)過對hello.apk反匯編,統(tǒng)計(jì)mainactivity類中onclick(view)方法,其中指令數(shù)共55條,被執(zhí)行的指令數(shù)為44,由公式(1)可知,混淆前的被執(zhí)行指令數(shù)id=44,總指令數(shù)is=55,于是有
ieprior=id/is=44/55=0.80;
故求得混淆前的onclick(view)方法的指令執(zhí)行率為0.80。
使用proguard對hello項(xiàng)目進(jìn)行混淆后,查看項(xiàng)目中生成的mapping.txt文件,發(fā)現(xiàn)mainactivity類中onclick(view)方法與混淆后項(xiàng)目中cl類onclick(view)對應(yīng)。再對hello_proguard.apk反匯編,統(tǒng)計(jì)到cl類中onclick(view)方法中指令數(shù)共52條,其中被執(zhí)行的指令條數(shù)為42,仍由公式(1)可知,混淆后的被執(zhí)行指令數(shù)id=42,總指令數(shù)is=52,于是有;
ielater=id/is=44/55=0.81;
故求得其指令執(zhí)行率為0.81。
(2)控制流復(fù)雜度;
控制流循環(huán)復(fù)雜度記為v(g),計(jì)算公式如下:
v(g)=e-n+2(2);
其中,e表示控制流圖中邊的數(shù)量,n表示控制流圖中節(jié)點(diǎn)的數(shù)量。
使用idapro分別對hello.apk和hello_proguard.apk進(jìn)行反匯編,得到混淆前工程中mainactivity類中onclick(view)方法以及混淆后工程中cl類中onclick(view)方法的控制流圖。
經(jīng)過統(tǒng)計(jì),混淆前控制流圖中邊的數(shù)目為10,節(jié)點(diǎn)的數(shù)目為8,由公式(2)可知混淆前的邊數(shù)e=10、節(jié)點(diǎn)數(shù)目n=8,于是有;
v(g)prior=e-n+2=10-8+2=4;
故可知onclick(view)方法混淆前控制流復(fù)雜度為4。混淆后控制流圖邊的數(shù)目為10,節(jié)點(diǎn)的數(shù)目為為8,由公式(2)可知混淆后的邊數(shù)e=10、節(jié)點(diǎn)數(shù)目n=8,于是有;
v(g)later=e-n+2=10-8+2=4;
故可知onclick(view)方法混淆后控制流復(fù)雜度仍為4。
(3)指令序列相似度;
指令序列在程序中為一種常見的結(jié)構(gòu),采用編輯距離比較兩個(gè)長度不相等的序列,算法的基本思想是將一個(gè)串轉(zhuǎn)換成另一個(gè)串最少需要進(jìn)行的操作來表示兩者之間的相似度。設(shè)兩個(gè)序列p和q之間的編輯距離為distance(p,q),其為使用插入、刪除以及替換等操作將p轉(zhuǎn)換成q所需最少步驟。p和q之間的相似度可以定義為:
sim(p,q)=1-distance(p,q)/max(p|,|q|)(3);
分別對hello.apk和hello_proguard.apk進(jìn)行反匯編,得到其中mainactivity類中onclick(view)方法及混淆后cl類中onclick(view)方法的指令序列。記mainactivity類中onclick(view)方法的指令序列為p,記混淆后cl類中onclick(view)方法的指令序列為q,經(jīng)過統(tǒng)計(jì),若要將變成q變得與p完全一樣,需要對q使用刪除0步、增加7步、替換10步,故可知兩個(gè)序列p和q之間的編輯距離為distance(p,q)=17,由公式(3)可知p和q之間的相似度sim(p,q)=1-distance(p,q)/max(|p|,|q|)=1-17/55=0.69。
(4)控制流圖相似度;
控制流圖通常為程序逆向分析的重點(diǎn)對象,通過比較程序代碼控制流圖的差異性可以定位混淆算法變換代碼的位置,而混淆前后代碼相似度可以采用圖相似度比較方法來計(jì)算。令g、g1和g2都是圖。如果g1和g2中分別存在一個(gè)子圖與g同構(gòu),則稱g為g1和g2的公共子圖。若不存在比g節(jié)點(diǎn)數(shù)目更多的公共子圖,則稱g為最大公共子圖,將其記為g=mcs(g1,g2)。g1和g2的相似度計(jì)算為:
sim(g1,g2)=|mcs(g1,g2)|/max(|g1|,|g2|)(4);
由控制流復(fù)雜度實(shí)驗(yàn)可知,混淆前mainactivity類中onclick(view)方法的控制流圖(記為g1)與混淆后cl類中onclick(view)方法的控制流圖(記為g2)完全同構(gòu),故公共子圖g=mcs(g1,g2)=g1=g2,由公式(4)可知g1與g2的相似度;
sim(g1,g2)=|mcs(g1,g2)|/max(|g1|,|g2|)=1。
(5)指標(biāo)分析;
根據(jù)上述幾項(xiàng)實(shí)驗(yàn),得到各評價(jià)屬性指標(biāo)值及變化如表1所示。
由表可以看出經(jīng)過proguard混淆的程序指令執(zhí)行率幾乎不變、控制流復(fù)雜度沒有發(fā)生變化、指令序列有一定變化、指令序列相似度降低。
指令序列相似度的降低反映了proguard可以使得混淆后的程序指令發(fā)生變化,一定程度上可以起到隱藏原先程序功能的作用;而指令執(zhí)行率的變化微乎其微,推測由proguard本身壓縮、優(yōu)化功能的作用引起;而與控制流混淆有關(guān)難的控制流復(fù)雜度卻沒有絲毫變化,反映proguard確實(shí)不具備控制流混淆的能力。綜合幾項(xiàng)屬性指標(biāo)的變化,幾乎沒有明顯有力的變化,其中變化稍微明顯的指令序列相似度也只能在一定程度上反映proguard隱蔽性能力,所以這些屬性指標(biāo)難以準(zhǔn)確地反映proguard代碼混淆工作的有效性。
究其原因,主要是因?yàn)閜roguard的代碼混淆功能針對外形混淆,而上述屬性指標(biāo)并不能絕對有效地反映外形混淆的效果,例如控制流復(fù)雜度是針對控制流混淆、不同算法在指令執(zhí)行率上有可能有全然相反的效果,故上述屬性指標(biāo)難以反映proguard代碼混淆工作有效性。另外,如今對代碼混淆評估工作的科學(xué)性、合理性還有待考究,各項(xiàng)屬性指標(biāo)在針對同一類型問題的不同算法進(jìn)行評估時(shí)效果明顯,但對某個(gè)特定的混淆工具整體進(jìn)行評估的科學(xué)性還缺乏有力地證明。
本發(fā)明功能點(diǎn)實(shí)驗(yàn)如下:
圖1-4是功能點(diǎn)實(shí)驗(yàn)結(jié)果圖,其中,圖1為hello.apk類結(jié)構(gòu)圖,圖2為hello_proguard.apk類結(jié)構(gòu)圖,圖3為hello.apk與hello_proguard.apk類結(jié)構(gòu)對比圖,圖4為proguard過度重載效果圖。
從以上屬性值計(jì)算分析看出當(dāng)前提出的代碼混淆有效性評估指標(biāo)無法對混淆工具整體混淆效果做出合理評價(jià)的結(jié)論,故以下試圖從混淆工具的功能點(diǎn)出發(fā)對代碼混淆工具的工作有效性進(jìn)行評價(jià)。proguard在應(yīng)用于安卓時(shí)在代碼混淆方面主要有以下功能:標(biāo)識符重命名、類再封裝、過度重載。標(biāo)識符重命名是指用任意的名字,例如"a"、"b",對項(xiàng)目中有意義的類和方法進(jìn)行重命名工作;類再封裝是指將項(xiàng)目中處于多級目錄下的類全部移動(dòng)到單級目錄下,重新封裝類的結(jié)構(gòu);過度重載是指重復(fù)使用相同名字來命名不同函數(shù)的多個(gè)方法。
(1)標(biāo)識符重命名;
仍以hello.apk和經(jīng)過proguard混淆后的hello_proguard.apk為例,分別對其進(jìn)行反編譯,直接觀察其源代碼,對混淆工作進(jìn)行評價(jià)。
hello.apk經(jīng)過反編譯得到類結(jié)構(gòu)圖如圖1所示,hello_proguard.apk經(jīng)過反編譯得到的類結(jié)構(gòu)圖如圖2所示。
經(jīng)過對比兩幅圖,分析proguard的應(yīng)用效果,可見proguard有效地對類名、方法名以及變量名進(jìn)行了重命名,有效地實(shí)現(xiàn)了標(biāo)識符重命名功能。
由混淆后的圖片還可以輕易地看出proguard對標(biāo)識符重命名采用了hash改名和重載歸納。圖中類、域以及方法的名字均被修改成了毫不相關(guān)的名字,例如類com.example.hello.mainactivity$1的名字被修改成cl,這屬于hash改名方法;我們還可以發(fā)現(xiàn)混淆后的工程,在a類中存在方法a():boolean、a(fragmentactivity):void和a(stringandroidfiledescriptorandroidprintwriterandroidstring[]):void,這三個(gè)方法同名但參數(shù)和返回類型不全相同,同名但調(diào)用不沖突,將程序中的名字盡可能用相同的來代替這屬于重載歸納方法。
(2)類再封裝;
對比混淆前后工程類的結(jié)構(gòu)圖,對比效果如圖3所示。從對比圖可以明顯觀察到混淆前項(xiàng)目com.example.hello包下的person類和com.jw.model包下的date類均被移動(dòng)單級目錄下,打亂了原工程類的結(jié)構(gòu),避免了攻擊者對類結(jié)構(gòu)進(jìn)行分析,理解開發(fā)者編程思路,并進(jìn)一步獲取項(xiàng)目信息,實(shí)現(xiàn)了類的再封裝。
(3)過度重載;
觀察hello_proguard.apk項(xiàng)目中不同方法的結(jié)構(gòu),如圖4所示??梢悦黠@地發(fā)現(xiàn)hello_proguard.apk源碼中a類和b類中均有名為a的變量以及名為a的方法,即在不同的類中方法和變量被重復(fù)使用相同的名字重命名。在不同類中重復(fù)使用無意義的名字進(jìn)行重命名工作,這進(jìn)一步加大了攻擊者閱讀代碼的難度,實(shí)現(xiàn)了過度重載功能。
以上所述,僅是本發(fā)明的較佳實(shí)施例而已,并非是對本發(fā)明作任何其他形式的限制,而依據(jù)本發(fā)明的技術(shù)實(shí)質(zhì)所作的任何修改或等同變化,仍屬于本發(fā)明所要求保護(hù)的范圍。