本發(fā)明屬于android應(yīng)用重打包檢測(cè)技術(shù)領(lǐng)域,尤其涉及一種基于java文件目錄結(jié)構(gòu)的android應(yīng)用重打包檢測(cè)方法。
背景技術(shù):
目前android應(yīng)用重打包檢測(cè)方法主要有基于代碼或者行為的檢測(cè)方法?;诖a或者行為的檢測(cè)方法采用反編譯工具或者動(dòng)態(tài)行為分析工具得到代碼文件或應(yīng)用行為序列,然后進(jìn)行預(yù)處理得到序列特征,通過(guò)計(jì)算序列特征的距離得到應(yīng)用相似性的量化數(shù)據(jù)。該方法可以檢測(cè)應(yīng)用代碼的改變,解決包括代碼重用、剽竊和重打包等問(wèn)題,但是序列特征的提取容易受到代碼混淆技術(shù)的影響,因而在針對(duì)實(shí)際問(wèn)題進(jìn)行分析時(shí)具有一定的局限性。
技術(shù)實(shí)現(xiàn)要素:
發(fā)明目的:為解決現(xiàn)有技術(shù)中存在的問(wèn)題,本發(fā)明提出一種能有效避免代碼混淆技術(shù)以及惡意代碼的插入帶來(lái)的影響的基于java文件目錄結(jié)構(gòu)的android應(yīng)用重打包檢測(cè)方法。
技術(shù)方案:一種基于java文件目錄結(jié)構(gòu)的android應(yīng)用重打包檢測(cè)方法,包括如下步驟:
(1)建立應(yīng)用簽名庫(kù):對(duì)于已知的每一個(gè)apk應(yīng)用程序進(jìn)行處理,得到應(yīng)用簽名,并建立應(yīng)用簽名庫(kù),具體過(guò)程為:
1.1對(duì)apk應(yīng)用程序進(jìn)行解壓縮等處理后得到具有特定目錄結(jié)構(gòu)的java類(lèi)文件;
1.2對(duì)其中每一個(gè)java的包名和java類(lèi)名進(jìn)行改進(jìn)的哈希運(yùn)算,將所得字符串作為節(jié)點(diǎn)簽名,構(gòu)成以應(yīng)用簽名為節(jié)點(diǎn)的樹(shù)形結(jié)構(gòu);
1.3對(duì)步驟1.2中得到的樹(shù)形結(jié)構(gòu)進(jìn)行深度優(yōu)先遍歷,將遍歷過(guò)的節(jié)點(diǎn)簽名進(jìn)行連接,得到最后的應(yīng)用簽名,建立應(yīng)用簽名庫(kù);
(2)檢測(cè)應(yīng)用程序,得到檢測(cè)結(jié)果:對(duì)于待檢測(cè)apk應(yīng)用程序,使用步驟(1)中的方法計(jì)算出應(yīng)用簽名后,再計(jì)算待檢測(cè)應(yīng)用簽名和應(yīng)用簽名庫(kù)中應(yīng)用簽名之間的編輯距離以及應(yīng)用相似度,將所得應(yīng)用相似度與閾值進(jìn)行比較,判斷是否為應(yīng)用簽名庫(kù)中apk應(yīng)用程序的重打包應(yīng)用,得到檢測(cè)結(jié)果;如果所得應(yīng)用相似度大于閾值,則為apk應(yīng)用程序的重打包應(yīng)用。
進(jìn)一步的,所述步驟1.1中對(duì)apk應(yīng)用程序進(jìn)行解壓縮等處理后得到具有特定目錄結(jié)構(gòu)的java類(lèi)文件,具體為:將apk應(yīng)用程序后綴名改為zip,然后解壓縮,得到可執(zhí)行字節(jié)碼文件classes.dex,通過(guò)執(zhí)行dex2jar軟件轉(zhuǎn)化為jar文件,再把后綴名改為zip并進(jìn)行解壓,得到包含java文件的目錄結(jié)構(gòu)。
進(jìn)一步的,所述步驟1.2中改進(jìn)的哈希運(yùn)算步驟如下:
a)將字符串按照序號(hào)模3運(yùn)算分成三組;
b)每組字符串按照ascii碼表轉(zhuǎn)化為十進(jìn)制整數(shù)數(shù)組;
c)對(duì)每組分別求和并進(jìn)行模62運(yùn)算得到三個(gè)整數(shù);
d)將三個(gè)整數(shù)轉(zhuǎn)化為三個(gè)字符,構(gòu)成輸出字符串。轉(zhuǎn)化規(guī)則為:0~9轉(zhuǎn)化為字符“0”到“9”,10~35轉(zhuǎn)化為字符“a”到“z”,36~61轉(zhuǎn)化為字符“a”到“z”。
進(jìn)一步的,所述步驟(2)中計(jì)算待檢測(cè)應(yīng)用簽名和應(yīng)用簽名庫(kù)中應(yīng)用簽名之間的編輯距離以及應(yīng)用相似度的計(jì)算公式如下:
式(1)中distance(a,b)為簽名a和簽名b的編輯距離,length1和length2為簽名a和簽名b的長(zhǎng)度。
進(jìn)一步的,所述步驟(2)中的閾值為0.85。
有益效果:針對(duì)目前大量存在的android重打包應(yīng)用,本發(fā)明提出了一種基于java文件目錄結(jié)構(gòu)的android應(yīng)用重打包檢測(cè)方法。首先對(duì)于應(yīng)用庫(kù)中每一個(gè)apk應(yīng)用程序,解壓縮得到具有特定目錄結(jié)構(gòu)的java類(lèi)文件,該目錄結(jié)構(gòu)可視為樹(shù)形結(jié)構(gòu),然后對(duì)其中每一個(gè)目錄名(即java的包名)和文件名(即java類(lèi)名)進(jìn)行我們自定義的哈希運(yùn)算,將所得哈希值作為節(jié)點(diǎn)簽名,使用深度優(yōu)先遍歷算法將節(jié)點(diǎn)簽名進(jìn)行連接得到最終應(yīng)用簽名。計(jì)算出所有已知應(yīng)用的簽名并組成簽名庫(kù)。對(duì)于待檢測(cè)的apk應(yīng)用程序,按照類(lèi)似方法獲得其簽名,并計(jì)算該簽名與簽名庫(kù)中簽名的編輯距離,得出檢測(cè)結(jié)果。本發(fā)明是基于java文件目錄結(jié)構(gòu)的android應(yīng)用重打包檢測(cè)方法提供了一種新的重打包檢測(cè)方法。隨著越來(lái)越多的重打包軟件采用代碼混淆技術(shù),基于代碼或者行為的檢測(cè)方法必然會(huì)受到嚴(yán)重影響。而本發(fā)明采用的是基于java類(lèi)文件目錄結(jié)構(gòu)來(lái)提取特征,并不受上述行為的影響。所以相對(duì)傳統(tǒng)的基于代碼或者行為的檢測(cè)方法,本發(fā)明快速有效,可以有效抵抗代碼混淆,對(duì)于應(yīng)用的重打包檢測(cè)具有較高的準(zhǔn)確率。
附圖說(shuō)明
圖1為本發(fā)明的流程圖。
具體實(shí)施方式
下面將結(jié)合附圖,對(duì)本發(fā)明的實(shí)施案例進(jìn)行詳細(xì)的描述;
如圖1所示,一種基于java文件目錄結(jié)構(gòu)的android應(yīng)用重打包檢測(cè)方法,包括如下步驟:
(1)建立應(yīng)用簽名庫(kù):對(duì)于已知的每一個(gè)apk應(yīng)用程序進(jìn)行處理,得到應(yīng)用簽名,并建立應(yīng)用簽名庫(kù):
1.1對(duì)apk應(yīng)用程序進(jìn)行解壓縮等處理后得到具有特定目錄結(jié)構(gòu)的java類(lèi)文件;
1.2對(duì)其中每一個(gè)java的包名和java類(lèi)名進(jìn)行改進(jìn)的哈希運(yùn)算,將所得字符串作為節(jié)點(diǎn)簽名,構(gòu)成以應(yīng)用簽名為節(jié)點(diǎn)的樹(shù)形結(jié)構(gòu);
1.3對(duì)步驟1.2中得到的樹(shù)形結(jié)構(gòu)進(jìn)行深度優(yōu)先遍歷,將遍歷過(guò)的節(jié)點(diǎn)簽名進(jìn)行連接,得到最后的應(yīng)用簽名,建立應(yīng)用簽名庫(kù);
(2)檢測(cè)應(yīng)用程序,得到檢測(cè)結(jié)果:對(duì)于待檢測(cè)apk應(yīng)用程序,使用步驟(1)中的方法計(jì)算出應(yīng)用簽名后,再計(jì)算待檢測(cè)應(yīng)用簽名和應(yīng)用簽名庫(kù)中應(yīng)用簽名之間的編輯距離以及應(yīng)用相似度,將所得應(yīng)用相似度與閾值進(jìn)行比較,判斷是否為應(yīng)用簽名庫(kù)中apk應(yīng)用程序的重打包應(yīng)用,得到檢測(cè)結(jié)果,如果所得應(yīng)用相似度大于閾值,則為apk應(yīng)用程序的重打包應(yīng)用。
本實(shí)施例中:
第一步,應(yīng)用簽名庫(kù)的建立;
第二步,應(yīng)用程序的檢測(cè)過(guò)程。
應(yīng)用簽名庫(kù)的建立具體過(guò)程如下:
(1)將apk應(yīng)用程序后綴名改為zip,然后解壓縮,得到可執(zhí)行字節(jié)碼文件classes.dex,通過(guò)執(zhí)行dex2jar軟件轉(zhuǎn)化為jar文件,再把后綴名改為zip并進(jìn)行解壓,得到包含java文件的目錄結(jié)構(gòu)。
(2)對(duì)其中每一個(gè)目錄名(即java的包名)和文件名(即java類(lèi)名),首先將文件名長(zhǎng)度小于3的文件過(guò)濾掉,然后對(duì)于剩下的文件進(jìn)行我們自定義的改進(jìn)的哈希運(yùn)算,將哈希運(yùn)算的結(jié)果作為節(jié)點(diǎn)簽名,構(gòu)成以簽名為節(jié)點(diǎn)的樹(shù)狀結(jié)構(gòu)。
該哈希運(yùn)算規(guī)則為:
a)將字符串按照序號(hào)模3運(yùn)算分成3組;
b)按照ascii碼表轉(zhuǎn)化為十進(jìn)制整數(shù),分別進(jìn)行求和后對(duì)62取余數(shù);
c)按照0~9轉(zhuǎn)化為字符“0”到“9”,10~35轉(zhuǎn)化為字符“a”到“z”,36~61轉(zhuǎn)化為字符“a”到“z”的規(guī)則轉(zhuǎn)化為字符,得到長(zhǎng)度為3的字符串。
例如,對(duì)于文件“uppayassistex.class”,首先將文件名分成3組字符串,分別是“uassx”、“pyst”和“paie”,然后按照ascii碼表轉(zhuǎn)化為十進(jìn)制整數(shù)并進(jìn)行求和,得到85+97+115+115+120、80+121+115+116和80+65+105+69,即532、432和319,對(duì)62取余數(shù)后得到36、60和9,再轉(zhuǎn)化為字符,即“a”、“y”和“9”,所以“ay9”為文件“uppayassistex.class”的哈希運(yùn)算結(jié)果,也即節(jié)點(diǎn)簽名。
(3)進(jìn)行深度優(yōu)先遍歷算法,將節(jié)點(diǎn)簽名進(jìn)行連接,得到最后的應(yīng)用簽名。
(4)將所得到的應(yīng)用簽名加入簽名庫(kù)。
第二步,應(yīng)用程序的檢測(cè)過(guò)程。
(1)按照前述第一步中的(1)~(3)得到待檢測(cè)應(yīng)用的簽名。
(2)計(jì)算所得簽名與簽名庫(kù)中所有簽名之間的編輯距離distance(a,b)。然后計(jì)算應(yīng)用相似度,計(jì)算公式如下:
式(1)中distance(a,b)為簽名a和簽名b的編輯距離,length1和length2為簽名a和簽名b的長(zhǎng)度。
若存在一個(gè)簽名,它們之間的相似度大于給定閾值則表示二者為重打包應(yīng)用。經(jīng)過(guò)我們的試驗(yàn),將判斷是否為重打包應(yīng)用的閾值可設(shè)為0.85。
本發(fā)明首先對(duì)于每一個(gè)已知的apk應(yīng)用程序,通過(guò)解壓縮得到具有特定目錄結(jié)構(gòu)的java類(lèi)文件,該目錄結(jié)構(gòu)可視為樹(shù)形結(jié)構(gòu),然后對(duì)其中每一個(gè)目錄名(即java的包名)和文件名(即java類(lèi)名)進(jìn)行我們自定義的哈希運(yùn)算,將所得哈希值作為節(jié)點(diǎn)簽名,使用深度優(yōu)先遍歷算法將節(jié)點(diǎn)簽名進(jìn)行連接得到最終應(yīng)用簽名。計(jì)算出所有已知應(yīng)用的簽名并組成簽名庫(kù)。對(duì)于待檢測(cè)的apk應(yīng)用程序,按照類(lèi)似方法獲得其簽名,并計(jì)算該簽名與簽名庫(kù)中簽名的編輯距離以及相似度,得出檢測(cè)結(jié)果。本發(fā)明可以有效避免代碼混淆技術(shù)以及惡意代碼的插入帶來(lái)的影響,從而具有較好的健壯性和準(zhǔn)確率。