對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及應(yīng)用程序安全性技術(shù)領(lǐng)域,特別是涉及一種對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的方法及裝置。
【背景技術(shù)】
[0002]隨著安卓(Android)智能設(shè)備的高速發(fā)展,移動(dòng)終端的安全問題也逐漸暴露出來。
[0003]Android應(yīng)用程序(APP)被逆向破解,難度非常低,在dex(是Android平臺(tái)下由Dalvik字節(jié)碼組成的可執(zhí)行文件,Dalvik是Google公司自己設(shè)計(jì)用于Android平臺(tái)的Java虛擬機(jī))層面,甚至可以直接反編譯出java源碼進(jìn)行閱讀,為了提高Android應(yīng)用的安全性,Google提供了 ProGuard工具,在生成Android安裝包(apk)的時(shí)候,能夠按照用戶配置,對(duì)java代碼中的類名、函數(shù)名進(jìn)行混淆,變成一些無意義的字符串,破解者即使反編譯成java代碼,也無法根據(jù)這些名稱來分析類或者函數(shù)的作用,極大增強(qiáng)了軟件的安全性。
[0004]但是,大部分情況下,一個(gè)Android應(yīng)用由兩個(gè)部分組成:java層面的dex文件和native層面的so (是linux下的動(dòng)態(tài)鏈接庫(kù)文件)文件,這兩個(gè)部分是獨(dú)立的,so文件相當(dāng)于一個(gè)模塊,開發(fā)者可以在java層調(diào)用so文件的導(dǎo)出方法。然而,大部分應(yīng)用中,so文件中才是最核心的代碼,ProGuard工具對(duì)so文件的保護(hù)卻無能為力。
【發(fā)明內(nèi)容】
[0005]本發(fā)明主要解決的技術(shù)問題是提供一種對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的方法及裝置,能夠?qū)崿F(xiàn)對(duì)so文件的保護(hù),從而進(jìn)一步加強(qiáng)應(yīng)用程序的安全性。
[0006]為解決上述技術(shù)問題,本發(fā)明采用的一個(gè)技術(shù)方案是:提供一種對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的方法,所述方法包括:從so文件中逐一找到導(dǎo)出符號(hào)的字符串在所述so文件中的位置;獲取所述位置的原始符號(hào)名稱,并對(duì)所述位置的原始符號(hào)名稱進(jìn)行混淆處理;獲取與所述位置的原始符號(hào)名稱的長(zhǎng)度相同的混淆后的符號(hào)名稱;將所述混淆后的符號(hào)名稱作為新的導(dǎo)出符號(hào)寫入所述so文件中的對(duì)應(yīng)位置。
[0007]其中,所述從so文件中逐一找到導(dǎo)出符號(hào)的字符串在所述so文件中的位置的步驟,包括:通過系統(tǒng)命令找到所述導(dǎo)出符號(hào)在所述so文件中的位置信息;根據(jù)所述導(dǎo)出符號(hào)在所述so文件中的位置信息,從所述so文件中逐一找到所述導(dǎo)出符號(hào)的字符串在所述so文件中的位置。
[0008]其中,所述獲取所述位置的原始符號(hào)名稱,并對(duì)所述位置的原始符號(hào)名稱進(jìn)行混淆處理的步驟,包括:獲取所述位置的原始符號(hào)名稱,并判斷所述位置的原始符號(hào)名稱是否可以混淆處理;若所述位置的原始符號(hào)名稱是可以混淆處理的,則對(duì)所述位置的原始符號(hào)名稱進(jìn)行混淆處理。
[0009]其中,所述判斷所述位置的原始符號(hào)名稱是否可以混淆處理的步驟,包括:若所述原始符號(hào)名稱不是JNI_0nload、JNI_Unload或者以java_開頭的字符串,則判斷出所述位置的原始符號(hào)名稱是可以混淆處理的。
[0010]其中,所述對(duì)所述位置的原始符號(hào)名稱進(jìn)行混淆處理的步驟,包括:通過消息摘要算法第五版MD5對(duì)所述位置的原始符號(hào)名稱進(jìn)行混淆處理。
[0011]為解決上述技術(shù)問題,本發(fā)明采用的另一個(gè)技術(shù)方案是:提供一種對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的裝置,所述裝置包括:找到模塊,用于從so文件中逐一找到導(dǎo)出符號(hào)的字符串在所述so文件中的位置;混淆模塊,用于獲取所述位置的原始符號(hào)名稱,并對(duì)所述位置的原始符號(hào)名稱進(jìn)行混淆處理;獲取模塊,用于獲取與所述位置的原始符號(hào)名稱的長(zhǎng)度相同的混淆后的符號(hào)名稱;寫入模塊,用于將所述混淆后的符號(hào)名稱作為新的導(dǎo)出符號(hào)寫入所述so文件中的對(duì)應(yīng)位置。
[0012]其中,所述找到模塊包括:第一找到單元,用于通過系統(tǒng)命令找到所述導(dǎo)出符號(hào)在所述so文件中的位置信息;第二找到單元,用于根據(jù)所述導(dǎo)出符號(hào)在所述so文件中的位置信息,從所述so文件中逐一找到所述導(dǎo)出符號(hào)的字符串在所述so文件中的位置。
[0013]其中,所述混淆模塊包括:獲取單元,用于獲取所述位置的原始符號(hào)名稱,判斷單元,用于判斷所述位置的原始符號(hào)名稱是否可以混淆處理;混淆單元,用于在所述位置的原始符號(hào)名稱是可以混淆處理時(shí),對(duì)所述位置的原始符號(hào)名稱進(jìn)行混淆處理。
[OOM] 其中,所述判斷單元具體用于在所述原始符號(hào)名稱不是JNI_0nload、JNI_Unload或者以」&似_開頭的字符串時(shí),判斷出所述位置的原始符號(hào)名稱是可以混淆處理的。
[0015]其中,所述混淆模塊具體用于通過消息摘要算法第五版MD5對(duì)所述位置的原始符號(hào)名稱進(jìn)行混淆處理。
[0016]本發(fā)明的有益效果是:區(qū)別于現(xiàn)有技術(shù)的情況,本發(fā)明從so文件中逐一找到導(dǎo)出符號(hào)的字符串在so文件中的位置;獲取該位置的原始符號(hào)名稱,并對(duì)該位置的原始符號(hào)名稱進(jìn)行混淆處理;獲取與該位置的原始符號(hào)名稱的長(zhǎng)度相同的混淆后的符號(hào)名稱;將混淆后的符號(hào)名稱作為新的導(dǎo)出符號(hào)寫入so文件中的對(duì)應(yīng)位置。由于對(duì)so文件的導(dǎo)出符號(hào)進(jìn)行混淆,通過這種方式,能夠?qū)崿F(xiàn)對(duì)so文件的保護(hù),從而進(jìn)一步加強(qiáng)應(yīng)用程序的安全性。
【附圖說明】
[0017]圖1是Android系統(tǒng)的架構(gòu)示意圖;
[0018]圖2是本發(fā)明對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的方法一實(shí)施方式的流程圖;
[0019]圖3是本發(fā)明對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的方法另一實(shí)施方式的流程圖;
[0020]圖4是本發(fā)明對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的方法又一實(shí)施方式的流程圖;
[0021]圖5是本發(fā)明對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的裝置一實(shí)施方式的結(jié)構(gòu)示意圖;
[0022]圖6是本發(fā)明對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的裝置另一實(shí)施方式的結(jié)構(gòu)示意圖;
[0023]圖7是本發(fā)明對(duì)so文件中的導(dǎo)出符號(hào)進(jìn)行保護(hù)的裝置又一實(shí)施方式的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0024]在詳細(xì)介紹本發(fā)明之前,先說明一下與本發(fā)明相關(guān)的技術(shù)。
[0025]Android是Google開發(fā)的基于Linux平臺(tái)的開源手機(jī)操作系統(tǒng)。它包括操作系統(tǒng)、用戶界面和應(yīng)用程序。Android采用WebKit瀏覽器引擎,具備觸摸屏、高級(jí)圖形顯示和上網(wǎng)功能,用戶能夠在手機(jī)上查看電子郵件、搜索網(wǎng)址和觀看視頻節(jié)目等,是一種融入全部Web應(yīng)用的單一平臺(tái)。
[0026]Android的系統(tǒng)架構(gòu)和其操作系統(tǒng)一樣,采用了分層的架構(gòu)。參見圖1,圖1是An droid的系統(tǒng)架構(gòu)示意圖,從架構(gòu)圖看,Android分為四個(gè)層,從高層到低層分別是:應(yīng)用程序?qū)?0、應(yīng)用程序框架層20、系統(tǒng)運(yùn)行庫(kù)層30和linux核心層40。
[0027](1)在應(yīng)用程序?qū)?0,Android會(huì)同一系列核心應(yīng)用程序包一起發(fā)布,該應(yīng)用程序包包括email客戶端、SMS短消息程序、日歷、地圖、瀏覽器、聯(lián)系人管理程序等。所有的應(yīng)用程序都是使用JAVA語言編寫的。
[0028](2)在應(yīng)用程序框架層20,開發(fā)人員可以完全訪問核心應(yīng)用程序所使用的API框架。該應(yīng)用程序的架構(gòu)設(shè)計(jì)簡(jiǎn)化了組件的重用,任何一個(gè)應(yīng)用程序都可以發(fā)布它的功能塊并且任何其它的應(yīng)用程序都可以使用其所發(fā)布的功能塊。同樣,該應(yīng)用程序重用機(jī)制也使用戶可以方便的替換程序組件。隱藏在每個(gè)應(yīng)用后面的是一系列的服務(wù)和系統(tǒng),其中包括:
[0029]豐富而又可擴(kuò)展的視圖(Views),可以用來構(gòu)建應(yīng)用程序,它包括列表(lists)、網(wǎng)格(grids)、文本框(text boxes)、按鈕(buttons),甚至可嵌入的web瀏覽器;
[0030]內(nèi)容提供器(ContentProviders),其使得應(yīng)用程序可以訪問另一個(gè)應(yīng)用程序的數(shù)據(jù)(如聯(lián)系人數(shù)據(jù)庫(kù)),或者共享它們自己的數(shù)據(jù);
[0031]資源管理器(Resource Manager),其提供非代碼資源的訪問,如本地字符串、圖形和布局文件(layout files);
[0032]通知管理器(Notificat1n Manager),其使得應(yīng)用程序可以在狀態(tài)欄中顯示自定義的提示信息;
[0033]活動(dòng)管理器(ActivityManager),用來管理應(yīng)用程序生命周期并提供常用的導(dǎo)航回退功能。
[0034](3)系統(tǒng)運(yùn)行庫(kù)層30包括程序庫(kù)和Android運(yùn)行庫(kù)。
[0035]1)程序庫(kù):
[0036]Android包含一些C/C++庫(kù),