本發(fā)明涉及軟件加固領(lǐng)域,具體涉及一種基于隨機(jī)混淆的android軟件協(xié)同加固方法。
背景技術(shù):
android是一款源碼開放的移動智能終端操作系統(tǒng),它基于linux內(nèi)核,由谷歌開發(fā)。android自上市以來,其市場占有率逐年攀升,2016年上半年android在全球智手機(jī)操作系統(tǒng)的占有率為86.2%。目前android系統(tǒng)已經(jīng)遍布我們生活的方方面面,例如手機(jī)、平臺電腦、電視、手表、車載系統(tǒng)甚至健康檢測設(shè)備等。
一個android軟件開發(fā)從需求分析、到最后的定型發(fā)布,以及隨后的不斷升級,都需要開發(fā)單位投入大量的人財物。但是android軟件具有很強的流通性,無法防止被惡意篡改或盜版。被篡改或盜版的android軟件不僅會導(dǎo)致用戶信息泄露,嚴(yán)重的還會導(dǎo)致用戶資金損失,同時這在很大程度上損害了開發(fā)者的利益,所以android軟件的安全保護(hù)十分重要。
技術(shù)實現(xiàn)要素:
本發(fā)明為了克服以上技術(shù)的不足,提供了一種有效防止android軟件被篡改和盜版的一種基于隨機(jī)混淆的android軟件協(xié)同加固方法。
本發(fā)明克服其技術(shù)問題所采用的技術(shù)方案是:
一種基于隨機(jī)混淆的android軟件協(xié)同加固方法,包括如下步驟:
a)解壓需要加固的android軟件,分別獲得classes.dex文件和bin文件;
b)對classes.dex文件頭header進(jìn)行隨機(jī)混淆,對classes.dex文件增加無用隨機(jī)代碼;
c)對源文件中的bin文件進(jìn)行重命名并將原bin文件名稱作為加載器名稱,完成對加載器的重命名,重命名后的加載器loder將classes.dex與重命名后的bin文件隔離;
d)計算混淆后的classes.dex文件的hash值hash_dex,并對hash_dex進(jìn)行加密,將加密后為hash_dex文件保存至加載器loder中;
e)計算加載器loder的hash值hash_loder,計算重命名后的bin文件hash值hash_core;
f)對重命名后的bin文件進(jìn)行加密并生成密文ciphertext,將ciphertext、hash_loder和hash_core組成文件date;
g)將date文件、bin文件以及混淆后的classes.dex文件進(jìn)行重新簽名,打包生成加固后的apk。
上述步驟b)中的隨機(jī)混淆包括如下步驟:
b-1)利用整數(shù)隨機(jī)函數(shù)生成一個隨機(jī)數(shù)n,1500<n<2500;
b-2)計算機(jī)以n為參數(shù)并輸入隨機(jī)字符生成函數(shù),生成一個長度length=n的byte數(shù)組;
b-3)將長度為n的byte數(shù)組插入到dex頭文件的第p個位置上,其中p=0x28+n%(0x70-0x28),
其中,0x70為dex頭文件原始程度,0x28為magic、checksum、signature、filesize和headersize5字段的長度和;
b-4)對隨機(jī)數(shù)n進(jìn)行自定義加密,加密結(jié)果為8byte編碼,并將8byte編碼追加到dex文件尾部;
b-5)更新dex文件校驗碼字段checksum,用于根據(jù)alder32算法校驗dex文件除去magic、checksum兩字段外的文件的正確性;
b-6)更新dex文件哈希值字段signature,signature是利用sha-1算法計算dex文件除去magic、checksum和signature三字段外的哈希值,用于判斷文件完整性;
b-7)更新dex文件長度字段filesize的值為:filesize=filesize+n+8;
b-8)更新dex頭文件長度字段headersize的值為:headersize=headersize+n+8。
上述步驟d)中的加密方式為aes加密。
本發(fā)明的有益效果是:本基于隨機(jī)混淆的android軟件協(xié)同加固方法第一是對dex頭文件隨機(jī)混淆加固,第二是對bin文件的安全動態(tài)加載加固。通過隨機(jī)混淆的協(xié)同加固方法對android軟件進(jìn)行保護(hù),增強了代碼的安全性。有效防止android軟件被惡意篡改或盜版的現(xiàn)象發(fā)生。
附圖說明
圖1為本發(fā)明的流程圖。
具體實施方式
下面結(jié)合附圖1對本發(fā)明做進(jìn)一步說明。
一種基于隨機(jī)混淆的android軟件協(xié)同加固方法,包括如下步驟:a)解壓需要加固的android軟件,分別獲得classes.dex文件和bin文件;b)對classes.dex文件頭header進(jìn)行隨機(jī)混淆,對classes.dex文件增加無用隨機(jī)代碼;c)對源文件中的bin文件進(jìn)行重命名并將原bin文件名稱作為加載器名稱,完成對加載器的重命名,重命名后的加載器loder將classes.dex與重命名后的bin文件隔離;d)計算混淆后的classes.dex文件的hash值hash_dex,并對hash_dex進(jìn)行加密,將加密后為hash_dex文件保存至加載器loder中;e)計算加載器loder的hash值hash_loder,計算重命名后的bin文件hash值hash_core;f)對重命名后的bin文件進(jìn)行加密并生成密文ciphertext,將ciphertext、hash_loder和hash_core組成文件date;g)將date文件、bin文件以及混淆后的classes.dex文件進(jìn)行重新簽名,打包生成加固后的apk。本基于隨機(jī)混淆的android軟件協(xié)同加固方法第一是對dex頭文件隨機(jī)混淆加固,第二是對bin文件的安全動態(tài)加載加固。通過隨機(jī)混淆的協(xié)同加固方法對android軟件進(jìn)行保護(hù),增強了代碼的安全性。有效防止android軟件被惡意篡改或盜版的現(xiàn)象發(fā)生。
步驟b)中的隨機(jī)混淆包括如下步驟:b-1)利用整數(shù)隨機(jī)函數(shù)生成一個隨機(jī)數(shù)n,1500<n<2500;b-2)計算機(jī)以n為參數(shù)并輸入隨機(jī)字符生成函數(shù),生成一個長度length=n的byte數(shù)組;b-3)將長度為n的byte數(shù)組插入到dex頭文件的第p個位置上,其中p=0x28+n%(0x70-0x28),其中,0x70為dex頭文件原始程度,0x28為magic、checksum、signature、filesize和headersize5字段的長度和;b-4)對隨機(jī)數(shù)n進(jìn)行自定義加密,加密結(jié)果為8byte編碼,并將8byte編碼追加到dex文件尾部;b-5)更新dex文件校驗碼字段checksum,用于根據(jù)alder32算法校驗dex文件除去magic、checksum兩字段外的文件的正確性;b-6)更新dex文件哈希值字段signature,signature是利用sha-1算法計算dex文件除去magic、checksum和signature三字段外的哈希值,用于判斷文件完整性;b-7)更新dex文件長度字段filesize的值為:filesize=filesize+n+8;b-8)更新dex頭文件長度字段headersize的值為:headersize=headersize+n+8。通過對dex頭文件進(jìn)行大量隨機(jī)字符混淆,在不影響android軟件執(zhí)行效率情況下,增加了dex文件反編譯的難度,提高了源碼的安全性,同時保證了dex文件的正確性和完整性。在文件加載時首先利用加載器dexclassloder將混淆后的dex文件載入內(nèi)存。讀取dex頭文件中的headersize字段,根據(jù)headersize值讀取dex頭文件dexheader。從dex文件尾部讀取8字節(jié)編碼,通過自定義解密算法得到隨機(jī)混淆字段長度n,通過4)中公式計算出隨機(jī)混淆字段的插入位置p。從dex頭文件中移除第p到第p+n-1個byte,更新checksum、checksum、filesize和headersize字段,最終得到正確的dex文件。
進(jìn)一步的,步驟d)中的加密方式為aes加密。