本申請涉及安全技術(shù)領(lǐng)域,尤其涉及一種apk加固方法及裝置。
背景技術(shù):
隨著安卓操作系統(tǒng)(android)的快速發(fā)展,在安卓電子設(shè)備上的第三方應(yīng)用(application,app)也越來越多,比如安卓手機上的app數(shù)量逐年增加。但是由于安卓操作系統(tǒng)自身開源的特點,也產(chǎn)生了眾多的軟件逆向工具,通過這些軟件逆向工具能夠?qū)pp的安裝文件,即apk(androidpackage,安卓壓縮包)進行逆向分析,從而對app的開發(fā)者和使用者造成危害。因此,如何對apk進行加固從而防止逆向分析,是本申請實施例所需要解決的技術(shù)問題。
技術(shù)實現(xiàn)要素:
本申請實施例提供一種apk加固方法及裝置,能夠用于加固apk。
本申請實施例提供了一種apk加固方法,該方法包括:
將apk中的so文件加載至內(nèi)存,其中所述so文件中包括目標(biāo)函數(shù)的代碼;
對所述目標(biāo)函數(shù)的執(zhí)行狀態(tài)進行監(jiān)控;
當(dāng)監(jiān)控到所述目標(biāo)函數(shù)執(zhí)行結(jié)束時,將所述目標(biāo)函數(shù)的代碼從內(nèi)存中清除。
優(yōu)選地,在將apk中的so文件加載至內(nèi)存之前,所述方法還包括:
將所述so文件中的目標(biāo)函數(shù)的代碼通過對稱加密算法進行加密;
將apk中的so文件加載至內(nèi)存,具體包括:
將包含所述目標(biāo)函數(shù)加密后的代碼的so文件加載至內(nèi)存,以便能夠通過所述對稱加密算法的逆算法對內(nèi)存中所述加密后的代碼進行解密并獲取所述目標(biāo)函數(shù)加密前的代碼,用于執(zhí)行所述目標(biāo)函數(shù)。
優(yōu)選地,在將所述so文件中的目標(biāo)函數(shù)的代碼通過對稱加密算法進行加密之后,所述方法還包括:將解密密鑰保存在所述so文件datasection數(shù)據(jù)段中;
通過所述對稱加密算法的逆算法對內(nèi)存中所述加密后的代碼進行解密,具體包括:
通過從所述so文件datasection數(shù)據(jù)段中提取解密密鑰以及所述對稱加密算法的逆算法對加密后的代碼進行解密。
優(yōu)選地,所述對稱加密算法選自如下任意一種:
des加密算法;3des加密算法;rc2加密算法;rc4加密算法;rc5加密算法;blowfish加密算法。
優(yōu)選地,將所述目標(biāo)函數(shù)的代碼從內(nèi)存中清除,具體為:
將所述代碼所加載的內(nèi)存地址進行初始化;和/或,
清除所述代碼所加載的內(nèi)存地址的偏移地址信息。
本申請實施例還提供了一種apk加固裝置,該裝置包括:加載單元、監(jiān)控單元以及清除單元,其中:
所述加載單元,用于將apk中的so文件加載至內(nèi)存,其中所述so文件中包括目標(biāo)函數(shù)的代碼;
所述監(jiān)控單元,用于對所述目標(biāo)函數(shù)的執(zhí)行狀態(tài)進行監(jiān)控;
所述清除單元,用于當(dāng)監(jiān)控到所述目標(biāo)函數(shù)執(zhí)行結(jié)束時,將所述目標(biāo)函數(shù)的代碼從內(nèi)存中清除。
優(yōu)選地,在所述加載單元之前,所述裝置還包括加密單元,用于將所述so文件中的目標(biāo)函數(shù)的代碼通過對稱加密算法進行加密;
所述加載單元,用于將包含所述目標(biāo)函數(shù)加密后的代碼的so文件加載至內(nèi)存,以便能夠通過所述對稱加密算法的逆算法對內(nèi)存中所述加密后的代碼進行解密并獲取所述目標(biāo)函數(shù)加密前的代碼,用于執(zhí)行所述目標(biāo)函數(shù)。
優(yōu)選地,在所述加密單元和所述加載單元之間,所述裝置還包括保存單元,用于將解密密鑰保存在所述so文件datasection數(shù)據(jù)段中;
所述加載單元,用于將包含所述目標(biāo)函數(shù)加密后的代碼的so文件加載至內(nèi)存,以便能夠通過從所述so文件datasection數(shù)據(jù)段中提取解密密鑰以及所述對稱加密算法的逆算法對加密后的代碼進行解密并獲取所述目標(biāo)函數(shù)加密前的代碼,用于執(zhí)行所述目標(biāo)函數(shù)。
優(yōu)選地,所述對稱加密算法選自如下任意一種:
des加密算法;3des加密算法;rc2加密算法;rc4加密算法;rc5加密算法;blowfish加密算法。
優(yōu)選地,將所述目標(biāo)函數(shù)的代碼從內(nèi)存中清除,具體為:
將所述代碼所加載的內(nèi)存地址進行初始化;和/或,
清除所述代碼所加載的內(nèi)存地址的偏移地址信息。
本申請實施例采用的上述至少一個技術(shù)方案能夠達到以下有益效果:
采用本申請實施例所提供的apk加固方法,將apk中包括目標(biāo)函數(shù)的代碼的so文件加載至內(nèi)存,然后通過對目標(biāo)函數(shù)的執(zhí)行狀態(tài)進行監(jiān)控,當(dāng)監(jiān)控到目標(biāo)函數(shù)執(zhí)行結(jié)束時,將所述目標(biāo)函數(shù)的代碼從內(nèi)存中清除。由于能夠?qū)pk部分核心代碼中的函數(shù)作為目標(biāo)函數(shù),當(dāng)監(jiān)控到目標(biāo)函數(shù)執(zhí)行結(jié)束之后,可以通過將該目標(biāo)函數(shù)的代碼從內(nèi)存中清除來防止非法逆向分析者通過內(nèi)存dump來進行逆向分析,實現(xiàn)了apk的加固,解決了現(xiàn)有技術(shù)中的問題。
附圖說明
此處所說明的附圖用來提供對本申請的進一步理解,構(gòu)成本申請的一部分,本申請的示意性實施例及其說明用于解釋本申請,并不構(gòu)成對本申請的不當(dāng)限定。在附圖中:
圖1為本申請實施例提供的一種apk加固方法的具體實現(xiàn)流程示意圖;
圖2為本申請實施例提供的一種apk加固裝置的具體結(jié)構(gòu)示意圖。
具體實施方式
為使本申請的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本申請具體實施例及相應(yīng)的附圖對本申請技術(shù)方案進行清楚、完整地描述。顯然,所描述的實施例僅是本申請一部分實施例,而不是全部的實施例?;诒旧暾堉械膶嵤├绢I(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本申請保護的范圍。
以下結(jié)合附圖,詳細(xì)說明本申請各實施例提供的技術(shù)方案。
在apk中通常會包括so(shareobject,共享對象)文件,由于so文件采用二進制,沒有額外的解釋編譯過程,在運行時速度更快。因此在app開發(fā)過程中,通常會將apk中的部分核心代碼放到so文件中,從而加快apk的安裝速度。本申請通過apk中的so文件來對該apk進行加固。
本申請實施例提供了一種apk加固方法。該方法的具體流程示意圖如圖1所示,包括下述步驟:
步驟s11:將apk中的so文件加載至內(nèi)存。
這里的so文件位于所加固的apk中。apk中通常會包括classes.dex、so文件、androidmanifest.xml等,其中so文件采用c++/c語言編輯。在該so文件中包括目標(biāo)函數(shù)的代碼,這里的目標(biāo)函數(shù)通常是需要進行保護的函數(shù),比如正常運行該apk所需要的資源函數(shù),或者apk核心功能模塊的函數(shù)等;在實際應(yīng)用中目標(biāo)函數(shù)可以是一個或多個需要進行保護的函數(shù)。
在手機、平板電腦等電子設(shè)備上安裝第三方應(yīng)用時,用戶可以通過觸控對應(yīng)的apk,使得電子設(shè)備的安卓操作系統(tǒng)接收到安裝請求,運行安裝該apk從而實現(xiàn)第三方應(yīng)用的安裝。在運行安裝apk時,需要將apk中的classes.dex、so文件等至內(nèi)存中。
在實際應(yīng)用中,將包括目標(biāo)函數(shù)的代碼的so文件加載至內(nèi)存,在apk的安裝過程中,可以用于執(zhí)行該目標(biāo)函數(shù)。
步驟s12:對目標(biāo)函數(shù)的執(zhí)行狀態(tài)進行監(jiān)控。
通常目標(biāo)函數(shù)的執(zhí)行狀態(tài)可以包括未執(zhí)行、執(zhí)行中以及執(zhí)行結(jié)束等。
安卓操作系統(tǒng)能夠提供相應(yīng)的api(applicationprogramminginterface,應(yīng)用程序編程接口),可以編輯相應(yīng)的監(jiān)控程序,通過這些api對某個函數(shù)或者某些函數(shù)的執(zhí)行狀態(tài)進行監(jiān)控。因此,可以編輯針對目標(biāo)函數(shù)的監(jiān)控程序,通過安卓操作系統(tǒng)提供的api來實現(xiàn)對目標(biāo)函數(shù)執(zhí)行狀態(tài)的監(jiān)控。
另外,對目標(biāo)函數(shù)的執(zhí)行狀態(tài)進行監(jiān)控,可以是實時監(jiān)控目標(biāo)函數(shù)的執(zhí)行狀態(tài),也可以是每隔一個時間周期(比如1分鐘,也可以為其它)獲取目標(biāo)函數(shù)的執(zhí)行狀態(tài),也可以是其它的監(jiān)控方式。對于實時監(jiān)控的方式通常能夠及時獲知目標(biāo)函數(shù)的執(zhí)行狀態(tài),但所消耗的計算資源較大;對于周期性獲取目標(biāo)函數(shù)的執(zhí)行狀態(tài)的監(jiān)控方式,所消耗的計算資源相對較少,但實時性較差;因此在應(yīng)用過程中,可以根據(jù)電子設(shè)備cpu的運算能力、對實時性的需求等選擇具體的監(jiān)控方式,這里就不再一一贅述。
步驟s13:當(dāng)監(jiān)控到目標(biāo)函數(shù)執(zhí)行結(jié)束時,將目標(biāo)函數(shù)的代碼從內(nèi)存中清除,從而對apk進行加固。
在用戶觸控apk的文件進行apk安裝的過程中,安卓操作系統(tǒng)通常會先將apk中的classes.dex拷貝至系統(tǒng)文件夾/data/dalvik-cache的目錄之下,然后在系統(tǒng)文件夾/data/data/的目錄下創(chuàng)建app文件夾(可以以apk的名稱命名該文件夾),并在該文件夾中存放從apk中解壓出的相關(guān)數(shù)據(jù),如數(shù)據(jù)庫、xml文件、cache以及so文件等。在解壓過程中,會先將so文件加載到內(nèi)存,然后將內(nèi)存中的so文件進行拷貝至app文件夾。但是在實際應(yīng)用中,對于非法進行逆向分析者,也可以從內(nèi)存中拷貝該so文件(稱之為內(nèi)存dump)的代碼,從而進行逆向分析。
因此,通過本申請所提供的apk加固方法,可以將apk部分核心代碼中的函數(shù)分別作為目標(biāo)函數(shù),通過對目標(biāo)函數(shù)執(zhí)行狀態(tài)進行監(jiān)控,當(dāng)目標(biāo)函數(shù)執(zhí)行結(jié)束之后,將該目標(biāo)函數(shù)的代碼從內(nèi)存中清除,這樣可以有效防止非法逆向分析者從內(nèi)存中拷貝該目標(biāo)函數(shù)的代碼。特別是當(dāng)需要保護的函數(shù)數(shù)量較多時,可以分別將這些函數(shù)作為目標(biāo)函數(shù),并在這些函數(shù)先后執(zhí)行的過程中,依次從內(nèi)存中將函數(shù)的代碼進行清除,從而使得非法逆向分析者更加難以從內(nèi)存中獲取完整的so文件的代碼,從而難以對apk進行逆向分析,實現(xiàn)了對apk的加固。
在實際應(yīng)用中,將目標(biāo)函數(shù)的代碼從內(nèi)存中清除的方式有多種,可以將目標(biāo)函數(shù)的代碼所加載的內(nèi)存地址進行初始化,比如,將該代碼所加載的內(nèi)存地址的數(shù)據(jù)全部置零等;將目標(biāo)函數(shù)的代碼從內(nèi)存中清除的方式,還可以是清除目標(biāo)函數(shù)的代碼所加載的內(nèi)存地址的偏移地址信息,清除內(nèi)存地址的偏移地址信息之后,非法逆向分析者難以獲取到目標(biāo)函數(shù)的代碼的實際內(nèi)存地址,因此難以進行代碼的拷貝。
以上是對本申請實施例所提供的apk加固方法的說明,在實際應(yīng)用中,為難了進一步加固apk,在步驟s11將apk中的so文件加載至內(nèi)存之前,該方法還可以進一步的包括,將該so文件中的目標(biāo)函數(shù)的代碼通過對稱加密算法進行加密得到加密后的代碼;相應(yīng)的步驟s11可以是,將包含該目標(biāo)函數(shù)加密后的代碼的so文件加載至內(nèi)存,從而使得在需要執(zhí)行該目標(biāo)函數(shù)時,能夠通過該對稱加密算法的逆算法,對已加載在內(nèi)存中的目標(biāo)函數(shù)加密后的代碼進行解密,從而獲取目標(biāo)函數(shù)加密前的代碼,通過該加密前的代碼來執(zhí)行目標(biāo)函數(shù)。這種先對目標(biāo)函數(shù)的代碼進行加密,并在需要執(zhí)行該目標(biāo)函數(shù)時,才從內(nèi)存進行解密獲取加密前的代碼的方式,能夠進一步防止非法逆向分析者的逆向分析,從而進一步加固apk。
另外,上述的對稱加密算法可以是如下任意一種或多種對稱加密算法:des(dataencryptionstandard)加密算法、3des(tripledes)加密算法、rc2加密算法、rc4加密算法、rc5加密算法或blowfish加密算法,當(dāng)然,也可以是其它的對稱加密算法。
需要進一步說明的是,在將so文件中的目標(biāo)函數(shù)的代碼通過對稱加密算法進行加密得到加密后的代碼之后,為了便于對該目標(biāo)函數(shù)的執(zhí)行,可以將用于對加密后的代碼進行解密的解密密鑰保存在apk中,比如可以將該解密密鑰保存在so文件datasection數(shù)據(jù)段中,從而使得在通過對稱加密算法的逆算法對內(nèi)存中目標(biāo)函數(shù)加密后的代碼進行解密時,能夠從該so文件的datasection數(shù)據(jù)段中提取該解密密鑰,并通過提取得到的解密密鑰以及對稱加密算法的逆算法對加密后的代碼進行解密;當(dāng)然也可以將該解密密鑰保存在apk的dex文件等其他文件中。
相對于將解密密鑰保存在apk的dex文件等,將解密密鑰保存在so文件的datasection數(shù)據(jù)段,由于so文件采用c++/c語言編輯,在反編譯過程通常較難,更加不利于非法逆向分析者進行逆向分析,從而能夠進一步的對apk進行加固。
基于與本申請實施所提供的apk加固方法相同的發(fā)明構(gòu)思,本申請實施例提供了一種apk加固裝置,能夠用于解決現(xiàn)有技術(shù)中的問題。如圖2所示,該裝置20包括:加載單元201、監(jiān)控單元202以及清除單元203,其中:
所述加載單元201,用于將apk中的so文件加載至內(nèi)存,其中所述so文件中包括目標(biāo)函數(shù)的代碼;
所述監(jiān)控單元202,用于對所述目標(biāo)函數(shù)的執(zhí)行狀態(tài)進行監(jiān)控;
所述清除單元203,用于當(dāng)監(jiān)控到所述目標(biāo)函數(shù)執(zhí)行結(jié)束時,將所述目標(biāo)函數(shù)的代碼從內(nèi)存中清除。
由于該裝置20采用與本申請實施例所提供的apk加固方法相同的發(fā)明構(gòu)思,因此也能夠解決現(xiàn)有技術(shù)中的問題,這里就不再贅述。
在實際應(yīng)用中,在該裝置20的加載單元201之前,所述裝置20還可以包括加密單元204;該加密單元204可以用于將所述so文件中的目標(biāo)函數(shù)的代碼通過對稱加密算法進行加密;
相應(yīng)的,連接在加密單元204之后的加載單元201,能夠用于將包含所述目標(biāo)函數(shù)加密后的代碼的so文件加載至內(nèi)存,以便能夠通過所述對稱加密算法的逆算法對內(nèi)存中所述加密后的代碼進行解密并獲取所述目標(biāo)函數(shù)加密前的代碼,用于執(zhí)行所述目標(biāo)函數(shù)。
通過加密單元204先對目標(biāo)函數(shù)的代碼進行加密,然后再通過加載單元201將加密后的代碼加載至內(nèi)存,這樣即使非法進行逆向分析者進行內(nèi)存dump成功,也不能直接進行逆向分析,因此能夠進一步加固apk。
在所述加密單元204和所述加載單元201之間,所述裝置20還可以包括保存單元,用于將解密密鑰保存在所述so文件datasection數(shù)據(jù)段中;
所述加載單元,用于將包含所述目標(biāo)函數(shù)加密后的代碼的so文件加載至內(nèi)存,以便能夠通過從所述so文件datasection數(shù)據(jù)段中提取解密密鑰以及所述對稱加密算法的逆算法對加密后的代碼進行解密并獲取所述目標(biāo)函數(shù)加密前的代碼,用于執(zhí)行所述目標(biāo)函數(shù)。
其中上述的對稱加密算法選自如下任意一種或多種對稱加密算法:
des加密算法;3des加密算法;rc2加密算法;rc4加密算法;rc5加密算法;blowfish加密算法。
所述清除單元203,將所述目標(biāo)函數(shù)的代碼從內(nèi)存中清除,可以是將所述代碼所加載的內(nèi)存地址進行初始化,也可以是清除所述代碼所加載的內(nèi)存地址的偏移地址信息。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本申請的實施例可提供為方法、系統(tǒng)、或計算機程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學(xué)存儲器等)上實施的計算機程序產(chǎn)品的形式。
本申請是參照根據(jù)本申請實施例的方法、設(shè)備(系統(tǒng))、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導(dǎo)計算機或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計算機或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
在一個典型的配置中,計算設(shè)備包括一個或多個處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計算機可讀介質(zhì)中的非永久性存儲器,隨機存取存儲器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲器(rom)或閃存(flashram)。內(nèi)存是計算機可讀介質(zhì)的示例。
計算機可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實現(xiàn)信息存儲。信息可以是計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機存取存儲器(sram)、動態(tài)隨機存取存儲器(dram)、其他類型的隨機存取存儲器(ram)、只讀存儲器(rom)、電可擦除可編程只讀存儲器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設(shè)備訪問的信息。按照本文中的界定,計算機可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號和載波。
還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。
本領(lǐng)域技術(shù)人員應(yīng)明白,本申請的實施例可提供為方法、系統(tǒng)或計算機程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學(xué)存儲器等)上實施的計算機程序產(chǎn)品的形式。
以上僅為本申請的實施例而已,并不用于限制本申請。對于本領(lǐng)域技術(shù)人員來說,本申請可以有各種更改和變化。凡在本申請的精神和原理之內(nèi)所作的任何修改、等同替換、改進等,均應(yīng)包含在本申請的權(quán)利要求范圍之內(nèi)。