本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及資源文件的加載方法、裝置和加固資源文件的方法、裝置。
背景技術(shù):
資源文件的種類很多,例如圖片文件等不需要進(jìn)行編譯加工的文件,這些文件在應(yīng)用運(yùn)行過程中可以被加載來實(shí)現(xiàn)相應(yīng)的功能。以游戲應(yīng)用為例,其中某個(gè)按鈕的貼圖為帶有“Back”字樣的圖片,由于該游戲應(yīng)用未發(fā)布中文版本,在該游戲應(yīng)用未對(duì)資源文件進(jìn)行加固的情況下,未經(jīng)授權(quán)的技術(shù)人員可以通過對(duì)安裝包進(jìn)行解包,利用圖片處理技術(shù)修改圖片中的“Back”為“返回”,用修改后的文件替換原文件來實(shí)現(xiàn)對(duì)原游戲應(yīng)用的漢化處理。
為避免這樣的情況發(fā)生,許多應(yīng)用開發(fā)者都會(huì)對(duì)應(yīng)用的資源文件進(jìn)行加固處理,因此在應(yīng)用的安裝包中存在的資源文件是加密資源文件,而應(yīng)用實(shí)際需要的是未加密的資源文件,如何在保證資源文件安全的同時(shí),還使得應(yīng)用可以正確運(yùn)行是亟待解決的問題。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的資源文件的加載方法、裝置和加固資源文件的方法、裝置。
依據(jù)本發(fā)明的一個(gè)方面,提供了一種資源文件的加載方法,包括:
在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件;
若是,則獲取讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件;
將指定的解密邏輯插入該讀/寫資源文件的相關(guān)函數(shù)中,由所述解密邏輯對(duì)所述加密資源文件進(jìn)行解密,得到解密后的資源文件;
將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中。
可選地,所述在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件包括:
獲取加載資源文件的相關(guān)函數(shù)被調(diào)用的事件;
提取所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值,根據(jù)所述路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件。
可選地,其中,該方法還包括:
在所述安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),讀取加密資源文件的配置文件到內(nèi)存中;
所述根據(jù)所述路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件包括:
將所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值與所述資源文件的配置文件中的路徑cookie值進(jìn)行匹配,若存在匹配項(xiàng),則判斷所述待加載的資源文件為加密資源文件。
可選地,所述將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中包括:
反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API,將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中。
可選地,所述反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API包括:
反射調(diào)用AssetManager類中的addAssetPath方法,獲取所述解密后的資源文件的路徑cookie值。
可選地,所述將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中包括:
將所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值修改為所述解密后的資源文件的路徑cookie值。
可選地,所述加密資源文件是通過對(duì)安卓安裝包的res目錄下指定的資源文件進(jìn)行整體加密得到的加密資源文件壓縮包。
可選地,該方法還包括:
在所述安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),將安卓安裝包中的加密資源文件壓縮包拷貝至指定位置。
依據(jù)本發(fā)明的另一方面,提供了一種加固資源文件的方法,包括:
從安卓安裝包中提取指定的資源文件;
對(duì)所述指定的資源文件進(jìn)行加密,得到加密資源文件;
從所述安卓安裝包中刪除所述指定的資源文件,并將加密資源文件存放至所述安卓安裝包的指定目錄下;
生成與所述加密資源文件對(duì)應(yīng)的加載程序,插入到所述安卓安裝包中;所述加載程序用于執(zhí)行如上述任一項(xiàng)所述的方法。
可選地,所述從安卓安裝包中提取指定的資源文件,對(duì)所述指定的資源文件進(jìn)行加密,得到加密資源文件包括:
從所述安卓安裝包的res目錄中提取指定類型的資源文件,并對(duì)提取的所有資源文件進(jìn)行整體加密,得到加密資源文件壓縮包。
可選地,所述生成與所述加密資源文件對(duì)應(yīng)的加載程序,插入到所述安卓安裝包中包括:
在所述安卓安裝包中的安卓配置文件AndroidManifest.xml中聲明:當(dāng)所述安裝包被安裝后,每次啟動(dòng)對(duì)應(yīng)的應(yīng)用時(shí),首先運(yùn)行所述加載程序。
可選地,所述生成與所述加密資源文件對(duì)應(yīng)的加載程序,插入到所述安卓安裝包中插入到所述安裝包中包括:
對(duì)所述安卓安裝包增加外殼;
生成與所述加密資源文件對(duì)應(yīng)的加載程序,插入到所述外殼中。
依據(jù)本發(fā)明的又一方面,提供了一種資源文件的加載裝置,包括:
判斷單元,適于在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件;
解密單元,適于在待加載的資源文件為加密資源文件時(shí),獲取讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件,將指定的解密邏輯插入該讀/寫資源文件的相關(guān)函數(shù)中,由所述解密邏輯對(duì)所述加密資源文件進(jìn)行解密,得到解密后的資源文件;
加載單元,適于將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中。
可選地,所述判斷單元,適于獲取加載資源文件的相關(guān)函數(shù)被調(diào)用的事件;提取所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值,根據(jù)所述路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件。
可選地,該裝置還包括:
配置文件讀取單元,適于在所述安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),讀取加密資源文件的配置文件到內(nèi)存中;
所述判斷單元,適于將所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值與所述資源文件的配置文件中的路徑cookie值進(jìn)行匹配,若存在匹配項(xiàng),則判斷所述待加載的資源文件為加密資源文件。
可選地,所述加載單元,適于反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API,將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中。
可選地,所述加載單元,適于反射調(diào)用AssetManager類中的addAssetPath裝置,獲取所述解密后的資源文件的路徑cookie值。
可選地,所述加載單元,適于將所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值修改為所述解密后的資源文件的路徑cookie值。
可選地,所述加密資源文件是通過對(duì)安卓安裝包的res目錄下指定的資源文件進(jìn)行整體加密得到的加密資源文件壓縮包。
可選地,該裝置還包括:
拷貝單元,適于在所述安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),將安卓安裝包中的加密資源文件壓縮包拷貝至指定位置。
依據(jù)本發(fā)明的再一方面,提供了一種加固資源文件的裝置,包括:
提取單元,適于從安卓安裝包中提取指定的資源文件;
加密單元,適于對(duì)所述指定的資源文件進(jìn)行加密,得到加密資源文件;
安裝包修改單元,適于從所述安卓安裝包中刪除所述指定的資源文件,并將加密資源文件存放至所述安卓安裝包的指定目錄下;將如上述任一項(xiàng)所述的資源文件的加載裝置插入到安卓安裝包中。
可選地,所述提取單元,適于從所述安卓安裝包的res目錄中提取指定類型的資源文件,并對(duì)提取的所有資源文件進(jìn)行整體加密,得到加密資源文件壓縮包。
可選地,所述安裝包修改單元,適于在所述安卓安裝包中的安卓配置文件AndroidManifest.xml中聲明:當(dāng)所述安裝包被安裝后,每次啟動(dòng)對(duì)應(yīng)的應(yīng)用時(shí),首先運(yùn)行所述資源文件的加載裝置。
可選地,所述安裝包修改單元,適于對(duì)所述安卓安裝包增加外殼;
將如上述任一項(xiàng)所述的資源文件的加載裝置插入到所述外殼中。
由上述可知,本發(fā)明的技術(shù)方案,在安卓應(yīng)用加載資源文件時(shí),如果判斷待加載的資源文件是加密資源文件,那么通過監(jiān)控讀/寫資源文件的相關(guān)函數(shù),獲取到讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件,將預(yù)設(shè)的解密邏輯插入到函數(shù)中,對(duì)加密資源文件進(jìn)行解密,將得到的解密的資源文件加載到安卓應(yīng)用的進(jìn)程中。該技術(shù)方案實(shí)現(xiàn)了資源文件的動(dòng)態(tài)解密,一方面使得破解者無法通過對(duì)安卓安裝包進(jìn)行解包得到可直接利用的資源文件,另一方面在應(yīng)用需要加載資源文件時(shí)再執(zhí)行解密,效率高,對(duì)系統(tǒng)資源的浪費(fèi)小。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
附圖說明
通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種資源文件的加載方法的流程示意圖;
圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種加固資源文件的方法的流程示意圖;
圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種資源文件的加載裝置的結(jié)構(gòu)示意圖;
圖4示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種加固資源文件的裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種資源文件的加載方法的流程示意圖,如圖1所示,該方法包括:
步驟S110,在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件。
步驟S120,若是,則獲取讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件。
例如,read(讀取)、mmap(將對(duì)象映射到內(nèi)存)、munmap(解除內(nèi)存映射)等函數(shù)。可以對(duì)這些函數(shù)進(jìn)行hook,來實(shí)現(xiàn)獲取這些函數(shù)被調(diào)用的事件,以及執(zhí)行步驟S130。
步驟S130,將指定的解密邏輯插入該讀/寫資源文件的相關(guān)函數(shù)中,由解密邏輯對(duì)加密資源文件進(jìn)行解密,得到解密后的資源文件。
解密邏輯可以保存在安卓安裝包的外殼程序中。一般而言,對(duì)安卓安裝包進(jìn)行加固,不僅僅會(huì)對(duì)資源文件進(jìn)行加固,還會(huì)對(duì)SO文件、DLL文件等進(jìn)行加固,常見的辦法是對(duì)整個(gè)安卓安裝包或其中的一些文件進(jìn)行加殼。解密邏輯包含對(duì)資源文件進(jìn)行解密的算法/代碼,這樣讀/寫資源文件的相關(guān)函數(shù)的結(jié)果就是得到了解密后的資源文件。
步驟S140,將解密后的資源文件加載到應(yīng)用的進(jìn)程中。之后應(yīng)用就可以利用資源文件進(jìn)行畫面的呈現(xiàn)等。
可見,圖1所示的方法,在安卓應(yīng)用加載資源文件時(shí),如果判斷待加載的資源文件是加密資源文件,那么通過監(jiān)控讀/寫資源文件的相關(guān)函數(shù),獲取到讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件,將預(yù)設(shè)的解密邏輯插入到函數(shù)中,對(duì)加密資源文件進(jìn)行解密,將得到的解密的資源文件加載到安卓應(yīng)用的進(jìn)程中。該技術(shù)方案實(shí)現(xiàn)了資源文件的動(dòng)態(tài)解密,一方面使得破解者無法通過對(duì)安卓安裝包進(jìn)行解包得到可直接利用的資源文件,另一方面在應(yīng)用需要加載資源文件時(shí)再執(zhí)行解密,效率高,對(duì)系統(tǒng)資源的浪費(fèi)小。
在本發(fā)明的一個(gè)實(shí)施例中,圖1所示的方法中,在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件包括:獲取加載資源文件的相關(guān)函數(shù)被調(diào)用的事件;提取加載資源文件的相關(guān)函數(shù)中的路徑cookie值,根據(jù)路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件。
安卓安裝包中的資源文件通常保存在asset目錄和res目錄下,對(duì)這兩個(gè)目錄下的資源文件進(jìn)行加載的方法略有不同。以res目錄下的資源文件為例,對(duì)這些資源文件進(jìn)行加載的一個(gè)重要步驟是解析resource id,通過解析resource id,可以獲取到需要加載的資源文件的路徑,進(jìn)而實(shí)現(xiàn)對(duì)res目錄下的資源文件的加載。安卓系統(tǒng)提供了許多對(duì)res目錄下的資源文件進(jìn)行訪問的API(Application Programming Interface,應(yīng)用程序編程接口),這些API中的參數(shù)中都帶有一個(gè)resource id,解析這個(gè)resource id可以得到最終需要加載的文件的路徑標(biāo)識(shí),也就是cookie,通過這個(gè)cookie,可以確定待加載的res目錄下的資源文件的路徑。以其中一個(gè)API為例:
InputStream openRawResource(int id);
該方法里面的參數(shù)id即是上面提到的resource id,安卓系統(tǒng)執(zhí)行該方法并解析了該resource id之后將調(diào)用下面的API:
Asset*AssetManager::openNonAsset(const int32_t cookie,const char*fileName,AccessMode mode)
其中,第一個(gè)參數(shù)cookie則是安卓系統(tǒng)通過上面openRawResource方法中的參數(shù)id解析出來的,openNonAsset函數(shù)的第一個(gè)參數(shù)cookie標(biāo)識(shí)了當(dāng)前要訪問的文件的位置,第二個(gè)參數(shù)fileName標(biāo)識(shí)了當(dāng)前要訪問的文件的名稱。
那么對(duì)openNonAsset函數(shù)進(jìn)行hook,就可以獲知該函數(shù)被調(diào)用的事件,這個(gè)函數(shù)顯然是一個(gè)加載資源文件的相關(guān)函數(shù)。那么根據(jù)該函數(shù)中的路徑cookie值,就可以判斷待加載的資源文件是否為加密資源文件。
在本發(fā)明的一個(gè)實(shí)施例中,上述方法還包括:在安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),讀取加密資源文件的配置文件到內(nèi)存中;根據(jù)路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件包括:將加載資源文件的相關(guān)函數(shù)中的路徑cookie值與資源文件的配置文件中的路徑cookie值進(jìn)行匹配,若存在匹配項(xiàng),則判斷待加載的資源文件為加密資源文件。
在本實(shí)施例中,安卓安裝包中包含一個(gè)加密資源文件的配置文件,該文件中存儲(chǔ)了加密資源文件的路徑cookie值。那么對(duì)于openNonAsset函數(shù)中的路徑cookie值,如果該值在加密資源文件的配置文件中存在匹配項(xiàng),就說明本次調(diào)用openNonAsset函數(shù)是要訪問一個(gè)加密資源文件。
在本發(fā)明的一個(gè)實(shí)施例中,上述方法中,將解密后的資源文件加載到應(yīng)用的進(jìn)程中包括:反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API,將解密后的資源文件加載到應(yīng)用的進(jìn)程中。具體地,反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API包括:反射調(diào)用AssetManager類中的addAssetPath方法,獲取解密后的資源文件的路徑cookie值。
解密后的資源文件是需要被加載到應(yīng)用的進(jìn)程起來的,這樣應(yīng)用才能利用到這些解密后的資源文件。而需要注意到的是,這些解密后的資源文件并不是直接由加密資源文件直接加載得到的,而是經(jīng)過了解密處理,也因此需要手動(dòng)(意為不能執(zhí)行系統(tǒng)自動(dòng)加載資源的流程)進(jìn)行加載。在本實(shí)施例中,利用JAVA的反射調(diào)用機(jī)制,反射調(diào)用AssetManager類中的addAssetPath方法,實(shí)現(xiàn)了獲取解密后的資源文件的路徑cookie值。
在得到了解密后的資源文件的路徑cookie值之后,就可以將openNonAsset函數(shù)中的路徑cookie值修改為解密后的資源文件的路徑cookie值。因此在本發(fā)明的一個(gè)實(shí)施例中,上述方法中,將解密后的資源文件加載到應(yīng)用的進(jìn)程中包括:將加載資源文件的相關(guān)函數(shù)中的路徑cookie值修改為解密后的資源文件的路徑cookie值。
在本發(fā)明的一個(gè)實(shí)施例中,上述方法中,加密資源文件是通過對(duì)安卓安裝包的res目錄下指定的資源文件進(jìn)行整體加密得到的加密資源文件壓縮包。具體地,上述方法還包括:在安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),將安卓安裝包中的加密資源文件壓縮包拷貝至指定位置。
這樣,對(duì)于解密而言,所有的加密資源文件都被拷貝至指定位置,進(jìn)行統(tǒng)一的處理,也進(jìn)一步提升了資源文件的加載效率。
圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種加固資源文件的方法的流程示意圖,其中,該方法包括:
步驟S210,從安卓安裝包中提取指定的資源文件。
步驟S220,對(duì)指定的資源文件進(jìn)行加密,得到加密資源文件。
步驟S230,從安卓安裝包中刪除指定的資源文件,并將加密資源文件存放至安卓安裝包的指定目錄下。
步驟S240,生成與加密資源文件對(duì)應(yīng)的加載程序,插入到安卓安裝包中;加載程序用于執(zhí)行如上述任一實(shí)施例中的方法。
在本實(shí)施例中,安卓安裝包的開發(fā)與資源文件的加固可以是分離的。例如,可以由某幾個(gè)小組進(jìn)行應(yīng)用功能的開發(fā),而由安全組對(duì)開發(fā)完成的安卓安裝包中的資源文件進(jìn)行加固;又例如,可以為開發(fā)者提供安裝包的加固服務(wù),對(duì)多個(gè)開發(fā)者提供的安裝包進(jìn)行加固處理。
在本發(fā)明的一個(gè)實(shí)施例中,上述方法中,從安卓安裝包中提取指定的資源文件,對(duì)指定的資源文件進(jìn)行加密,得到加密資源文件包括:從安卓安裝包的res目錄中提取指定類型的資源文件,并對(duì)提取的所有資源文件進(jìn)行整體加密,得到加密資源文件壓縮包。
并不是所有資源文件都適合進(jìn)行上述方法中的加固處理,例如,應(yīng)用的圖標(biāo)需要在桌面上進(jìn)行展示,而圖標(biāo)本身也是一種資源文件。如果對(duì)其進(jìn)行加固,那么應(yīng)用的圖標(biāo)就只能在應(yīng)用啟動(dòng)后才能正常展示,這顯然是不符合應(yīng)用用戶的需求的。因此,在本實(shí)施例中,可以對(duì)應(yīng)用啟動(dòng)后才需要的資源文件進(jìn)行加固。又例如游戲類應(yīng)用,其利用的資源文件數(shù)量巨大,也可以從中選取需要重點(diǎn)保護(hù)的資源文件進(jìn)行加固。整體加密可以使得解密時(shí)的效率更高,同時(shí)不會(huì)使得安全性嚴(yán)重下降。
在本發(fā)明的一個(gè)實(shí)施例中,上述方法中,生成與加密資源文件對(duì)應(yīng)的加載程序,插入到安卓安裝包中包括:在安卓安裝包中的安卓配置文件AndroidManifest.xml中聲明:當(dāng)安卓安裝包被安裝后,每次啟動(dòng)對(duì)應(yīng)的應(yīng)用時(shí),首先運(yùn)行加載程序。
在未對(duì)資源文件進(jìn)行加密時(shí),每當(dāng)啟動(dòng)對(duì)應(yīng)的應(yīng)用后,資源文件馬上就會(huì)被系統(tǒng)加載到內(nèi)存中,由于本發(fā)明中對(duì)資源文件進(jìn)行了加密處理,這些加密資源文件是無法被直接使用的,因此在本實(shí)施例中,在安卓配置文件AndroidManifest.xml中聲明當(dāng)安卓安裝包被安裝后,每次啟動(dòng)對(duì)應(yīng)的應(yīng)用時(shí),首先運(yùn)行加載程序,這樣確保了加載程序的預(yù)先運(yùn)行,使得應(yīng)用可以正確利用解密后的資源文件。
在本發(fā)明的一個(gè)實(shí)施例中,上述方法中,生成與加密資源文件對(duì)應(yīng)的加載程序,插入到所述安卓安裝包中包括:對(duì)安卓安裝包增加外殼;生成與加密資源文件對(duì)應(yīng)的加載程序,插入到外殼中。
由于外殼程序早于應(yīng)用本身的早于應(yīng)用本身的啟動(dòng),確保了可以在應(yīng)用調(diào)用資源文件之前對(duì)資源文件進(jìn)行加載和解密。
圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種資源文件的加載裝置的結(jié)構(gòu)示意圖,如圖3所示,資源文件的加載裝置300包括:
判斷單元310,適于在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件。
解密單元320,適于在待加載的資源文件為加密資源文件時(shí),獲取讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件,將指定的解密邏輯插入該讀/寫資源文件的相關(guān)函數(shù)中,由解密邏輯對(duì)加密資源文件進(jìn)行解密,得到解密后的資源文件。
加載單元330,適于將解密后的資源文件加載到應(yīng)用的進(jìn)程中。
可見,圖3所示的裝置,在安卓應(yīng)用加載資源文件時(shí),如果判斷待加載的資源文件是加密資源文件,那么通過監(jiān)控讀/寫資源文件的相關(guān)函數(shù),獲取到讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件,將預(yù)設(shè)的解密邏輯插入到函數(shù)中,對(duì)加密資源文件進(jìn)行解密,將得到的解密的資源文件加載到安卓應(yīng)用的進(jìn)程中。該技術(shù)方案實(shí)現(xiàn)了資源文件的動(dòng)態(tài)解密,一方面使得破解者無法通過對(duì)安卓安裝包進(jìn)行解包得到可直接利用的資源文件,另一方面在應(yīng)用需要加載資源文件時(shí)再執(zhí)行解密,效率高,對(duì)系統(tǒng)資源的浪費(fèi)小。
在本發(fā)明的一個(gè)實(shí)施例中,圖3所示的裝置中,判斷單元310,適于獲取加載資源文件的相關(guān)函數(shù)被調(diào)用的事件;提取加載資源文件的相關(guān)函數(shù)中的路徑cookie值,根據(jù)路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件。
在本發(fā)明的一個(gè)實(shí)施例中,圖3所示的裝置還包括:配置文件讀取單元340,適于在安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),讀取加密資源文件的配置文件到內(nèi)存中;判斷單元310,適于將加載資源文件的相關(guān)函數(shù)中的路徑cookie值與資源文件的配置文件中的路徑cookie值進(jìn)行匹配,若存在匹配項(xiàng),則判斷待加載的資源文件為加密資源文件。
在本發(fā)明的一個(gè)實(shí)施例中,上述裝置中,加載單元330,適于反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API,將解密后的資源文件加載到應(yīng)用的進(jìn)程中。
在本發(fā)明的一個(gè)實(shí)施例中,上述裝置中,加載單元330,適于反射調(diào)用AssetManager類中的addAssetPath裝置,獲取解密后的資源文件的路徑cookie值。
在本發(fā)明的一個(gè)實(shí)施例中,上述裝置中,加載單元330,適于將加載資源文件的相關(guān)函數(shù)中的路徑cookie值修改為解密后的資源文件的路徑cookie值。
在本發(fā)明的一個(gè)實(shí)施例中,上述裝置中,加密資源文件是通過對(duì)安卓安裝包的res目錄下指定的資源文件進(jìn)行整體加密得到的加密資源文件壓縮包。
在本發(fā)明的一個(gè)實(shí)施例中,上述裝置還包括:拷貝單元(圖未示),適于在安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),將安卓安裝包中的加密資源文件壓縮包拷貝至指定位置。
圖4示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種加固資源文件的裝置的結(jié)構(gòu)示意圖,如圖4所示,加固資源文件的裝置400包括:
提取單元410,適于從安卓安裝包中提取指定的資源文件。
加密單元420,適于對(duì)指定的資源文件進(jìn)行加密,得到加密資源文件。
安裝包修改單元430,適于從安卓安裝包中刪除指定的資源文件,并將加密資源文件存放至安卓安裝包的指定目錄下;將如上述任一實(shí)施例中的資源文件的加載裝置300插入到安卓安裝包中。
在本實(shí)施例中,安卓安裝包的開發(fā)與資源文件的加固可以是分離的。例如,可以由某幾個(gè)小組進(jìn)行應(yīng)用功能的開發(fā),而由安全組對(duì)開發(fā)完成的安卓安裝包中的資源文件進(jìn)行加固;又例如,可以為開發(fā)者提供安裝包的加固服務(wù),對(duì)多個(gè)開發(fā)者提供的安裝包進(jìn)行加固處理。
在本發(fā)明的一個(gè)實(shí)施例中,圖4所示的裝置中,提取單元410,適于從安卓安裝包的res目錄中提取指定類型的資源文件,并對(duì)提取的所有資源文件進(jìn)行整體加密,得到加密資源文件壓縮包。
在本發(fā)明的一個(gè)實(shí)施例中,圖4所示的裝置中,安裝包修改單元430,適于在安卓安裝包中的安卓配置文件AndroidManifest.xml中聲明:當(dāng)安卓安裝包被安裝后,每次啟動(dòng)對(duì)應(yīng)的應(yīng)用時(shí),首先運(yùn)行資源文件的加載裝置300。
在本發(fā)明的一個(gè)實(shí)施例中,圖4所示的裝置中,安裝包修改單元430,適于對(duì)安卓安裝包增加外殼;將如上述任一實(shí)施例中的資源文件的加載裝置300插入到外殼中。
需要說明的是,上述各裝置實(shí)施例的具體實(shí)施方式與前述對(duì)應(yīng)方法實(shí)施例的具體實(shí)施方式,在此不再贅述。
綜上所述,本發(fā)明的技術(shù)方案,在安卓應(yīng)用加載資源文件時(shí),如果判斷待加載的資源文件是加密資源文件,那么通過監(jiān)控讀/寫資源文件的相關(guān)函數(shù),獲取到讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件,將預(yù)設(shè)的解密邏輯插入到函數(shù)中,對(duì)加密資源文件進(jìn)行解密,將得到的解密的資源文件加載到安卓應(yīng)用的進(jìn)程中。該技術(shù)方案實(shí)現(xiàn)了資源文件的動(dòng)態(tài)解密,一方面使得破解者無法通過對(duì)安卓安裝包進(jìn)行解包得到可直接利用的資源文件,另一方面在應(yīng)用需要加載資源文件時(shí)再執(zhí)行解密,效率高,對(duì)系統(tǒng)資源的浪費(fèi)小。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均包含在本發(fā)明的保護(hù)范圍內(nèi)。
需要說明的是:
在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬裝置或者其它設(shè)備固有相關(guān)。各種通用裝置也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類裝置所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對(duì)任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的資源文件的加載裝置和加固資源文件的裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
本發(fā)明的實(shí)施例公開了A1、一種資源文件的加載方法,其中,該方法包括:
在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件;
若是,則獲取讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件;
將指定的解密邏輯插入該讀/寫資源文件的相關(guān)函數(shù)中,由所述解密邏輯對(duì)所述加密資源文件進(jìn)行解密,得到解密后的資源文件;
將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中。
A2、如A1所述的方法,其中,所述在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件包括:
獲取加載資源文件的相關(guān)函數(shù)被調(diào)用的事件;
提取所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值,根據(jù)所述路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件。
A3、如A2所述的方法,其中,該方法還包括:
在所述安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),讀取加密資源文件的配置文件到內(nèi)存中;
所述根據(jù)所述路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件包括:
將所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值與所述資源文件的配置文件中的路徑cookie值進(jìn)行匹配,若存在匹配項(xiàng),則判斷所述待加載的資源文件為加密資源文件。
A4、如A2所述的方法,其中,所述將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中包括:
反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API,將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中。
A5、如A4所述的方法,其中,所述反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API包括:
反射調(diào)用AssetManager類中的addAssetPath方法,獲取所述解密后的資源文件的路徑cookie值。
A6、如A5所述的方法,其中,所述將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中包括:
將所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值修改為所述解密后的資源文件的路徑cookie值。
A7、如A1-A6中任一項(xiàng)所述的方法,其中,所述加密資源文件是通過對(duì)安卓安裝包的res目錄下指定的資源文件進(jìn)行整體加密得到的加密資源文件壓縮包。
A8、如A7所述的方法,其中,該方法還包括:
在所述安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),將安卓安裝包中的加密資源文件壓縮包拷貝至指定位置。
本發(fā)明的實(shí)施例還公開了B9、一種加固資源文件的方法,其中,該方法包括:
從安卓安裝包中提取指定的資源文件;
對(duì)所述指定的資源文件進(jìn)行加密,得到加密資源文件;
從所述安卓安裝包中刪除所述指定的資源文件,并將加密資源文件存放至所述安卓安裝包的指定目錄下;
生成與所述加密資源文件對(duì)應(yīng)的加載程序,插入到所述安卓安裝包中;所述加載程序用于執(zhí)行如A1-A8中任一項(xiàng)所述的方法。
B10、如B9所述的方法,其中,所述從安卓安裝包中提取指定的資源文件,對(duì)所述指定的資源文件進(jìn)行加密,得到加密資源文件包括:
從所述安卓安裝包的res目錄中提取指定類型的資源文件,并對(duì)提取的所有資源文件進(jìn)行整體加密,得到加密資源文件壓縮包。
B11、如B9所述的方法,其中,所述生成與所述加密資源文件對(duì)應(yīng)的加載程序,插入到所述安卓安裝包中包括:
在所述安卓安裝包中的安卓配置文件AndroidManifest.xml中聲明:當(dāng)所述安裝包被安裝后,每次啟動(dòng)對(duì)應(yīng)的應(yīng)用時(shí),首先運(yùn)行所述加載程序。
B12、如B9所述的方法,其中,所述生成與所述加密資源文件對(duì)應(yīng)的加載程序,插入到所述安卓安裝包中包括:
對(duì)所述安卓安裝包增加外殼;
生成與所述加密資源文件對(duì)應(yīng)的加載程序,插入到所述外殼中。
本發(fā)明的實(shí)施例還公開了C13、一種資源文件的加載裝置,其中,該裝置包括:
判斷單元,適于在安卓安裝包對(duì)應(yīng)的應(yīng)用加載資源文件時(shí),判斷待加載的資源文件是否為加密資源文件;
解密單元,適于在待加載的資源文件為加密資源文件時(shí),獲取讀/寫資源文件的相關(guān)函數(shù)被調(diào)用的事件,將指定的解密邏輯插入該讀/寫資源文件的相關(guān)函數(shù)中,由所述解密邏輯對(duì)所述加密資源文件進(jìn)行解密,得到解密后的資源文件;
加載單元,適于將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中。
C14、如C13所述的裝置,其中,
所述判斷單元,適于獲取加載資源文件的相關(guān)函數(shù)被調(diào)用的事件;提取所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值,根據(jù)所述路徑cookie值判斷判斷待加載的資源文件是否為加密資源文件。
C15、如C14所述的裝置,其中,該裝置還包括:
配置文件讀取單元,適于在所述安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),讀取加密資源文件的配置文件到內(nèi)存中;
所述判斷單元,適于將所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值與所述資源文件的配置文件中的路徑cookie值進(jìn)行匹配,若存在匹配項(xiàng),則判斷所述待加載的資源文件為加密資源文件。
C16、如C14所述的裝置,其中,
所述加載單元,適于反射調(diào)用安卓系統(tǒng)的加載資源文件的應(yīng)用程序接口API,將解密后的資源文件加載到所述應(yīng)用的進(jìn)程中。
C17、如C16所述的裝置,其中,
所述加載單元,適于反射調(diào)用AssetManager類中的addAssetPath裝置,獲取所述解密后的資源文件的路徑cookie值。
C18、如C17所述的裝置,其中,
所述加載單元,適于將所述加載資源文件的相關(guān)函數(shù)中的路徑cookie值修改為所述解密后的資源文件的路徑cookie值。
C19、如C13-C18中任一項(xiàng)所述的裝置,其中,所述加密資源文件是通過對(duì)安卓安裝包的res目錄下指定的資源文件進(jìn)行整體加密得到的加密資源文件壓縮包。
C20、如C19所述的裝置,其中,該裝置還包括:
拷貝單元,適于在所述安卓安裝包對(duì)應(yīng)的應(yīng)用啟動(dòng)時(shí),將安卓安裝包中的加密資源文件壓縮包拷貝至指定位置。
本發(fā)明的實(shí)施例還公開了D21、一種加固資源文件的裝置,其中,該裝置包括:
提取單元,適于從安卓安裝包中提取指定的資源文件;
加密單元,適于對(duì)所述指定的資源文件進(jìn)行加密,得到加密資源文件;
安裝包修改單元,適于從所述安卓安裝包中刪除所述指定的資源文件,并將加密資源文件存放至所述安卓安裝包的指定目錄下;將如C13-C20中任一項(xiàng)所述的資源文件的加載裝置插入到安卓安裝包中。
D22、如D21所述的裝置,其中,
所述提取單元,適于從所述安卓安裝包的res目錄中提取指定類型的資源文件,并對(duì)提取的所有資源文件進(jìn)行整體加密,得到加密資源文件壓縮包。
D23、如D21所述的裝置,其中,
所述安裝包修改單元,適于在所述安卓安裝包中的安卓配置文件AndroidManifest.xml中聲明:當(dāng)所述安裝包被安裝后,每次啟動(dòng)對(duì)應(yīng)的應(yīng)用時(shí),首先運(yùn)行所述資源文件的加載裝置。
D24、如D21所述的裝置,其中,
所述安裝包修改單元,適于對(duì)所述安卓安裝包增加外殼;
將如C13-C20中任一項(xiàng)所述的資源文件的加載裝置插入到所述外殼中。