本發(fā)明涉及計算機安全領(lǐng)域,具體涉及一種加固安卓安裝包的動態(tài)鏈接庫SO文件的方法和裝置。
背景技術(shù):
現(xiàn)有技術(shù)中,安卓系統(tǒng)在加載SO文件到內(nèi)存中時,會通過mmap函數(shù)在調(diào)用該SO文件的應(yīng)用的進程空間中為其隨機分配一段內(nèi)存。但是對于許多經(jīng)過加固的SO文件,由于原SO文件并不是作為一個獨立SO文件而存在的,就需加固的SO文件調(diào)用mmap函數(shù)來為原SO文件來分配內(nèi)存。問題在于,當(dāng)原SO文件使用完畢后,需要釋放掉為原SO文件分配的內(nèi)存空間,而實際很難掌握到使用完原SO文件的時機,如果不釋放掉為原SO文件分配的內(nèi)存空間,就會產(chǎn)生內(nèi)存泄漏的問題。
技術(shù)實現(xiàn)要素:
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的加固安卓安裝包的動態(tài)鏈接庫SO文件的方法和裝置。
依據(jù)本發(fā)明的一個方面,提供了一種加固安卓安裝包的動態(tài)鏈接庫SO文件的方法,方法包括:
對安卓安裝包的原SO文件增加外殼,得到加固的SO文件;
在所述加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載所述原SO文件時,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。
可選地,所述對安卓安裝包的原SO文件增加外殼包括:
將所述原SO文件轉(zhuǎn)換為二進制形式,將得到的二進制形式的原SO文件添加到所述外殼中。
可選地,所述在所述加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間包括:
在所述加固的SO文件的初始化代碼的用于存儲未初始化的全局變量的指定代碼段中為所述原SO文件預(yù)留加載空間。
可選地,所述用于存儲未初始化的全局變量的指定代碼段為.bss節(jié)。
可選地,所述在所述加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間包括:
在所述用于存儲未初始化的全局變量的指定代碼段中設(shè)置與所述原SO文件對應(yīng)的指定數(shù)組;
根據(jù)所述原SO文件的大小,確定所述原SO文件在內(nèi)存中占用的空間的數(shù)值,將該數(shù)值存儲至所述指定數(shù)組中,以使安卓系統(tǒng)在加載所述加固的SO文件時,根據(jù)該指定數(shù)值中存儲的數(shù)值為所述預(yù)留加載空間分配內(nèi)存空間。
可選地,該方法還包括:
在所述加固的SO文件的初始化代碼中寫入所述原SO文件的內(nèi)存加載邏輯,以使安卓系統(tǒng)在加載所述加固的SO文件時,根據(jù)所述內(nèi)存加載邏輯,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。
可選地,該方法還包括:
在所述加固的SO文件的初始化代碼中,將所述加固的SO文件中的至少一個指定函數(shù)指向該函數(shù)在所述原SO文件中對應(yīng)的指定函數(shù),以使安卓系統(tǒng)在調(diào)用所述加固的SO文件中的指定函數(shù)時,跳轉(zhuǎn)調(diào)用原SO文件中對應(yīng)的指定函數(shù)。
可選地,所述加固的SO文件中的指定函數(shù)與所述原SO文件中對應(yīng)的指定函數(shù)為同類型的函數(shù)。
可選地,所述加固的SO文件中的指定函數(shù)與所述原SO文件中對應(yīng)的指定函數(shù)均為JNI_Onload函數(shù)。
可選地,該方法在所有步驟前進一步包括:
對安卓安裝包進行解包,得到安卓安裝包的至少一個原SO文件。
可選地,該方法還包括:
將所述加固的SO文件打包到對應(yīng)的安卓安裝包中,以使所述安卓安裝包被安裝后,每次啟動對應(yīng)的應(yīng)用時,由安卓系統(tǒng)加載所述加固后的SO文件。
依據(jù)本發(fā)明的另一方面,提供了一種加固安卓安裝包的動態(tài)鏈接庫SO文件的裝置,包括:
加殼單元,適于對安卓安裝包的原SO文件增加外殼,得到加固的SO文件;
編輯單元,適于在所述加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載所述原SO文件時,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。
可選地,所述加殼單元,適于將所述原SO文件轉(zhuǎn)換為二進制形式,將得到的二進制形式的原SO文件添加到所述外殼中。
可選地,所述編輯單元,適于在所述加固的SO文件的初始化代碼的用于存儲未初始化的全局變量的指定代碼段中為所述原SO文件預(yù)留加載空間。
可選地,所述用于存儲未初始化的全局變量的指定代碼段為.bss節(jié)。
可選地,所述編輯單元,適于在所述用于存儲未初始化的全局變量的指定代碼段中設(shè)置與所述原SO文件對應(yīng)的指定數(shù)組;根據(jù)所述原SO文件的大小,確定所述原SO文件在內(nèi)存中占用的空間的數(shù)值,將該數(shù)值存儲至所述指定數(shù)組中,以使安卓系統(tǒng)在加載所述加固的SO文件時,根據(jù)該指定數(shù)值中存儲的數(shù)值為所述預(yù)留加載空間分配內(nèi)存空間。
可選地,所述編輯單元,適于在所述加固的SO文件的初始化代碼中寫入所述原SO文件的內(nèi)存加載邏輯,以使安卓系統(tǒng)在加載所述加固的SO文件時,根據(jù)所述內(nèi)存加載邏輯,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。
可選地,所述編輯單元,適于在所述加固的SO文件的初始化代碼中,將所述加固的SO文件中的至少一個指定函數(shù)指向該函數(shù)在所述原SO文件中對應(yīng)的指定函數(shù),以使安卓系統(tǒng)在調(diào)用所述加固的SO文件中的指定函數(shù)時,跳轉(zhuǎn)調(diào)用原SO文件中對應(yīng)的指定函數(shù)。
可選地,所述加固的SO文件中的指定函數(shù)與所述原SO文件中對應(yīng)的指定函數(shù)為同類型的函數(shù)。
可選地,所述加固的SO文件中的指定函數(shù)與所述原SO文件中對應(yīng)的指定函數(shù)均為JNI_Onload函數(shù)。
可選地,該裝置還包括:
解包單元,適于對安卓安裝包進行解包,得到安卓安裝包的至少一個原SO文件。
可選地,該裝置還包括:
打包單元,適于將所述加固的SO文件打包到對應(yīng)的安卓安裝包中,以使所述安卓安裝包被安裝后,每次啟動對應(yīng)的應(yīng)用時,由安卓系統(tǒng)加載所述加固后的SO文件。
由上述可知,本發(fā)明的技術(shù)方案,在對安卓安裝包的原SO文件增加外殼,得到加固的SO文件后,在加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載所述原SO文件時,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。該技術(shù)方案不再單獨調(diào)用mmap函數(shù)來為原SO文件分配內(nèi)存空間,而是在加載加固的SO文件時,將分配給加固的SO文件的一部分內(nèi)存空間用于原SO文件的加載,這樣使得系統(tǒng)在釋放加固的SO文件占用的內(nèi)存空間時,可以一并釋放掉原SO文件占用的內(nèi)存空間,既不影響原SO文件的正常使用,也不會引起內(nèi)存泄漏。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。
附圖說明
通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
圖1示出了根據(jù)本發(fā)明一個實施例的一種加固安卓安裝包的動態(tài)鏈接庫SO文件的方法的流程示意圖;
圖2示出了根據(jù)本發(fā)明一個實施例的一種加固安卓安裝包的動態(tài)鏈接庫SO文件的裝置的結(jié)構(gòu)示意圖。
具體實施方式
下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。
圖1示出了根據(jù)本發(fā)明一個實施例的一種加固安卓安裝包的動態(tài)鏈接庫SO文件的方法的流程示意圖,如圖1所示,該方法包括:
步驟S110,對安卓安裝包的原SO文件增加外殼,得到加固的SO文件。
步驟S120,在加固的SO文件的初始化代碼中為原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載原SO文件時,將原SO文件加載到為預(yù)留加載空間分配的內(nèi)存空間中。
安卓系統(tǒng)為預(yù)留加載空間分配的內(nèi)存空間中實際上是加固后的SO文件所占用的內(nèi)存空間的一部分。顯然,當(dāng)加固后的SO文件使用完畢后,原SO文件一定也已使用完畢,這時候如果釋放掉加固后的SO文件所占用的內(nèi)存空間,不僅不會影響原SO文件的正常使用(因為原SO文件已經(jīng)使用完了),還可以一并釋放掉原SO文件所占用的內(nèi)存空間。
可見,圖1所示的方法,在對安卓安裝包的原SO文件增加外殼,得到加固的SO文件后,在加固的SO文件的初始化代碼中為原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載原SO文件時,將原SO文件加載到為預(yù)留加載空間分配的內(nèi)存空間中。該技術(shù)方案不再單獨調(diào)用mmap函數(shù)來為原SO文件分配內(nèi)存空間,而是在加載加固的SO文件時,將分配給加固的SO文件的一部分內(nèi)存空間用于原SO文件的加載,這樣使得系統(tǒng)在釋放加固的SO文件占用的內(nèi)存空間時,可以一并釋放掉原SO文件占用的內(nèi)存空間,既不影響原SO文件的正常使用,也不會引起內(nèi)存泄漏。
在本發(fā)明的一個實施例中,圖1所示的方法中,對安卓安裝包的原SO文件增加外殼包括:將原SO文件轉(zhuǎn)換為二進制形式,將得到的二進制形式的原SO文件添加到外殼中。
在對原SO文件進行加固的過程中,還會涉及對函數(shù)的加密、添加解密邏輯等其他內(nèi)容,由于不是本發(fā)明的重點,在此不做過多介紹。在本實施例中,將原SO文件轉(zhuǎn)換為二級制形式,將其添加到外殼中(例如寫入.data節(jié)),形成了加固的SO文件。加固的SO文件的文件名與原SO文件名可以是相同的,這樣在加載過程中,系統(tǒng)實際是把加固后的SO文件當(dāng)作原SO文件進行加載。
在本發(fā)明的一個實施例中,圖1所示的方法中,在加固的SO文件的初始化代碼中為原SO文件預(yù)留加載空間包括:在加固的SO文件的初始化代碼的用于存儲未初始化的全局變量的指定代碼段中為原SO文件預(yù)留加載空間。
如果對全局變量進行初始化,那么就不能夠保留已賦予全局變量的值,也就會無法確定原SO文件會占用多大的內(nèi)存空間。例如,.bss節(jié)是一種常見的用于存儲未初始化的全局變量的代碼段。因此在本發(fā)明的一個實施例中。上述方法中,用于存儲未初始化的全局變量的指定代碼段為.bss節(jié)。
在本發(fā)明的一個實施例中。上述方法中,在加固的SO文件的初始化代碼中為原SO文件預(yù)留加載空間包括:在用于存儲未初始化的全局變量的指定代碼段中設(shè)置與原SO文件對應(yīng)的指定數(shù)組;根據(jù)原SO文件的大小,確定原SO文件在內(nèi)存中占用的空間的數(shù)值,將該數(shù)值存儲至指定數(shù)組中,以使安卓系統(tǒng)在加載加固的SO文件時,根據(jù)該指定數(shù)值中存儲的數(shù)值為預(yù)留加載空間分配內(nèi)存空間。
例如,計算出原SO文件會占用10234kb的內(nèi)存空間,那么就在加固的SO文件的.bss節(jié)中設(shè)置一個存儲該值的數(shù)組。安卓系統(tǒng)在加載加固的SO文件時,會為.bss節(jié)分配內(nèi)存空間,這時就會為原SO文件分配出10234kb的內(nèi)存空間。當(dāng)加載原SO文件時,就可以將原SO文件加載到該內(nèi)存空間中。而在.bss節(jié)中增加這樣一個數(shù)組,幾乎不會影響加固后的SO文件的大小。
在本發(fā)明的一個實施例中,圖1所示的方法還包括:在加固的SO文件的初始化代碼中寫入原SO文件的內(nèi)存加載邏輯,以使安卓系統(tǒng)在加載加固的SO文件時,根據(jù)內(nèi)存加載邏輯,將原SO文件加載到為預(yù)留加載空間分配的內(nèi)存空間中。
由于未對SO文件進行加固時,SO文件可以被安卓系統(tǒng)加載,但是對SO文件進行加固后,安卓系統(tǒng)就無法直接對原來的SO文件進行操作了。本實施例利用了初始化代碼在SO文件在加載時可以自動運行的特點,使得安卓系統(tǒng)在加載加固的SO文件時可以直接運行原SO文件的內(nèi)存加載邏輯,從而實現(xiàn)了原SO文件的加載,不需要系統(tǒng)直接對原SO文件進行操作,簡單方便。
在本發(fā)明的一個實施例中,圖1所示的方法還包括:在加固的SO文件的初始化代碼中,將加固的SO文件中的至少一個指定函數(shù)指向該函數(shù)在原SO文件中對應(yīng)的指定函數(shù),以使安卓系統(tǒng)在調(diào)用加固的SO文件中的指定函數(shù)時,跳轉(zhuǎn)調(diào)用原SO文件中對應(yīng)的指定函數(shù)。
SO文件并非是通過JAVA代碼編寫的,需要安卓系統(tǒng)利用JAVA的跨平臺機制,即通過JNI(Java Native Interface,JAVA本地接口)來使用SO文件,即實現(xiàn)JAVA層與本地層(Native層)的通信。具體地,在未對SO文件進行加固的情況下,JAVA層可以直接調(diào)用SO文件中的JNI函數(shù)來實現(xiàn)對SO文件的使用,但是在對SO文件增加外殼的情況下,JAVA層定位到的是加固后的SO文件中JNI函數(shù)的函數(shù)地址,而并非原SO文件的函數(shù)地址,從而產(chǎn)生崩潰。
在本發(fā)明的一個實施例中,上述方法中,加固的SO文件中的指定函數(shù)與原SO文件中對應(yīng)的指定函數(shù)為同類型的函數(shù)。
在本發(fā)明的一個實施例中,上述方法中,加固的SO文件中的指定函數(shù)與原SO文件中對應(yīng)的指定函數(shù)均為JNI_Onload函數(shù)。
試看下例:原SO文件liba.so通過增加外殼,得到了加固的SO文件libshell.so。但由于libshell.so仍然為命名為liba.so,安卓系統(tǒng)通過System.loadLibrary(“l(fā)iba.so”)加載到的實際上是libshell.so。在加載libshell.so時,運行l(wèi)ibshell.so的初始化代碼,在這個過程中就完成了將liba.so的加載。安卓系統(tǒng)在調(diào)用其所認為的liba.so的JNI_Onload函數(shù)時,如果未對libshell.so中的JNI_Onload函數(shù)進行修改,那么系統(tǒng)實際上調(diào)用的是libshell.so中的JNI_Onload函數(shù)。而在本實施例中,libshell.so中的JNI_Onload函數(shù)被指向了liba.so中的JNI_Onload函數(shù),那么安卓系統(tǒng)在調(diào)用其所認為的liba.so的JNI_Onload函數(shù)時,也就恰好可以正確地調(diào)用到liba.so的JNI_Onload函數(shù),不會再出錯。對于安卓系統(tǒng)希望調(diào)用的liba.so中的其他函數(shù),也可以進行類似的處理。
在本發(fā)明的一個實施例中,上述方法在所有步驟前進一步包括:對安卓安裝包進行解包,得到安卓安裝包的至少一個原SO文件。
在本發(fā)明的一個實施例中,上述方法還包括:將加固的SO文件打包到對應(yīng)的安卓安裝包中,以使安卓安裝包被安裝后,每次啟動對應(yīng)的應(yīng)用時,由安卓系統(tǒng)加載加固后的SO文件。
在上述實施例中由于對原SO文件進行了加固處理,還需進一步將其與安卓安裝包的其他文件,例如安卓資源文件、安卓配置文件等一同打包為完整的安卓安裝包。其中,SO文件、安卓資源文件等可以是開發(fā)者分別提供的,例如在一個開發(fā)團隊內(nèi)部,由不同的項目組提供不同類別的文件,最后由安全組對SO文件進行加密和全部文件的打包;也可以由專門的安全服務(wù)提供方對開發(fā)者提供的未加固安卓安裝包進行解包處理,對其中的SO文件進行加固后重新進行打包。安卓系統(tǒng)加載加固后的SO文件可以是通過Linker(安卓系統(tǒng)的動態(tài)庫加載器)來加載的。
圖2示出了根據(jù)本發(fā)明一個實施例的一種加固安卓安裝包的動態(tài)鏈接庫SO文件的裝置的結(jié)構(gòu)示意圖,如圖2所示,加固安卓安裝包的動態(tài)鏈接庫SO文件的裝置200包括:
加殼單元210,適于對安卓安裝包的原SO文件增加外殼,得到加固的SO文件;
編輯單元220,適于在加固的SO文件的初始化代碼中為原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載原SO文件時,將原SO文件加載到為預(yù)留加載空間分配的內(nèi)存空間中。
安卓系統(tǒng)為預(yù)留加載空間分配的內(nèi)存空間中實際上是加固后的SO文件所占用的內(nèi)存空間的一部分。顯然,當(dāng)加固后的SO文件使用完畢后,原SO文件一定也已使用完畢,這時候如果釋放掉加固后的SO文件所占用的內(nèi)存空間,不僅不會影響原SO文件的正常使用(因為原SO文件已經(jīng)使用完了),還可以一并釋放掉原SO文件所占用的內(nèi)存空間。
可見,圖2所示的裝置,在對安卓安裝包的原SO文件增加外殼,得到加固的SO文件后,在加固的SO文件的初始化代碼中為原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載原SO文件時,將原SO文件加載到為預(yù)留加載空間分配的內(nèi)存空間中。該技術(shù)方案不再單獨調(diào)用mmap函數(shù)來為原SO文件分配內(nèi)存空間,而是在加載加固的SO文件時,將分配給加固的SO文件的一部分內(nèi)存空間用于原SO文件的加載,這樣使得系統(tǒng)在釋放加固的SO文件占用的內(nèi)存空間時,可以一并釋放掉原SO文件占用的內(nèi)存空間,既不影響原SO文件的正常使用,也不會引起內(nèi)存泄漏。
在本發(fā)明的一個實施例中,上述裝置中,加殼單元210,適于將原SO文件轉(zhuǎn)換為二進制形式,將得到的二進制形式的原SO文件添加到外殼中。
在對原SO文件進行加固的過程中,還會涉及對函數(shù)的加密、添加解密邏輯等其他內(nèi)容,由于不是本發(fā)明的重點,在此不做過多介紹。在本實施例中,將原SO文件轉(zhuǎn)換為二級制形式,將其添加到外殼中(例如寫入.data節(jié)),形成了加固的SO文件。加固的SO文件的文件名與原SO文件名可以是相同的,這樣在加載過程中,系統(tǒng)實際是把加固后的SO文件當(dāng)作原SO文件進行加載。
在本發(fā)明的一個實施例中,上述裝置中,編輯單元220,適于在加固的SO文件的初始化代碼的用于存儲未初始化的全局變量的指定代碼段中為原SO文件預(yù)留加載空間。如果對全局變量進行初始化,那么就不能夠保留已賦予全局變量的值,也就會無法確定原SO文件會占用多大的內(nèi)存空間。例如,.bss節(jié)是一種常見的用于存儲未初始化的全局變量的代碼段。因此在本發(fā)明的一個實施例中,上述裝置中,用于存儲未初始化的全局變量的指定代碼段為.bss節(jié)。
在本發(fā)明的一個實施例中,上述裝置中,編輯單元220,適于在用于存儲未初始化的全局變量的指定代碼段中設(shè)置與原SO文件對應(yīng)的指定數(shù)組;根據(jù)原SO文件的大小,確定原SO文件在內(nèi)存中占用的空間的數(shù)值,將該數(shù)值存儲至指定數(shù)組中,以使安卓系統(tǒng)在加載加固的SO文件時,根據(jù)該指定數(shù)值中存儲的數(shù)值為預(yù)留加載空間分配內(nèi)存空間。
例如,計算出原SO文件會占用10234kb的內(nèi)存空間,那么就在加固的SO文件的.bss節(jié)中設(shè)置一個存儲該值的數(shù)組。安卓系統(tǒng)在加載加固的SO文件時,會為.bss節(jié)分配內(nèi)存空間,這時就會為原SO文件分配出10234kb的內(nèi)存空間。當(dāng)加載原SO文件時,就可以將原SO文件加載到該內(nèi)存空間中。而在.bss節(jié)中增加這樣一個數(shù)組,幾乎不會影響加固后的SO文件的大小。在本發(fā)明的一個實施例中,上述裝置中,編輯單元220,適于在加固的SO文件的初始化代碼中寫入原SO文件的內(nèi)存加載邏輯,以使安卓系統(tǒng)在加載加固的SO文件時,根據(jù)內(nèi)存加載邏輯,將原SO文件加載到為預(yù)留加載空間分配的內(nèi)存空間中。
由于未對SO文件進行加固時,SO文件可以被安卓系統(tǒng)加載,但是對SO文件進行加固后,安卓系統(tǒng)就無法直接對原來的SO文件進行操作了。本實施例利用了初始化代碼在SO文件在加載時可以自動運行的特點,使得安卓系統(tǒng)在加載加固的SO文件時可以直接運行原SO文件的內(nèi)存加載邏輯,從而實現(xiàn)了原SO文件的加載,不需要系統(tǒng)直接對原SO文件進行操作,簡單方便。
在本發(fā)明的一個實施例中,上述裝置中,編輯單元220,適于在加固的SO文件的初始化代碼中,將加固的SO文件中的至少一個指定函數(shù)指向該函數(shù)在原SO文件中對應(yīng)的指定函數(shù),以使安卓系統(tǒng)在調(diào)用加固的SO文件中的指定函數(shù)時,跳轉(zhuǎn)調(diào)用原SO文件中對應(yīng)的指定函數(shù)。
SO文件并非是通過JAVA代碼編寫的,需要安卓系統(tǒng)利用JAVA的跨平臺機制,即通過JNI(Java Native Interface,JAVA本地接口)來使用SO文件,即實現(xiàn)JAVA層與本地層(Native層)的通信。具體地,在未對SO文件進行加固的情況下,JAVA層可以直接調(diào)用SO文件中的JNI函數(shù)來實現(xiàn)對SO文件的使用,但是在對SO文件增加外殼的情況下,JAVA層定位到的是加固后的SO文件中JNI函數(shù)的函數(shù)地址,而并非原SO文件的函數(shù)地址,從而產(chǎn)生崩潰。
在本發(fā)明的一個實施例中,上述裝置中,加固的SO文件中的指定函數(shù)與原SO文件中對應(yīng)的指定函數(shù)為同類型的函數(shù)。
在本發(fā)明的一個實施例中,上述裝置中,加固的SO文件中的指定函數(shù)與原SO文件中對應(yīng)的指定函數(shù)均為JNI_Onload函數(shù)。
試看下例:原SO文件liba.so通過增加外殼,得到了加固的SO文件libshell.so。但由于libshell.so仍然為命名為liba.so,安卓系統(tǒng)通過System.loadLibrary(“l(fā)iba.so”)加載到的實際上是libshell.so。在加載libshell.so時,運行l(wèi)ibshell.so的初始化代碼,在這個過程中就完成了將liba.so的加載。安卓系統(tǒng)在調(diào)用其所認為的liba.so的JNI_Onload函數(shù)時,如果未對libshell.so中的JNI_Onload函數(shù)進行修改,那么系統(tǒng)實際上調(diào)用的是libshell.so中的JNI_Onload函數(shù)。而在本實施例中,libshell.so中的JNI_Onload函數(shù)被指向了liba.so中的JNI_Onload函數(shù),那么安卓系統(tǒng)在調(diào)用其所認為的liba.so的JNI_Onload函數(shù)時,也就恰好可以正確地調(diào)用到liba.so的JNI_Onload函數(shù),不會再出錯。對于安卓系統(tǒng)希望調(diào)用的liba.so中的其他函數(shù),也可以進行類似的處理。
在本發(fā)明的一個實施例中,上述裝置還包括:解包單元(圖未示),適于對安卓安裝包進行解包,得到安卓安裝包的至少一個原SO文件。
在本發(fā)明的一個實施例中,上述裝置還包括:打包單元(圖未示),適于將加固的SO文件打包到對應(yīng)的安卓安裝包中,以使安卓安裝包被安裝后,每次啟動對應(yīng)的應(yīng)用時,由安卓系統(tǒng)加載加固后的SO文件。
在上述實施例中由于對原SO文件進行了加固處理,還需進一步將其與安卓安裝包的其他文件,例如安卓資源文件、安卓配置文件等一同打包為完整的安卓安裝包。其中,SO文件、安卓資源文件等可以是開發(fā)者分別提供的,例如在一個開發(fā)團隊內(nèi)部,由不同的項目組提供不同類別的文件,最后由安全組對SO文件進行加密和全部文件的打包;也可以由專門的安全服務(wù)提供方對開發(fā)者提供的未加固安卓安裝包進行解包處理,對其中的SO文件進行加固后重新進行打包。安卓系統(tǒng)加載加固后的SO文件可以是通過Linker(安卓系統(tǒng)的動態(tài)庫加載器)來加載的。
綜上所述,本發(fā)明的技術(shù)方案,在對安卓安裝包的原SO文件增加外殼,得到加固的SO文件后,在加固的SO文件的初始化代碼中為原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載原SO文件時,將原SO文件加載到為預(yù)留加載空間分配的內(nèi)存空間中。該技術(shù)方案不再單獨調(diào)用mmap函數(shù)來為原SO文件分配內(nèi)存空間,而是在加載加固的SO文件時,將分配給加固的SO文件的一部分內(nèi)存空間用于原SO文件的加載,這樣使得系統(tǒng)在釋放加固的SO文件占用的內(nèi)存空間時,可以一并釋放掉原SO文件占用的內(nèi)存空間,既不影響原SO文件的正常使用,也不會引起內(nèi)存泄漏。
需要說明的是:
在此提供的算法和顯示不與任何特定計算機、虛擬裝置或者其它設(shè)備固有相關(guān)。各種通用裝置也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類裝置所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。
在此處所提供的說明書中,說明了大量具體細節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細節(jié)的情況下實踐。在一些實例中,并未詳細示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護的本發(fā)明要求比在每個權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式的權(quán)利要求書由此明確地并入該具體實施方式,其中每個權(quán)利要求本身都作為本發(fā)明的單獨實施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對實施例中的設(shè)備中的模塊進行自適應(yīng)性地改變并且把它們設(shè)置在與該實施例不同的一個或多個設(shè)備中??梢园褜嵤├械哪K或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實施例。例如,在下面的權(quán)利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(DSP)來實現(xiàn)根據(jù)本發(fā)明實施例的加固安卓安裝包的動態(tài)鏈接庫SO文件的裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機程序和計算機程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實施例對本發(fā)明進行說明而不是對本發(fā)明進行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計算機來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。
本發(fā)明的實施例公開了A1、一種加固安卓安裝包的動態(tài)鏈接庫SO文件的方法,其中,該方法包括:
對安卓安裝包的原SO文件增加外殼,得到加固的SO文件;
在所述加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載所述原SO文件時,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。
A2、如A1所述的方法,其中,所述對安卓安裝包的原SO文件增加外殼包括:
將所述原SO文件轉(zhuǎn)換為二進制形式,將得到的二進制形式的原SO文件添加到所述外殼中。
A3、如A1所述的方法,其中,所述在所述加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間包括:
在所述加固的SO文件的初始化代碼的用于存儲未初始化的全局變量的指定代碼段中為所述原SO文件預(yù)留加載空間。
A4、如A3所述的方法,其中,所述用于存儲未初始化的全局變量的指定代碼段為.bss節(jié)。
A5、如A3所述的方法,其中,所述在所述加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間包括:
在所述用于存儲未初始化的全局變量的指定代碼段中設(shè)置與所述原SO文件對應(yīng)的指定數(shù)組;
根據(jù)所述原SO文件的大小,確定所述原SO文件在內(nèi)存中占用的空間的數(shù)值,將該數(shù)值存儲至所述指定數(shù)組中,以使安卓系統(tǒng)在加載所述加固的SO文件時,根據(jù)該指定數(shù)值中存儲的數(shù)值為所述預(yù)留加載空間分配內(nèi)存空間。
A6、如A1所述的方法,其中,該方法還包括:
在所述加固的SO文件的初始化代碼中寫入所述原SO文件的內(nèi)存加載邏輯,以使安卓系統(tǒng)在加載所述加固的SO文件時,根據(jù)所述內(nèi)存加載邏輯,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。
A7、如A1所述的方法,其中,該方法還包括:
在所述加固的SO文件的初始化代碼中,將所述加固的SO文件中的至少一個指定函數(shù)指向該函數(shù)在所述原SO文件中對應(yīng)的指定函數(shù),以使安卓系統(tǒng)在調(diào)用所述加固的SO文件中的指定函數(shù)時,跳轉(zhuǎn)調(diào)用原SO文件中對應(yīng)的指定函數(shù)。
A8、如A7所述的方法,其中,所述加固的SO文件中的指定函數(shù)與所述原SO文件中對應(yīng)的指定函數(shù)為同類型的函數(shù)。
A9、如A7所述的方法,其中,所述加固的SO文件中的指定函數(shù)與所述原SO文件中對應(yīng)的指定函數(shù)均為JNI_Onload函數(shù)。
A10、如A1-A9中任一項所述的方法,其中,該方法在所有步驟前進一步包括:
對安卓安裝包進行解包,得到安卓安裝包的至少一個原SO文件。
A11、如A10所述的方法,其中,該方法還包括:
將所述加固的SO文件打包到對應(yīng)的安卓安裝包中,以使所述安卓安裝包被安裝后,每次啟動對應(yīng)的應(yīng)用時,由安卓系統(tǒng)加載所述加固后的SO文件。
本發(fā)明的實施例公開了B12、一種加固安卓安裝包的動態(tài)鏈接庫SO文件的裝置,其中,該裝置包括:
加殼單元,適于對安卓安裝包的原SO文件增加外殼,得到加固的SO文件;
編輯單元,適于在所述加固的SO文件的初始化代碼中為所述原SO文件預(yù)留加載空間,以使安卓系統(tǒng)在加載所述原SO文件時,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。
B13、如B12所述的裝置,其中,
所述加殼單元,適于將所述原SO文件轉(zhuǎn)換為二進制形式,將得到的二進制形式的原SO文件添加到所述外殼中。
B14、如B12所述的裝置,其中,
所述編輯單元,適于在所述加固的SO文件的初始化代碼的用于存儲未初始化的全局變量的指定代碼段中為所述原SO文件預(yù)留加載空間。
B15、如B12所述的裝置,其中,所述用于存儲未初始化的全局變量的指定代碼段為.bss節(jié)。
B16、如B12所述的裝置,其中,
所述編輯單元,適于在所述用于存儲未初始化的全局變量的指定代碼段中設(shè)置與所述原SO文件對應(yīng)的指定數(shù)組;根據(jù)所述原SO文件的大小,確定所述原SO文件在內(nèi)存中占用的空間的數(shù)值,將該數(shù)值存儲至所述指定數(shù)組中,以使安卓系統(tǒng)在加載所述加固的SO文件時,根據(jù)該指定數(shù)值中存儲的數(shù)值為所述預(yù)留加載空間分配內(nèi)存空間。
B17、如B12所述的裝置,其中,
所述編輯單元,適于在所述加固的SO文件的初始化代碼中寫入所述原SO文件的內(nèi)存加載邏輯,以使安卓系統(tǒng)在加載所述加固的SO文件時,根據(jù)所述內(nèi)存加載邏輯,將所述原SO文件加載到為所述預(yù)留加載空間分配的內(nèi)存空間中。
B18、如B12所述的裝置,其中,
所述編輯單元,適于在所述加固的SO文件的初始化代碼中,將所述加固的SO文件中的至少一個指定函數(shù)指向該函數(shù)在所述原SO文件中對應(yīng)的指定函數(shù),以使安卓系統(tǒng)在調(diào)用所述加固的SO文件中的指定函數(shù)時,跳轉(zhuǎn)調(diào)用原SO文件中對應(yīng)的指定函數(shù)。
B19、如B18所述的裝置,其中,所述加固的SO文件中的指定函數(shù)與所述原SO文件中對應(yīng)的指定函數(shù)為同類型的函數(shù)。
B20、如權(quán)B18所述的裝置,其中,所述加固的SO文件中的指定函數(shù)與所述原SO文件中對應(yīng)的指定函數(shù)均為JNI_Onload函數(shù)。
B21、如B12-B20中任一項所述的裝置,其中,該裝置還包括:
解包單元,適于對安卓安裝包進行解包,得到安卓安裝包的至少一個原SO文件。
B22、如B21所述的裝置,其中,該裝置還包括:
打包單元,適于將所述加固的SO文件打包到對應(yīng)的安卓安裝包中,以使所述安卓安裝包被安裝后,每次啟動對應(yīng)的應(yīng)用時,由安卓系統(tǒng)加載所述加固后的SO文件。