一種針對函數(shù)級別加殼的脫殼方法及系統(tǒng)的制作方法【專利摘要】本發(fā)明提出一種針對函數(shù)級別加殼的脫殼方法及系統(tǒng),包括:啟動模擬器,初始化應(yīng)用程序,調(diào)用應(yīng)用程序的OnCreate;加載應(yīng)用程序的Dex文件并保存,查找DexFile結(jié)構(gòu)體;檢索其中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與類定義列表中的特定代碼段是否不同,及判斷代碼地址是否超出范圍。本發(fā)明所述技術(shù)方案能從系統(tǒng)層面去調(diào)用時就可以實現(xiàn)主動解密,同時對于相似的加固技術(shù),能夠使用相似的脫殼方法,也有效的解決了通用性問題?!緦@f明】一種針對函數(shù)級別加殼的脫殼方法及系統(tǒng)
技術(shù)領(lǐng)域:
[0001]本發(fā)明涉及信息安全
技術(shù)領(lǐng)域:
,尤其涉及一種針對函數(shù)級別加殼的脫殼方法及系統(tǒng)?!?br>背景技術(shù):
】[0002]代碼是一個程序的核心,不論是處于保密和安全考慮,還是為了隱藏行為,加殼技術(shù)是最為常見,也是最有效的方法。為了隱藏核心代碼,保證系統(tǒng)核心流程的安全性,開發(fā)人員一般會對代碼進(jìn)行混淆和加密處理。而另一方面惡意應(yīng)用為了達(dá)到隱藏自己、躲避安全軟件的檢測,也會對自己的代碼進(jìn)行加密。[0003]安全軟件對于惡意代碼的檢測很大程度的依賴可知的代碼,而加密無疑是為程序化的安全檢測加上了一道鎖。并且隨著時間的推移,Android應(yīng)用從最開始的少量應(yīng)用、簡單加密,到現(xiàn)在新出來的應(yīng)用大部分都采用加固防護(hù),脫殼技術(shù)尤為急迫。[0004]Android應(yīng)用目前在網(wǎng)上比較常見的脫殼技術(shù),可以分為兩種類型:一、Dex整體加密類型應(yīng)用程序在運行時候?qū)φwdex文件進(jìn)行解密,脫殼工具在分析DexFile結(jié)構(gòu),然后內(nèi)存dump下來。[0005]缺點:現(xiàn)有方案運行時候內(nèi)存dump的方式,比較依賴hook技術(shù),并且容易被各種反調(diào)試技術(shù)阻礙。[0006]二、Dex函數(shù)抽離類型程序在加固處理的時候,將需要隱藏的代碼抽取出來并且加密存放,這種脫殼技術(shù)需要對程序解密算法進(jìn)行分析,然后單獨實現(xiàn)或者調(diào)用解密算法,進(jìn)行靜態(tài)還原。[0007]缺點:算法針對性太強(qiáng),沒一種實現(xiàn)都需要大量人力去跟進(jìn)和分析。[0008]Android系統(tǒng)作為一個開發(fā)的系統(tǒng),具有較強(qiáng)的可以定制性。我們只需要在適當(dāng)?shù)奈恢眉尤胛覀兊拿摎ごa,對于應(yīng)用程序來說,幾乎是不可察覺的,這樣可以有效的解決第一種脫殼技術(shù)的弊端。Android系統(tǒng)就是應(yīng)用程序執(zhí)行的環(huán)境,應(yīng)用程序的結(jié)構(gòu)關(guān)系,對于系統(tǒng)層來說都是可視的。對于運行時的調(diào)用解密,就可從系統(tǒng)層面去調(diào)用就可以變成一種主動解密,因此對于相似的加固技術(shù)比如函數(shù)抽離,能夠使用相識的脫殼方法,這樣可以有效的解決通用性問題?!?br/>發(fā)明內(nèi)容】[0009]本發(fā)明通過啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用脫殼代碼主體,加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同的方法,以此從系統(tǒng)層面去調(diào)用時就可以實現(xiàn)主動解密,對于相似的加固技術(shù),能夠使用相似的脫殼方法,同時也有效的解決了通用性問題。[0010]本發(fā)明采用如下方法實現(xiàn):一種針對函數(shù)級別加殼的脫殼方法,包括:啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用應(yīng)用程序的OnCreate;加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,在gDvm的hash_tables中查找DexFile結(jié)構(gòu)體;檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同,若不同,貝U從運行時Method獲取解密代碼,填寫到DexFile結(jié)構(gòu)體中method的AccessFlags位置;判斷Method的insns代碼地址是否超出DexFile范圍,若是則擴(kuò)展DexFile大小,將Method代碼拷貝至新的內(nèi)存區(qū)域,并且修復(fù)DexFile的Method偏移地址。[〇〇11]進(jìn)一步地,所述獲取解密代碼的方為:使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef,使用GetStaticMethodID查找含有clinit方法的類,實現(xiàn)主動解密。[〇〇12]進(jìn)一步地,使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef的次數(shù)為ClassDef的個數(shù)。[〇〇13]進(jìn)一步地,所述實現(xiàn)主動解密方法為循環(huán)查找內(nèi)存中Method結(jié)構(gòu)被解密的代碼,判斷AccessFlags有無Native標(biāo)志,若無,則表示已完成主動解密。[〇〇14]進(jìn)一步地,使用單獨的內(nèi)核接口對已完成主動解密的文件進(jìn)行讀寫操作。[0015]本發(fā)明可以采用如下裝置來實現(xiàn):一種針對函數(shù)級別加殼的脫殼系統(tǒng),其特征在于,包括:初始化模塊,用于啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用應(yīng)用程序的OnCreate;查找模塊,用于加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,在gDvm的hash_tables中查找DexFile結(jié)構(gòu)體;分析模塊,用于檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同,若不同,貝lj從運行時Method獲取解密代碼,填寫到DexFile結(jié)構(gòu)體中method的AccessFlags位置;修復(fù)模塊,用于判斷Method的insns代碼地址是否超出DexFile范圍,若是則擴(kuò)展DexFile大小,將Method代碼拷貝至新的內(nèi)存區(qū)域,并且修復(fù)DexFile的Method偏移地址。[〇〇16]進(jìn)一步地,所述獲取解密代碼的方為:使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef,使用GetStaticMethodID查找含有clinit方法的類,實現(xiàn)主動解密。[0017]進(jìn)一步地,使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef的次數(shù)為ClassDef的個數(shù)。[〇〇18]進(jìn)一步地,所述實現(xiàn)主動解密方法為循環(huán)查找內(nèi)存中Method結(jié)構(gòu)被解密的代碼,判斷AccessFlags有無Native標(biāo)志,若無,則表示已完成主動解密。[〇〇19]進(jìn)一步地,使用單獨的內(nèi)核接口對已完成主動解密的文件進(jìn)行讀寫操作。[0020]本發(fā)明能較通用的解密現(xiàn)有的新型加固技術(shù),相對于直接分析解密算法進(jìn)行解密,有較好的適應(yīng)性和準(zhǔn)確性。[0021]綜上所述,本發(fā)明通過啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用脫殼代碼主體,加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同的方法,以此從系統(tǒng)層面去調(diào)用時就可以實現(xiàn)主動解密,對于相似的加固技術(shù),能夠使用相似的脫殼方法,同時也有效的解決了通用性問題。[〇〇22]有益效果為:1.是基于Android系統(tǒng)進(jìn)行的再開發(fā),應(yīng)用原有的接口不會改變,所以應(yīng)用更不易察覺脫殼程序的存在。[0023]2、可以使用專用接口的方式突破hook封鎖,以及功能擴(kuò)展。[0024]3、使用的是運行時主動調(diào)用解密,對于應(yīng)用程序來說,是屬于正常的代碼執(zhí)行,不易被察覺。[0025]4、根據(jù)是脫殼前后代碼差異進(jìn)行判斷,可以一次性解決一類加固方案,通用性強(qiáng)?!靖綀D說明】[0026]為了更清楚地說明本發(fā)明或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明中記載的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。[0027]圖1為本發(fā)明提供的一種針對函數(shù)級別加殼的脫殼方法實施例流程圖;圖2為本發(fā)明提供的一種針對函數(shù)級別加殼的脫殼系統(tǒng)實施例結(jié)構(gòu)圖?!揪唧w實施方式】[0028]為了使本
技術(shù)領(lǐng)域:
的人員更好地理解本發(fā)明實施例中的技術(shù)方案,并使本發(fā)明的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結(jié)合附圖對本發(fā)明中技術(shù)方案作進(jìn)一步詳細(xì)的說明。[〇〇29]本發(fā)明通過啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用脫殼代碼主體,加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同的方法,以此從系統(tǒng)層面去調(diào)用時就可以實現(xiàn)主動解密,對于相似的加固技術(shù),能夠使用相似的脫殼方法,同時也有效的解決了通用性問題。[0030]本發(fā)明采用如下方法實現(xiàn):一種針對函數(shù)級別加殼的脫殼方法,包括:S101啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用應(yīng)用程序的OnCreate;S102加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,在gDvm的hash_tables中查找DexFi1e結(jié)構(gòu)體;S103檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同,若不同,貝丨』從運行時Method獲取解密代碼,填寫到DexFile結(jié)構(gòu)體中method的AccessFlags位置;S104判斷Method的insns代碼地址是否超出DexFile范圍,若是則擴(kuò)展DexFile大小,將Method代碼拷貝至新的內(nèi)存區(qū)域,并且修復(fù)DexFile的Method偏移地址。[〇〇31]進(jìn)一步地,所述獲取解密代碼的方為:使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef,使用GetStaticMethodID查找含有clinit方法的類,實現(xiàn)主動解密。[〇〇32]進(jìn)一步地,使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef的次數(shù)為ClassDef的個數(shù)。[〇〇33]進(jìn)一步地,所述實現(xiàn)主動解密方法為循環(huán)查找內(nèi)存中Method結(jié)構(gòu)被解密的代碼,判斷AccessFlags有無Native標(biāo)志,若無,則表示已完成主動解密。[〇〇34]進(jìn)一步地,使用單獨的內(nèi)核接口對已完成主動解密的文件進(jìn)行讀寫操作。[0035]本發(fā)明可以采用如下裝置來實現(xiàn):一種針對函數(shù)級別加殼的脫殼系統(tǒng),其特征在于,包括:初始化模塊201,用于啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用應(yīng)用程序的OnCreate;查找模塊202,用于加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,在gDvm的hash_tables中查找DexFile結(jié)構(gòu)體;分析模塊203,用于檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同,若不同,貝lj從運行時Method獲取解密代碼,填寫到DexFile結(jié)構(gòu)體中method的AccessFlags位置;修復(fù)模塊204,用于判斷Method的insns代碼地址是否超出DexFile范圍,若是則擴(kuò)展DexFile大小,將Method代碼拷貝至新的內(nèi)存區(qū)域,并且修復(fù)DexFile的Method偏移地址。[〇〇36]進(jìn)一步地,所述獲取解密代碼的方為:使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef,使用GetStaticMethodID查找含有clinit方法的類,實現(xiàn)主動解密。[0037]進(jìn)一步地,使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef的次數(shù)為ClassDef的個數(shù)。[〇〇38]進(jìn)一步地,所述實現(xiàn)主動解密方法為循環(huán)查找內(nèi)存中Method結(jié)構(gòu)被解密的代碼,判斷AccessFlags有無Native標(biāo)志,若無,則表示已完成主動解密。[〇〇39]進(jìn)一步地,使用單獨的內(nèi)核接口對已完成主動解密的文件進(jìn)行讀寫操作。[0040]通過以上的實施方式的描述可知,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可借助軟件加必需的通用硬件平臺的方式來實現(xiàn)。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機(jī)軟件產(chǎn)品可以存儲在存儲介質(zhì)中,如R0M/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機(jī)設(shè)備(可以是個人計算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例或者實施例的某些部分所述的方法。[0041]本說明書中的各個實施例均采用遞進(jìn)的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于系統(tǒng)實施例而言,由于其基本相似于方法實施例,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。[0042]本發(fā)明可用于眾多通用或?qū)S玫挠嬎阆到y(tǒng)環(huán)境或配置中。例如:個人計算機(jī)、服務(wù)器計算機(jī)、手持設(shè)備或便攜式設(shè)備、平板型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、置頂盒、可編程的消費電子設(shè)備、網(wǎng)絡(luò)PC、小型計算機(jī)、大型計算機(jī)、包括以上任何系統(tǒng)或設(shè)備的分布式計算環(huán)境等等。[0043]本發(fā)明可以在由計算機(jī)執(zhí)行的計算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計算環(huán)境中實踐本發(fā)明,在這些分布式計算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠(yuǎn)程計算機(jī)存儲介質(zhì)中。[0044]雖然通過實施例描繪了本發(fā)明,本領(lǐng)域普通技術(shù)人員知道,本發(fā)明有許多變形和變化而不脫離本發(fā)明的精神,希望所附的權(quán)利要求包括這些變形和變化而不脫離本發(fā)明的精神?!局鳈?quán)項】1.一種針對函數(shù)級別加殼的脫殼方法,其特征在于,包括:啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用應(yīng)用程序的OnCreate;加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,在gDvm的hash_tables中查找DexFile結(jié)構(gòu)體;檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同,若不同,貝U從運行時Method獲取解密代碼,填寫到DexFile結(jié)構(gòu)體中method的AccessFlags位置;判斷Method的insns代碼地址是否超出DexFile范圍,若是則擴(kuò)展DexFile大小,將Method代碼拷貝至新的內(nèi)存區(qū)域,并且修復(fù)DexFile的Method偏移地址。2.如權(quán)利要求1所述的方法,其特征在于,所述獲取解密代碼的方為:使用接口(16叉661:(]1&88〇6;1^循環(huán)獲取〇61?;[16結(jié)構(gòu)(]1&88〇6;1^,使用66丨3丨&1:;[。]\^1:110(110查找含有。1;[11;[七方法的類,實現(xiàn)主動解密。3.如權(quán)利要求2所述的方法,其特征在于,使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef的次數(shù)為ClassDef的個數(shù)。4.如權(quán)利要求2所述的方法,其特征在于,所述實現(xiàn)主動解密方法為循環(huán)查找內(nèi)存中Method結(jié)構(gòu)被解密的代碼,判斷AccessFlags有無Native標(biāo)志,若無,貝丨】表示已完成主動解您I_Lj〇5.如權(quán)利要求4所述的方法,其特征在于,使用單獨的內(nèi)核接口對已完成主動解密的文件進(jìn)行讀寫操作。6.—種針對函數(shù)級別加殼的脫殼系統(tǒng),其特征在于,包括:初始化模塊,用于啟動模擬器,初始化應(yīng)用程序Activity,調(diào)用應(yīng)用程序的OnCreate;查找模塊,用于加載應(yīng)用程序的Dex文件并保存至gDvm的hash_tables,在gDvm的hash_tables中查找DexFile結(jié)構(gòu)體;分析模塊,用于檢索DexFile結(jié)構(gòu)體中的class_defs類定義列表,并判斷加載后的Dalvik虛擬機(jī)的Method對象與class_defs類定義列表中的method結(jié)構(gòu)體中AccessFlags和insn代碼段是否不同,若不同,貝lj從運行時Method獲取解密代碼,填寫到DexFile結(jié)構(gòu)體中method的AccessFlags位置;修復(fù)模塊,用于判斷Method的insns代碼地址是否超出DexFile范圍,若是則擴(kuò)展DexFile大小,將Method代碼拷貝至新的內(nèi)存區(qū)域,并且修復(fù)DexFile的Method偏移地址。7.如權(quán)利要求6所述的方法,其特征在于,所述獲取解密代碼的方為:使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef,使用GetStaticMethodID查找含有clinit方法的類,實現(xiàn)主動解密。8.如權(quán)利要求7所述的方法,其特征在于,使用接口dexGetClassDef循環(huán)獲取DexFile結(jié)構(gòu)ClassDef的次數(shù)為ClassDef的個數(shù)。9.如權(quán)利要求7所述的方法,其特征在于,所述實現(xiàn)主動解密方法為循環(huán)查找內(nèi)存中Method結(jié)構(gòu)被解密的代碼,判斷AccessFlags有無Native標(biāo)志,若無,貝丨】表示已完成主動解您I_Lj〇10.如權(quán)利要求9所述的方法,其特征在于,使用單獨的內(nèi)核接口對已完成主動解密的文件進(jìn)行讀寫操作?!疚臋n編號】G06F21/12GK105989252SQ201510913382【公開日】2016年10月5日【申請日】2015年12月12日【發(fā)明人】唐浩,馬志遠(yuǎn),潘宣辰【申請人】武漢安天信息技術(shù)有限責(zé)任公司