本發(fā)明涉及終端應用安全技術(shù)領(lǐng)域,特別涉及一種APK的加固方法和裝置、以及動態(tài)加載方法和裝置。
背景技術(shù):
APK(Android Package)即安卓Android安裝包,是Android操作系統(tǒng)上的應用程序安裝文件,該應用安裝文件由安裝文件打包工具根據(jù)多個文件生成,生成APK的文件一般采用java編程語言編寫,用戶將通過安裝文件打包工具生成的APK文件上傳到安卓模擬器或安卓操作系統(tǒng)的用戶設備中執(zhí)行即可安裝。
隨著Android移動終端平臺的日益發(fā)展,第三方應用程序大量涌現(xiàn),對應用的盜版和重打包現(xiàn)象日益嚴重。由于Android平臺采用Java語言開發(fā),導致APK中的代碼易于被反編譯,通過反編譯APK文件,進行代碼的分析、修改或者插入,再重新簽名打包為新的APK文件,以達到改變程序原有行為的目的,APK的篡改行為嚴重損害了應用程序開發(fā)商的利益和積極性,而利用APK篡改技術(shù),通過加入惡意代碼使得Android用戶面臨隱私泄露和財產(chǎn)損失的危險,嚴重影響了用戶的應用安全。因此,開發(fā)者們對于Android程序代碼的加固防護也越來越關(guān)注。
現(xiàn)有安卓軟件安裝包APK的加固方法中,對APK中的某些重要數(shù)據(jù)進行加密,將加密數(shù)據(jù)以文件形式存放在資源存放目錄res目錄下或者額外資源目錄assets目錄下,程序執(zhí)行執(zhí)行過程中去對應目錄下尋找這個加密文件并加載,從而完APK文件的運行,但是該種加密數(shù)據(jù)的存放方式隱蔽性差,容易被發(fā)現(xiàn),導致APK被破解的風險仍然較大。
技術(shù)實現(xiàn)要素:
針對現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明實施例的目的在于提供一種能夠克服上述問題或者至少能夠部分地解決上述問題的一種APK的加固方法和裝置、以及動態(tài)加載方法和裝置。
為實現(xiàn)上述目的,本發(fā)明的一個實施例中提供了一種APK文件的加固方法,所述加固方法包括:
一種APK文件的加固方法,其特征在于,包括:
獲取待加固的原APK中需要保護的原數(shù)據(jù);
將所述原數(shù)據(jù)進行加密處理,得到加密數(shù)據(jù);
對所述原APK進行加固處理,生成目標APK,其中,所述加密數(shù)據(jù)以文件形式存儲于所述目標APK的預設位置。
優(yōu)選的,如上所述的加固方法,所述預設位置為目標APK的classes.dex文件中的位置。
優(yōu)選的,如上所述的加固方法,所述預設位置為目標APK的classes.dex文件的文件頭和/或數(shù)據(jù)區(qū)的N個指定位置,N≥1。
優(yōu)選的,如上所述的加固方法,所述N=1,所述指定位置為所述數(shù)據(jù)區(qū)的頭部或尾部。
優(yōu)選的,如上所述的加固方法,所述N=2;所述加密數(shù)據(jù)包括第一加密數(shù)據(jù)和第二加密數(shù)據(jù);
所述指定位置包括第一指定位置和第二指定位置,第一加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第一指定位置,第二加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第二指定位置。
優(yōu)選的,如上所述的加固方法,所述第一指定位置為所述數(shù)據(jù)區(qū)的頭部,所述第二指定位置為所述數(shù)據(jù)區(qū)的尾部。
優(yōu)選的,如上所述的加固方法,所述原數(shù)據(jù)為原APK中的非classes.dex文件中的數(shù)據(jù);
所述對所述原APK進行加固處理,生成目標APK,包括:
根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)添加到原APK中的對應位置;
將添加后的原APK中除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
優(yōu)選的,如上所述的加固方法,若所述預設位置為目標APK的classes.dex文件中的位置,所述將添加后的原APK中除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK,包括:
重新計算并更新添加加密數(shù)據(jù)后的原APK的classes.dex文件的文件頭信息,得到更新后的第一classes.dex文件;
將第一classes.dex文件和原APK的除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
優(yōu)選的,如上所述的加固方法,所述原數(shù)據(jù)為原APK的classes.dex文件中的數(shù)據(jù);
所述對所述原APK進行加固處理,生成目標APK,包括:
記錄原數(shù)據(jù)在原APK的classes.dex文件中的原位置信息;
根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)和所述原位置信息添加到原APK中的的對應位置;
刪除原APK的classes.dex文件中的所述原數(shù)據(jù),得到第二classes.dex文件;
重新計算并更新第二classes.dex文件的文件頭信息,得到第三classes.dex文件;
將第三classes.dex文件和原APK的除其classes.dex文件外的其它文件進行重新打包簽名,生成目標APK。
在本發(fā)明的一個實施例中還提供了一種APK文件的加固裝置,該裝置包括:
加密數(shù)據(jù)生成模塊,用于獲取待加固的原APK中需要保護的原數(shù)據(jù),將所述原數(shù)據(jù)進行加密處理,得到加密數(shù)據(jù);
目標APK生成模塊,用于對所述原APK進行加固處理,生成目標APK,其中,所述加密數(shù)據(jù)以文件形式存儲于所述目標APK的預設位置。
在本發(fā)明的一個實施例中,還提供了一種加固APK的動態(tài)加載方法,其中,所述加固APK為采用上述任一APK文件的加固方法生成的目標APK,所述動態(tài)加載方法包括:
解壓所述目標APK;
根據(jù)加密數(shù)據(jù)在目標APK中的存儲位置,提取所述加密數(shù)據(jù),并對加密數(shù)據(jù)進行解密得到原數(shù)據(jù);
根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載。
優(yōu)選的,如上所述的動態(tài)加載方法,若所述原數(shù)據(jù)為原APK中的classes.dex文件中的數(shù)據(jù),所述根據(jù)加密數(shù)據(jù)在目標APK的存儲位置,提取所述加密數(shù)據(jù),還包括:獲取加密數(shù)據(jù)所對應的原數(shù)據(jù)的原位置信息;
所述根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載,包括:
根據(jù)所述原數(shù)據(jù)的原始位置信息,將所述原數(shù)據(jù)放回到第三classes.dex文件中的對應位置,得到目標APK的完整classes.dex文件;
通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載。
優(yōu)選的,如上所述的動態(tài)加載方法,所述通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載,包括:
所述完整classes.dex文件中原數(shù)據(jù)被加載到內(nèi)存空間中后,刪除所述完整classes.dex文件中的所述原數(shù)據(jù)。
在本發(fā)明的一個實施例中,還提供了一種加固APK的動態(tài)加載裝置,所述動態(tài)加載裝置包括:
目標APK解壓模塊,用于解壓所述目標APK;
原數(shù)據(jù)提取模塊,用于根據(jù)加密數(shù)據(jù)在目標APK中的的存儲位置,提取所述加密數(shù)據(jù),并對加密數(shù)據(jù)進行解密得到原數(shù)據(jù);
APK動態(tài)加載模塊,用于根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載。
優(yōu)選的,如上所述的動態(tài)加載裝置,若所述原數(shù)據(jù)為原APK中的classes.dex文件中的數(shù)據(jù),所述原數(shù)據(jù)提取模塊還用于獲取加密數(shù)據(jù)所對應的原數(shù)據(jù)的原位置信息;
所述APK動態(tài)加載模塊包括:
完整dex獲取單元,用于根據(jù)所述原數(shù)據(jù)的原始位置信息,將所述原數(shù)據(jù)放回到第三classes.dex文件中的對應位置,得到目標APK的完整classes.dex文件;
dex動態(tài)加載單元,用于通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載。
優(yōu)選的,如上所述的動態(tài)加載裝置,所述dex動態(tài)加載單元還包括:
原數(shù)據(jù)刪除子單元,用于在所述完整classes.dex文件中的原數(shù)據(jù)被加載到內(nèi)存空間中后,刪除所述完整classes.dex文件中的所述原數(shù)據(jù)。
本發(fā)明的有益效果在于:本發(fā)明實施例中所提供的APK的加固方法和裝置、及動態(tài)加載方法和裝置,通過將運行APK所不可或缺的原數(shù)據(jù)加密處理后,隱藏存儲于目標APK文件中的預設位置中,在APK運行時,根據(jù)加密數(shù)據(jù)的文件在目標APK中的存儲位置,找到所述預設位置處的加密數(shù)據(jù),以完成APK的整個動態(tài)加載運行過程,采用本發(fā)明實施例中所提供的方法和裝置,提高了加密數(shù)據(jù)的存儲隱蔽性,增加了反編譯的難度,極大程度地提高了APK文件的安全性。在本發(fā)明的另一實施例中,加載運行本實施例提供的加固方法生成目標APK時,若原數(shù)據(jù)被被加載到內(nèi)存中,則還可以在加載完成后,刪除所述原數(shù)據(jù),進一步避免了原數(shù)據(jù)被竊取,提高了APK反編譯難度。
附圖說明
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,附圖僅限于示出優(yōu)選實施方式的目的,而并不認為是本發(fā)明的限制,且對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明一個實施例中的一種APK文件的加固方法的流程示意圖;
圖2為本發(fā)明一個實施例中的原APK的dex文件的結(jié)構(gòu)示意圖;
圖3為本發(fā)明的一個實施例中的目標APK的dex文件的結(jié)構(gòu)示意圖;
圖4為本發(fā)明的一個實施例中的一種APK文件的加固裝置的結(jié)構(gòu)示意圖;
圖5為本發(fā)明的一個實施例中的目標APK生成模塊的結(jié)構(gòu)示意圖;
圖6為本發(fā)明的一個實施例中的目標APK生成模塊的結(jié)構(gòu)示意圖;
圖7為本發(fā)明的一個實施例中的一種加固APK的動態(tài)加載方法的流程示意圖;
圖8為本發(fā)明的一個實施例中的一種加固APK的動態(tài)加載裝置的結(jié)構(gòu)示意圖;
圖9為本發(fā)明的一個實施例中的APK動態(tài)加載模塊的結(jié)構(gòu)示意圖;
圖10為本發(fā)明的一個實施例中的APK動態(tài)加載模塊的結(jié)構(gòu)示意圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,均屬于本發(fā)明保護的范圍。
圖1示出了本發(fā)明的一個實施例中提供的一種APK文件的加固方法的流程示意圖,由圖中可以看出,該方法主要可以包括以下幾個步驟:
步驟S110:獲取待加固的原APK中需要保護的原數(shù)據(jù);
步驟S120:將所述原數(shù)據(jù)進行加密處理,得到加密數(shù)據(jù);
步驟S130:對所述原APK進行加固處理,生成目標APK,所述加密數(shù)據(jù)以文件形式存儲于所述目標APK的預設位置。
為了描述方便,本發(fā)明的實施例中,將待加固的APK記為原APK,對原APK進行加固處理后生成的APK記為目標APK。
本實施例中所提供的所述加固方法,首先確定需要進行保護的原數(shù)據(jù),所述原數(shù)據(jù)指的是對APK運行來說不可或缺的數(shù)據(jù),也就是反編譯APK時所必不可少的數(shù)據(jù)。具體選擇哪些數(shù)據(jù)作為原數(shù)據(jù),可以根據(jù)實際需要確定,可以是與原APK的classes.dex文件有關(guān)的數(shù)據(jù),也可以是與原APK的classes.dex文件無關(guān)的數(shù)據(jù)。例如,在實際操作中,開發(fā)者人員可以通過注解來標識出希望得到保護的內(nèi)容,在進行APK加固時,即可以根據(jù)注解來確定原始APK中需要保護的數(shù)據(jù)。
確定好需要保護的原數(shù)據(jù)后,通過對原APK進行反編譯處理,提取出原數(shù)據(jù)。將原數(shù)據(jù)進行加密處理,得到加密數(shù)據(jù)時,可以根據(jù)需要選擇任意的一種加密方式。得到加密數(shù)據(jù)后,根據(jù)加密數(shù)據(jù),對原APK文件進行加固處理,得到目標APK,使加密數(shù)據(jù)最終以文件形式存儲于所述目標APK的預設位置。
本實施例所提供的加固方法,通過將運行APK必不可少的文件加密存儲與目標APK的預設位置中,提高了加密數(shù)據(jù)的存儲隱蔽性,增加了反編譯的難度,提高了APK文件的安全性。
在本發(fā)明的一個實施例中,所述預設位置為目標APK的classes.dex文件中的位置。
在本發(fā)明的一個實施例中,所述預設位置為目標APK的classes.dex文件的文件頭header和/或數(shù)據(jù)區(qū)的N個指定位置,N≥1。
也就是說,最終在目標APK的classes.dex文件中存在的加密數(shù)據(jù)可以是一個或者多個,指定位置的個數(shù)N由加密數(shù)據(jù)的個數(shù)決定,具體選取幾個以及哪些位置可以根據(jù)實際需要來確定。
在本發(fā)明的一個實施例中,所述N=1,此時,所述指定位置可以為目標APK的classes.dex文件的數(shù)據(jù)區(qū)的頭部,也就是目標APK的classes.dex文件的文件頭header的尾部。
在本發(fā)明的一個實施例中,所述N=2,即所述指定位置包括第一指定位置和第二指定位置,此時,所述加密數(shù)據(jù)包括第一加密數(shù)據(jù)和第二加密數(shù)據(jù),第一加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第一指定位置,第二加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第二指定位置。第一指定位置和第二指定位置均可以根據(jù)實際需要確定。
在本發(fā)明的一個實施例中,所述第一指定位置為所述數(shù)據(jù)區(qū)的頭部,所述第二指定位置為所述數(shù)據(jù)區(qū)的尾部。
其中,所述第一加密數(shù)據(jù)和第二加密數(shù)據(jù),可以是分別對原APK中需要保護的兩部分數(shù)據(jù)分別進行加密處理得到,即所確定的需要原數(shù)據(jù)包括第一原數(shù)據(jù)和第二原數(shù)據(jù);也可以是對APK中的所有需要保護的原數(shù)據(jù)進行加密處理后得到的加密數(shù)據(jù)進行再處理得到,即第一加密數(shù)據(jù)和第二加密數(shù)據(jù)可以是直接對原數(shù)據(jù)加密后得到,也可以對加密數(shù)據(jù)進行再處理得到,具體如何處理可以根據(jù)實際需要設置。同樣的,也可以是所述加密數(shù)據(jù)也可以多個,此時指定位置也對應為多個。
在本發(fā)明的一個實施例中,所述原數(shù)據(jù)為原APK中的非classes.dex文件中的數(shù)據(jù),即原數(shù)據(jù)與原APK的dex文件中的數(shù)據(jù)無關(guān),例如,原數(shù)據(jù)可以是原APK的程序全局配置文件AndroidManifest.xml中APK運行時不可或缺的數(shù)據(jù)、或者數(shù)據(jù)連接庫目錄lib中運行運行時不可或缺的數(shù)據(jù),也可以是在APK運行時所需要用到的一些秘鑰信息或者其它與與APK的應用程序運行有關(guān)的數(shù)據(jù)。
當所述原數(shù)據(jù)為原APK中的非classes.dex文件中的數(shù)據(jù)時,步驟S130中,所述對所述原APK進行加固處理,生成目標APK,包括:
根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)添加到原APK中的對應位置;
將添加后的原APK中除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
在本發(fā)明的一個實施例中,若所述預設位置為目標APK的classes.dex文件中的位置,則所述將添加后的原APK中除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK,包括:
重新計算并更新添加加密數(shù)據(jù)后的原APK的classes.dex文件的文件頭信息,得到更新后的第一classes.dex文件;
將第一classes.dex文件和原APK的除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
本實施例中,由于原數(shù)據(jù)是與原APK的classes.dex無關(guān)的數(shù)據(jù),因此,加密數(shù)據(jù)在目標APK的classes.dex文件中的位置與原APK的classes.dex文件中是相對應的,在將加密數(shù)據(jù)添加到原APK的classes.dex文件后,對于添加加密數(shù)據(jù)后的classes.dex文件,只需要再重新計算并更新其文件頭信息,然后將得到的新的classes.dex文件替換原APK的原dex文件,并與原APK的除原數(shù)據(jù)外的其它文件重新打包簽名,生成目標APK即可。
其中,所需要重新計算并更新的文件頭信息與加密數(shù)據(jù)存儲在的目標APK的位置有關(guān),例如,若加密數(shù)據(jù)以文件存儲在目標APK的dex文件的文件頭header的尾部,此時若加密數(shù)據(jù)文件作為文件頭的一部分,則需要更新的文件頭信息包括dex文件的總長度filesize和文件頭大小headersize,若此時加密數(shù)據(jù)文件作為數(shù)據(jù)區(qū)的一部分,則需要更新的文件頭中的信息則包括dex文件的總長度filesize以及文件頭中各偏移地址off字段的信息等;若加密數(shù)據(jù)以文件存于dex文件的數(shù)據(jù)區(qū)的尾部,則需要更新的文件頭中的信息則包括dex文件的總長度filesize。采用本實施例中的加固方法生成的目標APK,其classes.dex文件即所述的第一classes.dex文件。
例如,在本發(fā)明的一個實施例中,圖2示出了一個原APK的classes.dex文件的結(jié)構(gòu)示意圖,包括文件頭header和數(shù)據(jù)區(qū)(省略號部分)兩大部分,原APK的classes.dex文件的總長度為fileSize,文件頭大小為headerSize,假設預設位置即加密數(shù)據(jù)在目標APK中的存儲位置為目標APK的classes.dex文件的文件頭header的尾部(圖中data size/off位置之后),則目標APK的classes.dex文件的結(jié)構(gòu)示意圖如圖3中所示,其中,extra data即為加密數(shù)據(jù),加密數(shù)據(jù)位于目標APK的classes.dex文件的文件頭header的尾部,該位置與原APK的classes.dex文件中的位置是相同的,此時,更新后的文件頭header中的dex文件的總長度為原APK的fileSize+extraSize(加密數(shù)據(jù)的長度),文件頭大小為headerSize+extraSize,將更新后的dex文件替換原APK的原dex文件,與原APK中的除原數(shù)據(jù)外的其它文件進行重新打包簽名,完成目標APK的生成。
需要說明的是,圖2和圖3中的英文字段信息均為安卓dex文件的常用信息,對本領(lǐng)域技術(shù)人員來說是清楚的,在此不再一一說明。
在本發(fā)明的一個實施例中,所述原數(shù)據(jù)為原APK的classes.dex文件中的數(shù)據(jù),此時,步驟S130中,所述對所述原APK進行加固處理,生成目標APK,包括:
記錄原數(shù)據(jù)在原APK的classes.dex文件中的原位置信息;
根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)和所述原位置信息添加到原APK中的的對應位置;
刪除原APK的classes.dex文件中的所述原數(shù)據(jù),得到第二classes.dex文件;
重新計算并更新第二classes.dex文件的文件頭信息,得到第三classes.dex文件;
將第三classes.dex文件和原APK的除其classes.dex文件外的其它文件進行重新打包簽名,生成目標APK。
本實施例中,由于原數(shù)據(jù)是dex文件中的數(shù)據(jù),為了保證后續(xù)APK文件能夠正常加載運行,在加載運行時需要首先還原出完成的dex文件,因此,需要記錄原數(shù)據(jù)的原位置信息。采用本實施例中所提供的加固方法生成的目標APK,其classes.dex文件即所述第三classes.dex文件。
本實施例中,對于圖2中所示的一個原APK的dex文件的示意圖中,需要保護的數(shù)據(jù)即原數(shù)據(jù)是其中的一部分數(shù)據(jù),具體是哪部份數(shù)據(jù),可以根據(jù)需要選定,可以是文件頭header中的數(shù)據(jù)和/或圖2中未示出的數(shù)據(jù)區(qū)中的數(shù)據(jù)。例如,假設所述原數(shù)據(jù)為圖2中的dex文件的整個數(shù)據(jù)區(qū)中的數(shù)據(jù)(省略號部分的數(shù)據(jù),原APK的classes.dex文件中的功能代碼),將該部分數(shù)據(jù)加密后,假設確定的加密數(shù)據(jù)的位置為目標APK的classes.dex文件的數(shù)據(jù)區(qū)的頭部即文件頭header的尾部,則將加密數(shù)據(jù)及其對應的原數(shù)據(jù)的原始位置信息添加到圖2中所示的datasize/off位置的下方,并刪除原APK的dex文件中的數(shù)據(jù)區(qū),更新修改后的dex文件的文件頭信息,然后將更新后的dex文件替換原APK的原dex,與原APK的除dex文件之外的其它部分進行重新簽名打包,得到目標APK,在運行APK時,則首先在dex文件的數(shù)據(jù)區(qū)頭部即datasize/off的下方提取加密數(shù)據(jù),然后解密得到數(shù)據(jù)區(qū)的數(shù)據(jù),并根據(jù)原位置信息添加到數(shù)據(jù)區(qū)位置,得到完整的dex文件。
本發(fā)明實施例中所提供的APK的加固方法,通過將運行APK所不可或缺的原數(shù)據(jù)進行加密處理后,將加密數(shù)據(jù)隱藏存儲于目標APK文件中的指定位置中,在APK運行時,首先在目標APK中的所述指定位置處找到加密數(shù)據(jù),以完成APK的整個加載運行過程。采用該加固方法,提高了加密數(shù)據(jù)的存儲隱蔽性,增加了反編譯的難度,極大程度地提高了APK文件的安全性。
在本發(fā)明的一個實施例中,還提供了一種APK文件的加固裝置,如圖4所示,所述加固裝置包括加密數(shù)據(jù)生成模塊110和目標APK生成模塊120。其中:
加密數(shù)據(jù)生成模塊110,用于獲取待加固的原APK中需要保護的原數(shù)據(jù),將所述原數(shù)據(jù)進行加密處理,得到加密數(shù)據(jù);
目標APK生成模塊120,用于對所述原APK進行加固處理,生成目標APK,其中,所述加密數(shù)據(jù)以文件形式存儲于所述目標APK的預設位置。
采用本實施例中所提供的加固裝置,能夠?qū)ndroid下的APK應用程序進行加固處理,使運行APK所必須的原數(shù)據(jù)加密后以文件形式隱藏于目標APK的預設位置中,可有效規(guī)避Android逆向工具的反編譯,增加反編譯的難度,提高了目標APK的安全性。
在本發(fā)明的一個實施例中,所述預設位置可以為目標APK的classes.dex文件中的位置。
在本發(fā)明的一個實施例中,所述預設為目標APK的classes.dex文件的文件頭和/或數(shù)據(jù)區(qū)的N個指定位置,N≥1。在實際應用中,具體選擇幾個指定位置以及具體選取文件頭或數(shù)據(jù)區(qū)的什么位置可以根據(jù)實際需要進行選定。
在本發(fā)明的一個實施例中,所述N=1,所述指定位置為所述數(shù)據(jù)區(qū)的頭部或尾部。
在本發(fā)明的一個實施例中,所述N=2,即所述指定位置包括第一指定位置和第二指定位置,對應的,所述加密數(shù)據(jù)包括第一加密數(shù)據(jù)和第二加密數(shù)據(jù),此時,第一加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第一指定位置,第二加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第二指定位置。
在本發(fā)明的一個實施例中,所述第一指定位置為所述數(shù)據(jù)區(qū)的頭部即dex文件的文件頭header的尾部,所述第二指定位置為所述數(shù)據(jù)區(qū)的尾部。
在本發(fā)明的一個實施例中,所述原數(shù)據(jù)可以為原APK的非classes.dex文件中的數(shù)據(jù)。此時,所述目標APK生成模塊120可以包括第一加密數(shù)據(jù)插入單元121和第一目標APK生成單元122,如圖5所示。其中:
第一加密數(shù)據(jù)插入單元121,根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)添加到原APK中的對應位置;
第一目標APK生成單元122,用于將添加后的原APK中除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
在本發(fā)明的一個實施例中,若所述預設位置為目標APK的classes.dex文件中的位置,所述第一目標APK生成單元122包括目標dex生成子單元和目標APK生成子單元。其中:
目標dex生成子單元,用于重新計算并更新添加加密數(shù)據(jù)后的原APK的classes.dex文件的文件頭信息,得到更新后的第一classes.dex文件;
目標APK生成子單元,用于將第一classes.dex文件和原APK的除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
在本發(fā)明的一個實施例中,所述原數(shù)據(jù)可以為原APK的classes.dex文件中的數(shù)據(jù);此時,所述目標APK生成模塊120包括原位置記錄單元123、第二加密數(shù)據(jù)插入單元124、原數(shù)據(jù)刪除單元125、目標dex生成單元126和第二目標APK生成單元127,如圖6所示。其中:
原位置記錄單元123,用于記錄原數(shù)據(jù)在原APK的classes.dex文件中的原位置信息;
第二加密數(shù)據(jù)插入單元124,用于根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)和所述原位置信息添加到原APK中的的對應位置;
原數(shù)據(jù)刪除單元125,用于刪除原APK的classes.dex文件中的所述原數(shù)據(jù),得到第二classes.dex文件;
目標dex生成單元126,用于重新計算并更新第二classes.dex文件的文件頭信息,得到第三classes.dex文件;
第二目標APK生成單元127,用于將第三classes.dex文件和原APK的除其classes.dex文件外的其它文件進行重新打包簽名,生成目標APK。
在本發(fā)明的一個實施例中,還提供了一種加固APK的動態(tài)加載方法,其中,所述加固APK為采用上述任一實施例中APK的加固方法或加固裝置生成的目標APK,圖7示出了本發(fā)明的一個實施例中的一種加固APK的動態(tài)加載方法的流程圖,該動態(tài)加載方法包括以下步驟:
步驟S710:解壓所述目標APK;
步驟S720:根據(jù)加密數(shù)據(jù)在目標APK的的存儲位置,提取所述加密數(shù)據(jù),并對加密數(shù)據(jù)進行解密得到原數(shù)據(jù);
步驟S730:根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載。
本實施例中所提供的加載方法,首先解壓目標APK,APK文件是指是zip格式的壓縮包,只是后綴名被修改后apk,因此,可以通過解壓得到APK文件的目錄文件,解壓后根據(jù)加密數(shù)據(jù)在目標APK中的存儲位置(即前文中的所述預設位置),即可提取得到所述加密數(shù)據(jù),對加密數(shù)據(jù)進行解密處理得到對應的原數(shù)據(jù)。所述解密處理的解密方式為與加密數(shù)據(jù)生成時采用的加密方式相對應。解密得到原數(shù)據(jù)后,便可以根據(jù)原數(shù)據(jù)和解壓后的目標APK,通過Android API提供的dex類加載器DexClassLoader類完成目標APK的classes.dex文件加載運行。其中,具體的加載運行步驟根據(jù)原數(shù)據(jù)的不同而有所有不同。
在本發(fā)明的一個實施例中,若所述原數(shù)據(jù)為原APK的非classes.dex文件中的數(shù)據(jù)時,從dex中提取出加密數(shù)據(jù),解密加密數(shù)據(jù)得到原數(shù)據(jù)后,便結(jié)合原數(shù)據(jù)和目標APK的dex文件其它數(shù)據(jù)完成APK的運行。根據(jù)原數(shù)據(jù)的不同,原數(shù)據(jù)參與APK運行的步驟也不同,例如,假設原數(shù)據(jù)為原APK的動態(tài)庫.so文件,則dex類加載器DexClassLoader類在加載dex的過程中,需要調(diào)用該原數(shù)據(jù)才能夠完成dex的加載。
在本發(fā)明的一個實施例中,若所述原數(shù)據(jù)為原APK中的classes.dex文件中的數(shù)據(jù),所述根據(jù)加密數(shù)據(jù)在目標APK的中的存儲位置,提取所述加密數(shù)據(jù),還包括:獲取加密數(shù)據(jù)所對應的原數(shù)據(jù)的原位置信息;此時,根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載,包括:
根據(jù)所述原數(shù)據(jù)的原始位置信息,將所述原數(shù)據(jù)放回到第三classes.dex文件中的對應位置,得到目標APK的完整classes.dex文件;
通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載。
由于原數(shù)據(jù)為原APK的dex文件中的數(shù)據(jù),因此,為了保證目標APK的正常加載運行,需要首先還原出完成的dex文件,再由dex類加載器DexClassLoader類完成dex文件的加載。
在發(fā)明的一個實施例中,若所述原數(shù)據(jù)為原APK中的classes.dex文件中的數(shù)據(jù),所述通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載時,當所述完整classes.dex文件中原數(shù)據(jù)被加載到內(nèi)存空間中后,刪除所述完整classes.dex文件中的所述原數(shù)據(jù)。
本實施例中,由于原數(shù)據(jù)為dex文件中的數(shù)據(jù),因此會被加載到內(nèi)存空間中,當原數(shù)據(jù)已經(jīng)被加載存儲到內(nèi)存空間后,通過將該原數(shù)據(jù)從完整classes.dex文件中刪除,進一步避免了dexdump等工具能夠從內(nèi)存中竊取到原數(shù)據(jù)的風險。
對應于圖7中所示的動態(tài)加載方法,在本發(fā)明的一個實施例中還提供了一種加固APK的動態(tài)加載裝置,如圖8所示,該動態(tài)加載裝置包括目標APK解壓模塊810、原數(shù)據(jù)提取模塊820和APK動態(tài)加載模塊830。其中:
目標APK解壓模塊810,用于解壓所述目標APK;
原數(shù)據(jù)提取模塊820,用于根據(jù)加密數(shù)據(jù)在目標APK中的存儲位置,提取所述加密數(shù)據(jù),并對加密數(shù)據(jù)進行解密得到原數(shù)據(jù);
APK動態(tài)加載模塊830,用于根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載。
在本發(fā)明的一個實施例中,若所述原數(shù)據(jù)為原APK中的classes.dex文件中的數(shù)據(jù),所述原數(shù)據(jù)提取模塊820還用于獲取加密數(shù)據(jù)所對應的原數(shù)據(jù)的原位置信息;此時,所述APK動態(tài)加載模塊830包括完整dex獲取單元831和dex動態(tài)加載單元832,如圖9所示。其中:
完整dex獲取單元831,用于根據(jù)所述原數(shù)據(jù)的原始位置信息,將所述原數(shù)據(jù)放回到第三classes.dex文件中的對應位置,得到目標APK的完整classes.dex文件;
dex動態(tài)加載單元832,用于通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載。
在本發(fā)明的一個實施例中,所述dex動態(tài)加載單元832還可以包括原數(shù)據(jù)刪除子單元8321,如圖10所示。其中:
所述原數(shù)據(jù)刪除子單元8321,用于在所述完整classes.dex文件中的原數(shù)據(jù)被加載到內(nèi)存空間中后,刪除所述完整classes.dex文件中的所述原數(shù)據(jù)。
本發(fā)明實施例中所提供的APK文件的加固方法和裝置、以及動態(tài)加載方法和裝置,適用于眾多通用或?qū)S玫挠嬎銠C系統(tǒng)環(huán)境和配置中,包括但不限于個人計算機、服務器、手持設備或便攜式設備、平板型設備、基于安卓系統(tǒng)的電子設備等等。
需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個實體或者操作與另一個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存在任何這種實際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設備中還存在另外的相同要素。
本說明書中的各個實施例均采用相關(guān)的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于裝置實施例而言,由于其基本相似于方法實施例,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。
本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述裝置實施方式中各部分的全部或部分可以以硬件實現(xiàn),或者以在一個或多個硬件上運行的軟件模塊來實現(xiàn),方法實施方式中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成。本領(lǐng)域技術(shù)人員應該明白,本發(fā)明所述的方法和裝置并不限于具體實施方式中所述的實施例,上面的具體描述只是為了解釋本發(fā)明的目的,并非用于限制本發(fā)明。本領(lǐng)域技術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出其他的實施方式,同樣屬于本發(fā)明的技術(shù)創(chuàng)新范圍,本發(fā)明的保護范圍由權(quán)利要求及其等同物限定。
本發(fā)明的實施例公開了:A1、一種APK文件的加固方法,該方法包括:
獲取待加固的原APK中需要保護的原數(shù)據(jù);
將所述原數(shù)據(jù)進行加密處理,得到加密數(shù)據(jù);
對所述原APK進行加固處理,生成目標APK,其中,所述加密數(shù)據(jù)以文件形式存儲于所述目標APK的預設位置。
A2、根據(jù)A1所述的加固方法,所述預設位置為目標APK的classes.dex文件中的位置。
A3、根據(jù)A2所述的加固方法,所述預設位置為目標APK的classes.dex文件的文件頭和/或數(shù)據(jù)區(qū)的N個指定位置,N≥1。
A4、根據(jù)A3所述的加固方法,所述N=1,所述指定位置為所述數(shù)據(jù)區(qū)的頭部或尾部。
A5、根據(jù)A3所述的加固方法,所述N=2;所述加密數(shù)據(jù)包括第一加密數(shù)據(jù)和第二加密數(shù)據(jù);
所述指定位置包括第一指定位置和第二指定位置,第一加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第一指定位置,第二加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第二指定位置。
A6、根據(jù)A5所述的加固方法,所述第一指定位置為所述數(shù)據(jù)區(qū)的頭部,所述第二指定位置為所述數(shù)據(jù)區(qū)的尾部
A7、根據(jù)A1所述的加固方法,所述原數(shù)據(jù)為原APK中的非classes.dex文件中的數(shù)據(jù);
所述對所述原APK進行加固處理,生成目標APK,包括:
根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)添加到原APK中的對應位置;
將添加后的原APK中除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
A8、根據(jù)A7所述的加固方法,若所述預設位置為目標APK的classes.dex文件中的位置,所述將添加后的原APK中除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK,包括:
重新計算并更新添加加密數(shù)據(jù)后的原APK的classes.dex文件的文件頭信息,得到更新后的第一classes.dex文件;
將第一classes.dex文件和原APK的除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
A9、根據(jù)A1所述的加固方法,所述原數(shù)據(jù)為原APK的classes.dex文件中的數(shù)據(jù);
所述對所述原APK進行加固處理,生成目標APK,包括:
記錄原數(shù)據(jù)在原APK的classes.dex文件中的原位置信息;
根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)和所述原位置信息添加到原APK中的的對應位置;
刪除原APK的classes.dex文件中的所述原數(shù)據(jù),得到第二classes.dex文件;
重新計算并更新第二classes.dex文件的文件頭信息,得到第三classes.dex文件;
將第三classes.dex文件和原APK的除其classes.dex文件外的其它文件進行重新打包簽名,生成目標APK。
本發(fā)明的實施例中公開了:B10、一種APK文件的加固裝置,包括:
加密數(shù)據(jù)生成模塊,用于獲取待加固的原APK中需要保護的原數(shù)據(jù),將所述原數(shù)據(jù)進行加密處理,得到加密數(shù)據(jù);
目標APK生成模塊,用于對所述原APK進行加固處理,生成目標APK,其中,所述加密數(shù)據(jù)以文件形式存儲于所述目標APK的預設位置。
B11、根據(jù)B10所述的加固裝置,所述預設位置為目標APK的classes.dex文件中的位置。
B12、根據(jù)B11所述的加固裝置,所述預設位置為目標APK的classes.dex文件的文件頭和/或數(shù)據(jù)區(qū)的N個指定位置,N≥1。
B13、根據(jù)B12所述的加固裝置,所述N=1,所述指定位置為所述數(shù)據(jù)區(qū)的頭部或尾部。
B14、根據(jù)B12所述的加固裝置,所述N=2;所述加密數(shù)據(jù)包括第一加密數(shù)據(jù)和第二加密數(shù)據(jù);
所述指定位置包括第一指定位置和第二指定位置,第一加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第一指定位置,第二加密數(shù)據(jù)在目標APK的classes.dex文件中的位置為所述第二指定位置。
B15、根據(jù)B14所述的加固裝置,所述第一指定位置為所述數(shù)據(jù)區(qū)的頭部,所述第二指定位置為所述數(shù)據(jù)區(qū)的尾部。
B16、根據(jù)10所述的加固裝置,所述原數(shù)據(jù)為原APK中的非classes.dex文件中的數(shù)據(jù);
所述目標APK生成模塊包括:
第一加密數(shù)據(jù)插入單元,用于根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)添加到原APK中的對應位置;
第一目標APK生成單元,用于將添加后的原APK中除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
B17、根據(jù)B16所述的加固裝置,若所述預設位置為目標APK的classes.dex文件中的位置,所述第一目標APK生成單元包括:
目標dex生成子單元,用于重新計算并更新添加加密數(shù)據(jù)后的原APK的classes.dex文件的文件頭信息,得到更新后的第一classes.dex文件;
目標APK生成子單元,用于將第一classes.dex文件和原APK的除所述原數(shù)據(jù)之外的其它文件進行重新打包簽名,生成目標APK。
B18、根據(jù)B10所述的加固裝置,所述原數(shù)據(jù)為原APK的classes.dex文件中的數(shù)據(jù);
所述目標APK生成模塊包括:
原位置記錄單元,用于記錄原數(shù)據(jù)在原APK的classes.dex文件中的原位置信息;
第二加密數(shù)據(jù)插入單元,用于根據(jù)加密數(shù)據(jù)在目標APK中的所述預設位置,將加密數(shù)據(jù)和所述原位置信息添加到原APK中的的對應位置;
原數(shù)據(jù)刪除單元,用于刪除原APK的classes.dex文件中的所述原數(shù)據(jù),得到第二classes.dex文件;
目標dex生成單元,用于重新計算并更新第二classes.dex文件的文件頭信息,得到第三classes.dex文件;
第二目標APK生成單元,用于將第三classes.dex文件和原APK的除其classes.dex文件外的其它文件進行重新打包簽名,生成目標APK。
本發(fā)明的實施例中公開了:C19、一種加固APK的動態(tài)加載方法,所述加固APK為采用A1-A9中任一APK文件的加固方法生成的目標APK,所述動態(tài)加載方法包括:
解壓所述目標APK;
根據(jù)加密數(shù)據(jù)在目標APK的存儲位置,提取所述加密數(shù)據(jù),并對加密數(shù)據(jù)進行解密得到原數(shù)據(jù);
根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載。
C20、根據(jù)C19所述的動態(tài)加載方法,若所述原數(shù)據(jù)為原APK中的classes.dex文件中的數(shù)據(jù),所述根據(jù)加密數(shù)據(jù)在目標APK的存儲位置,提取所述加密數(shù)據(jù),還包括:獲取加密數(shù)據(jù)所對應的原數(shù)據(jù)的原位置信息;
所述根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載,包括:
根據(jù)所述原數(shù)據(jù)的原始位置信息,將所述原數(shù)據(jù)放回到第三classes.dex文件中的對應位置,得到目標APK的完整classes.dex文件;
通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載。
C21、根據(jù)C20所述的動態(tài)加載方法,所述通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載,包括:
所述完整classes.dex文件中的原數(shù)據(jù)被加載到內(nèi)存空間中后,刪除所述完整classes.dex文件中的所述原數(shù)據(jù)
本發(fā)明的實施例中公開了:D22、一種加固APK的動態(tài)加載裝置,包括:
目標APK解壓模塊,用于解壓所述目標APK;
原數(shù)據(jù)提取模塊,用于根據(jù)加密數(shù)據(jù)在目標APK中的存儲位置,提取所述加密數(shù)據(jù),并對加密數(shù)據(jù)進行解密得到原數(shù)據(jù);
APK動態(tài)加載模塊,用于根據(jù)所述原數(shù)據(jù)和解壓后的目標APK,通過dex類加載器對目標APK的classes.dex文件的進行動態(tài)加載。
D23、根據(jù)D22所述的動態(tài)加載裝置,若所述原數(shù)據(jù)為原APK中的classes.dex文件中的數(shù)據(jù),所述原數(shù)據(jù)提取模塊還用于獲取加密數(shù)據(jù)所對應的原數(shù)據(jù)的原位置信息;
所述APK動態(tài)加載模塊包括:
完整dex獲取單元,用于根據(jù)所述原數(shù)據(jù)的原始位置信息,將所述原數(shù)據(jù)放回到第三classes.dex文件中的對應位置,得到目標APK的完整classes.dex文件;
dex動態(tài)加載單元,用于通過dex類加載器對目標APK的完整classes.dex文件的進行動態(tài)加載。
D24、根據(jù)D23所述的動態(tài)加載裝置,所述dex動態(tài)加載單元包括:
原數(shù)據(jù)刪除子單元,用于在所述完整classes.dex文件中的原數(shù)據(jù)被加載到內(nèi)存空間中后,刪除所述完整classes.dex文件中的所述原數(shù)據(jù)。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其同等技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。