本發(fā)明涉及計(jì)算機(jī)應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種android系統(tǒng)中的文件脫殼方法及裝置。
背景技術(shù):
隨著計(jì)算機(jī)應(yīng)用技術(shù)的飛速發(fā)展,針對(duì)android系統(tǒng)所設(shè)計(jì)的應(yīng)用程序越來(lái)越多,程序員為了縮小應(yīng)用程序所占用的磁盤空間,或者,為了防止其所設(shè)計(jì)的應(yīng)用程序不被非法修改或者反編譯,通常都會(huì)對(duì)應(yīng)用程序所對(duì)應(yīng)的可執(zhí)行代碼文件進(jìn)行加殼,以形成應(yīng)用程序的加殼文件。
相對(duì)的,應(yīng)用程序在運(yùn)行之前就需要對(duì)加殼文件進(jìn)行脫殼,以使應(yīng)用程序通過(guò)加載相應(yīng)的可執(zhí)行代碼能夠順暢運(yùn)行。
然而,現(xiàn)有的文件脫殼方法通常是利用android模擬器將應(yīng)用程序運(yùn)行時(shí)的內(nèi)存全部轉(zhuǎn)錄(dump)下來(lái),再?gòu)膁ump得到的內(nèi)存中尋找應(yīng)用程序的可執(zhí)行代碼,進(jìn)而形成可執(zhí)行代碼文件,以此達(dá)到文件脫殼目的。
該種方法需要花費(fèi)大量的時(shí)間進(jìn)行內(nèi)存的dump,因此,仍存在文件脫殼效率低的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
基于此,有必要提供一種android系統(tǒng)中的文件脫殼方法,所述方法能夠提高文件脫殼效率。
此外,還有必要提供一種android系統(tǒng)中的文件脫殼裝置,所述裝置能夠提高文件脫殼效率。
為了解決上述技術(shù)問(wèn)題,本發(fā)明所采用的技術(shù)方案為:
一種android系統(tǒng)中的文件脫殼方法,包括:獲取目標(biāo)應(yīng)用的應(yīng)用信息;在所述目標(biāo)應(yīng)用指定的運(yùn)行環(huán)境中啟動(dòng)所述目標(biāo)應(yīng)用,根據(jù)所述應(yīng)用信息監(jiān)控啟動(dòng)的所述目標(biāo)應(yīng)用的運(yùn)行狀態(tài);當(dāng)所述目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài)時(shí),通過(guò)結(jié)構(gòu)體得到可執(zhí)行代碼文件,所述結(jié)構(gòu)體是所述目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境對(duì)應(yīng)形成的。
一種android系統(tǒng)中的文件脫殼裝置,包括:信息獲取模塊,用以獲取目標(biāo)應(yīng)用的應(yīng)用信息;狀態(tài)監(jiān)控模塊,用以在所述目標(biāo)應(yīng)用指定的運(yùn)行環(huán)境中啟動(dòng)所述目標(biāo)應(yīng)用,根據(jù)所述應(yīng)用信息監(jiān)控啟動(dòng)的所述目標(biāo)應(yīng)用的運(yùn)行狀態(tài);文件組裝模塊,用以當(dāng)所述目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài)時(shí),通過(guò)結(jié)構(gòu)體得到可執(zhí)行代碼文件,所述結(jié)構(gòu)體是所述目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境對(duì)應(yīng)形成的。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下有益效果:
為實(shí)現(xiàn)目標(biāo)應(yīng)用的文件脫殼,獲取目標(biāo)應(yīng)用的應(yīng)用信息,在目標(biāo)應(yīng)用指定的運(yùn)行環(huán)境中啟動(dòng)目標(biāo)應(yīng)用,根據(jù)應(yīng)用信息對(duì)啟動(dòng)的目標(biāo)應(yīng)用進(jìn)行運(yùn)行狀態(tài)監(jiān)控,當(dāng)目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài)時(shí),通過(guò)目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境所對(duì)應(yīng)的結(jié)構(gòu)體得到可執(zhí)行代碼文件。
也就是說(shuō),通過(guò)對(duì)目標(biāo)應(yīng)用的運(yùn)行狀態(tài)進(jìn)行監(jiān)控,在目標(biāo)應(yīng)用處于解密狀態(tài)時(shí)加載目標(biāo)應(yīng)用的可執(zhí)行代碼至運(yùn)行環(huán)境,進(jìn)而利用可執(zhí)行代碼加載至運(yùn)行環(huán)境所對(duì)應(yīng)的結(jié)構(gòu)體,即可得到可執(zhí)行代碼文件,以此達(dá)到文件脫殼的目的,避免了現(xiàn)有技術(shù)中利用android模擬器對(duì)目標(biāo)應(yīng)用運(yùn)行時(shí)的全部?jī)?nèi)存進(jìn)行dump,從而有效地提高了文件脫殼效率。
附圖說(shuō)明
圖1為本發(fā)明實(shí)施例所提供的一種移動(dòng)終端的結(jié)構(gòu)示意圖;
圖2為一實(shí)施例的android系統(tǒng)中的文件脫殼方法的流程圖;
圖3為圖2中獲取目標(biāo)應(yīng)用的應(yīng)用信息的方法流程圖;
圖4為圖2中根據(jù)應(yīng)用信息監(jiān)控啟動(dòng)的目標(biāo)應(yīng)用的運(yùn)行狀態(tài)的方法流程圖;
圖5為圖2中根據(jù)結(jié)構(gòu)體得到可執(zhí)行代碼文件的方法流程圖;
圖5a為圖5中dex格式的可執(zhí)行代碼文件的結(jié)構(gòu)示意圖;
圖6為另一實(shí)施例的android系統(tǒng)中的文件脫殼方法的流程圖;
圖7為一個(gè)實(shí)施例的android系統(tǒng)中的文件脫殼裝置的結(jié)構(gòu)框圖;
圖8為圖7中信息獲取模塊的結(jié)構(gòu)框圖;
圖9為圖7中狀態(tài)監(jiān)控模塊的結(jié)構(gòu)框圖;
圖10為圖7中文件脫殼模塊的結(jié)構(gòu)框圖;
圖11為另一實(shí)施例的android系統(tǒng)中的文件脫殼裝置的結(jié)構(gòu)框圖。
具體實(shí)施方式
體現(xiàn)本發(fā)明特征與優(yōu)點(diǎn)的典型實(shí)施方式將在以下的說(shuō)明中詳細(xì)敘述。應(yīng)理解的是本發(fā)明能夠在不同的實(shí)施方式上具有各種的變化,其皆不脫離本發(fā)明的范圍,且其中的說(shuō)明及圖示在本質(zhì)上是當(dāng)作說(shuō)明之用,而非用以限制本發(fā)明。
應(yīng)用程序通過(guò)運(yùn)行來(lái)為用戶提供各種服務(wù),以滿足用戶各種請(qǐng)求,而應(yīng)用程序的運(yùn)行必將需要進(jìn)行可執(zhí)行代碼的加載,并執(zhí)行該應(yīng)用程序所加載的可執(zhí)行代碼。
為了保護(hù)應(yīng)用程序的可執(zhí)行代碼不被篡改或者反編譯,程序員通常會(huì)對(duì)可執(zhí)行代碼所形成的可執(zhí)行代碼文件進(jìn)行加殼,以形成受保護(hù)的加殼文件,從而有效地保護(hù)應(yīng)用程序的安全。
相對(duì)的,脫殼即是使加殼文件去掉其所加的“殼”,從而得到可執(zhí)行代碼文件,進(jìn)而通過(guò)運(yùn)行應(yīng)用程序的可執(zhí)行代碼保證應(yīng)用程序順暢運(yùn)行。
然而,現(xiàn)有的文件脫殼方法是通過(guò)篡改api(applicationprogramminginterface,應(yīng)用程序編程接口)接口的方式,獲取應(yīng)用程序的可執(zhí)行代碼文件在內(nèi)存當(dāng)中的映射空間,然后在應(yīng)用程序加載可執(zhí)行代碼完成之后dump下應(yīng)用程序運(yùn)行時(shí)的全部?jī)?nèi)存至磁盤,并通過(guò)獲取到的映射空間進(jìn)行可執(zhí)行代碼文件的查找,以此實(shí)現(xiàn)文件脫殼。
該種方法通過(guò)android模擬器來(lái)運(yùn)行應(yīng)用程序,不僅需要花費(fèi)大量的時(shí)間以及占用大量的磁盤存儲(chǔ)空間,而且在全部?jī)?nèi)存空間中查找可執(zhí)行代碼文件相對(duì)困難,因?yàn)樵撊績(jī)?nèi)存空間中會(huì)有很多非真正的可執(zhí)行代碼所形成的可執(zhí)行代碼文件。此外,在應(yīng)用程序運(yùn)行過(guò)程中,還可能由于android系統(tǒng)的原因或者應(yīng)用程序自身的原因,造成可執(zhí)行代碼被覆蓋,從而無(wú)法查找到可執(zhí)行代碼文件,導(dǎo)致脫殼失敗。
因此,為了提高文件脫殼效率和文件脫殼的成功率,特提出了一種android系統(tǒng)中的文件脫殼方法,該方法運(yùn)行于移動(dòng)終端之上。
請(qǐng)參閱圖1,圖1為本發(fā)明實(shí)施例所提供的一種移動(dòng)終端100的結(jié)構(gòu)示意圖。該移動(dòng)終端100可以是智能手機(jī)、平板電腦、掌上電腦或者其它可供android系統(tǒng)運(yùn)行的終端設(shè)備。
移動(dòng)終端100包括存儲(chǔ)器101、存儲(chǔ)控制器103、一個(gè)或多個(gè)(圖中僅示出一個(gè))處理器105、外設(shè)接口107、射頻模塊109、定位模塊111、攝像模塊113、音頻模塊115、觸控屏幕117以及按鍵模塊119。這些組件通過(guò)一條或多條通訊總線/信號(hào)線121相互通訊。
可以理解,圖1所示的結(jié)構(gòu)僅為示意,移動(dòng)終端100還可包括比圖1中所示更多或更少的組件,或者具有與圖1所示不同的組件。圖1中所示的各組件可以采用硬件、軟件或者其組合來(lái)實(shí)現(xiàn)。
其中,存儲(chǔ)器101可用于存儲(chǔ)軟件程序以及模塊,如本發(fā)明實(shí)施例中的文件脫殼方法及裝置對(duì)應(yīng)的程序指令及模塊,處理器105通過(guò)運(yùn)行存儲(chǔ)在存儲(chǔ)器101內(nèi)的程序指令,從而執(zhí)行各種功能以及數(shù)據(jù)處理,即實(shí)現(xiàn)上述運(yùn)行于移動(dòng)終端100的文件脫殼方法。
存儲(chǔ)器101作為資源存儲(chǔ)的載體,可以是隨機(jī)存儲(chǔ)介質(zhì)、例如高速隨機(jī)存儲(chǔ)器、非易失性存儲(chǔ)器,如一個(gè)或多個(gè)磁性存儲(chǔ)裝置、閃存、或者其它固態(tài)存儲(chǔ)器。存儲(chǔ)方式可以是短暫存儲(chǔ)或者永久存儲(chǔ)。
外設(shè)接口107可以包括至少一有線或無(wú)線網(wǎng)絡(luò)接口、至少一串并聯(lián)轉(zhuǎn)換接口、至少一輸入輸出接口以及至少一usb接口等等,用于將外部各種輸入/輸出裝置耦合至存儲(chǔ)器101以及處理器105,以實(shí)現(xiàn)與外部各種輸入/輸出裝置的通信。
射頻模塊109用于收發(fā)電磁波,實(shí)現(xiàn)電磁波與電信號(hào)的相互轉(zhuǎn)換,從而通過(guò)通訊網(wǎng)絡(luò)與其他設(shè)備進(jìn)行通訊。通信網(wǎng)絡(luò)包括蜂窩式電話網(wǎng)、無(wú)線局域網(wǎng)或者城域網(wǎng),上述通信網(wǎng)絡(luò)可以使用各種通信標(biāo)準(zhǔn)、協(xié)議及技術(shù)。
定位模塊111用于獲取移動(dòng)終端100的當(dāng)前所在的地理位置。定位模塊111的實(shí)例包括但不限于全球衛(wèi)星定位系統(tǒng)(gps)、基于無(wú)線局域網(wǎng)或者移動(dòng)通信網(wǎng)的定位技術(shù)。
攝像模塊113用于拍攝照片或者視頻。拍攝的照片或者視頻可以存儲(chǔ)至存儲(chǔ)器101內(nèi),還可以通過(guò)射頻模塊109發(fā)送。
音頻模塊115向用戶提供音頻接口,其可包括一個(gè)或多個(gè)麥克風(fēng)接口、一個(gè)或多個(gè)揚(yáng)聲器接口以及一個(gè)或多個(gè)耳機(jī)接口。通過(guò)音頻接口與其它設(shè)備進(jìn)行音頻數(shù)據(jù)的交互。音頻數(shù)據(jù)可以存儲(chǔ)至存儲(chǔ)器101內(nèi),還可以通過(guò)射頻模塊109發(fā)送。
觸控屏幕117在移動(dòng)終端100與用戶之間提供一個(gè)輸入輸出界面。具體地,用戶可通過(guò)觸控屏幕117進(jìn)行輸入操作,例如點(diǎn)擊、觸摸、滑動(dòng)等手勢(shì)操作,以使移動(dòng)終端對(duì)該輸入操作進(jìn)行響應(yīng)。移動(dòng)終端100則將文字、圖片或者視頻任意一種形式或者組合所形成的輸出內(nèi)容通過(guò)觸控屏幕117向用戶顯示輸出。
按鍵模塊119包括至少一個(gè)按鍵,用以提供用戶向移動(dòng)終端100進(jìn)行輸入的接口,用戶可以通過(guò)按下不同的按鍵使移動(dòng)終端100執(zhí)行不同的功能。例如,聲音調(diào)節(jié)按鍵可供用戶實(shí)現(xiàn)對(duì)移動(dòng)終端100播放的聲音音量的調(diào)節(jié)。
請(qǐng)參閱圖2,在一實(shí)施例中,一種android系統(tǒng)中的文件脫殼方法包括以下步驟:
步驟210,獲取目標(biāo)應(yīng)用的應(yīng)用信息。
本實(shí)施例中,目標(biāo)應(yīng)用特指待進(jìn)行文件脫殼的應(yīng)用程序,其可運(yùn)行于移動(dòng)終端的android系統(tǒng)上。該目標(biāo)應(yīng)用可以和用戶進(jìn)行交互,具有可視的用戶界面。例如,聊天應(yīng)用是多個(gè)用戶之間進(jìn)行會(huì)話的應(yīng)用程序,其具有可視的用戶界面,以向用戶展示會(huì)話界面,通過(guò)會(huì)話界面呈現(xiàn)多個(gè)用戶之間進(jìn)行會(huì)話的內(nèi)容。
目標(biāo)應(yīng)用的應(yīng)用信息包括但不限于目標(biāo)應(yīng)用名稱、目標(biāo)應(yīng)用的活動(dòng)組件(activity)、服務(wù)組件(service)和廣播接收器組件(receiver)等等。該應(yīng)用信息能夠使得android系統(tǒng)知悉目標(biāo)應(yīng)用的運(yùn)行狀態(tài),進(jìn)而確認(rèn)該目標(biāo)應(yīng)用是否能夠進(jìn)行用戶請(qǐng)求處理。
例如,短消息應(yīng)用的應(yīng)用信息中包括一個(gè)給選定的聯(lián)系人寫短消息的activity,android系統(tǒng)通過(guò)該activity的啟動(dòng)能夠知悉短消息應(yīng)用中與該activity對(duì)應(yīng)的工作已運(yùn)行,其可以進(jìn)一步確認(rèn)是否能夠?qū)τ脩魧懚滔⒌恼?qǐng)求進(jìn)行處理,即是否能夠給用戶選定的聯(lián)系人寫短消息。
基于此,通過(guò)獲取目標(biāo)應(yīng)用的應(yīng)用信息,將能夠使得android系統(tǒng)監(jiān)控目標(biāo)應(yīng)用的運(yùn)行狀態(tài)。
步驟230,在目標(biāo)應(yīng)用指定的運(yùn)行環(huán)境中啟動(dòng)目標(biāo)應(yīng)用,根據(jù)應(yīng)用信息監(jiān)控啟動(dòng)的目標(biāo)應(yīng)用的運(yùn)行狀態(tài)。
運(yùn)行環(huán)境是用來(lái)運(yùn)行目標(biāo)應(yīng)用的環(huán)境,例如,android系統(tǒng)中可供目標(biāo)應(yīng)用指定的運(yùn)行環(huán)境是虛擬機(jī)所搭建的,其中,虛擬機(jī)可以是dalvik虛擬機(jī),還可以是art虛擬機(jī)。
目標(biāo)應(yīng)用在運(yùn)行環(huán)境中存在的運(yùn)行狀態(tài)包括啟動(dòng)、解密和運(yùn)行三種狀態(tài)。換而言之,目標(biāo)應(yīng)用在指定的運(yùn)行環(huán)境中啟動(dòng)后,將依次進(jìn)入解密狀態(tài)、運(yùn)行狀態(tài),從而最終運(yùn)行于運(yùn)行環(huán)境中來(lái)為用戶提供各種服務(wù)。
進(jìn)一步地,在獲取到目標(biāo)應(yīng)用的應(yīng)用信息之后,android系統(tǒng)將根據(jù)應(yīng)用信息對(duì)目標(biāo)應(yīng)用的運(yùn)行狀態(tài)進(jìn)行監(jiān)控,確保目標(biāo)應(yīng)用處于解密狀態(tài),以利于文件脫殼。
步驟250,當(dāng)目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài)時(shí),通過(guò)結(jié)構(gòu)體得到可執(zhí)行代碼文件,結(jié)構(gòu)體是目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境對(duì)應(yīng)形成的。
目標(biāo)應(yīng)用在指定的運(yùn)行環(huán)境中啟動(dòng)后,將進(jìn)入解密狀態(tài)。目標(biāo)應(yīng)用處于解密狀態(tài)時(shí),android系統(tǒng)將對(duì)目標(biāo)應(yīng)用執(zhí)行解密操作,并在執(zhí)行完成對(duì)目標(biāo)應(yīng)用的解密操作之后,將目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境。
進(jìn)一步地,由于目標(biāo)應(yīng)用的可執(zhí)行代碼在加載至運(yùn)行環(huán)境之后,會(huì)在運(yùn)行環(huán)境中對(duì)應(yīng)形成一個(gè)結(jié)構(gòu)體,該結(jié)構(gòu)體是與目標(biāo)應(yīng)用的可執(zhí)行代碼密切相關(guān)的,因此,通過(guò)該結(jié)構(gòu)體即能夠得到包含了可執(zhí)行代碼的可執(zhí)行代碼文件,達(dá)到文件脫殼的目的。
通過(guò)如上所述的方法,實(shí)現(xiàn)了通過(guò)android系統(tǒng)層對(duì)目標(biāo)應(yīng)用所處的運(yùn)行狀態(tài)進(jìn)行監(jiān)控,確保在目標(biāo)應(yīng)用執(zhí)行完成解密操作時(shí),通過(guò)目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境所對(duì)應(yīng)的結(jié)構(gòu)體自動(dòng)化生成可執(zhí)行代碼文件,從而獲得目標(biāo)應(yīng)用的可執(zhí)行代碼,完成文件脫殼。
上述文件脫殼方法不再需要花費(fèi)大量的時(shí)間進(jìn)行內(nèi)存的dump,并且文件脫殼的過(guò)程是在目標(biāo)應(yīng)用處于解密狀態(tài)時(shí)進(jìn)行的,避免了在目標(biāo)應(yīng)用運(yùn)行過(guò)程中真正的可執(zhí)行代碼被覆蓋的風(fēng)險(xiǎn),以此保證了該文件脫殼方法能夠準(zhǔn)確地得到目標(biāo)應(yīng)用真正的可執(zhí)行代碼,從而不僅有效地提高了文件脫殼效率,還保證了文件脫殼的成功率。
請(qǐng)參閱圖3,在一實(shí)施例中,步驟210包括以下步驟:
步驟211,解壓目標(biāo)應(yīng)用的安裝包,得到全局配置文件。
目標(biāo)應(yīng)用是可運(yùn)行于android系統(tǒng)上用以完成某項(xiàng)或多項(xiàng)特定工作的應(yīng)用程序,其可以和用戶進(jìn)行交互,具有可視的用戶界面。
為此,目標(biāo)應(yīng)用包括全局配置文件、可執(zhí)行代碼文件加殼所形成的加殼文件、以及其他該目標(biāo)應(yīng)用所需要的數(shù)據(jù)和資源文件。
其中,全局配置文件使得android系統(tǒng)知悉目標(biāo)應(yīng)用能夠完成哪幾項(xiàng)特定工作,亦即目標(biāo)應(yīng)用能夠處理哪些用戶請(qǐng)求。加殼文件用以提供可在運(yùn)行環(huán)境中執(zhí)行的可執(zhí)行代碼,以使目標(biāo)應(yīng)用運(yùn)行于運(yùn)行環(huán)境。其他數(shù)據(jù)和資源文件用以提供與用戶交互的可視的用戶界面。
進(jìn)一步地,目標(biāo)應(yīng)用的安裝包則是對(duì)目標(biāo)應(yīng)用所包括的上述內(nèi)容進(jìn)行打包得到的,例如,android系統(tǒng)中以apk為文件后綴名的可執(zhí)行程序即可視為目標(biāo)應(yīng)用的安裝包。通過(guò)對(duì)目標(biāo)應(yīng)用的安裝包進(jìn)行解壓,即能夠得到目標(biāo)應(yīng)用中的全局配置文件、加殼文件以及其他數(shù)據(jù)和資源文件。
步驟213,解析全局配置文件得到目標(biāo)應(yīng)用的應(yīng)用信息。
如前所述,全局配置文件使得android系統(tǒng)知悉目標(biāo)應(yīng)用能夠完成哪幾項(xiàng)特定工作,亦即目標(biāo)應(yīng)用能夠處理哪些用戶請(qǐng)求。
基于此,全局配置文件中至少包括:對(duì)目標(biāo)應(yīng)用名稱的聲明,以使android系統(tǒng)知悉該全局配置文件屬于哪個(gè)目標(biāo)應(yīng)用;對(duì)各種組件的聲明,以使android系統(tǒng)知悉目標(biāo)應(yīng)用能夠處理哪些用戶請(qǐng)求。
例如,播放器應(yīng)用的全局配置文件中至少對(duì)一個(gè)可維持音樂(lè)播放的service進(jìn)行了聲明,則android系統(tǒng)知悉播放器應(yīng)用能夠滿足用戶的音樂(lè)后臺(tái)播放請(qǐng)求,即在用戶離開播放器應(yīng)用時(shí),仍然使播放器應(yīng)用運(yùn)行于后臺(tái),進(jìn)而使得音樂(lè)仍然在繼續(xù)播放。
因此,通過(guò)對(duì)全局配置文件進(jìn)行解析,即能夠得到目標(biāo)應(yīng)用的應(yīng)用信息,該應(yīng)用信息至少包括目標(biāo)應(yīng)用名稱、activity(活動(dòng)組件)、service(服務(wù)組件)和receiver(廣播接收器組件)等等。
請(qǐng)參閱圖4,在一實(shí)施例中,步驟230包括以下步驟:
步驟231,由應(yīng)用信息中得到目標(biāo)應(yīng)用的活動(dòng)組件。
應(yīng)用信息至少包括目標(biāo)應(yīng)用名稱、activity(活動(dòng)組件)、service(服務(wù)組件)和receiver(廣播接收器組件)等等,通過(guò)目標(biāo)應(yīng)用的應(yīng)用信息的獲取,即得到目標(biāo)應(yīng)用的活動(dòng)組件activity。
步驟233,判斷運(yùn)行環(huán)境中目標(biāo)應(yīng)用的活動(dòng)組件是否啟動(dòng)。
如前所述,android系統(tǒng)通過(guò)目標(biāo)應(yīng)用的activity的啟動(dòng),能夠知悉目標(biāo)應(yīng)用中與activity對(duì)應(yīng)的某項(xiàng)或多項(xiàng)特定工作已運(yùn)行,并進(jìn)一步地確認(rèn)目標(biāo)應(yīng)用是否能夠進(jìn)行用戶請(qǐng)求處理。
可以理解,若目標(biāo)應(yīng)用的activity全部啟動(dòng),則與activity對(duì)應(yīng)的特定工作均已運(yùn)行,即表明目標(biāo)應(yīng)用已做好了進(jìn)行用戶請(qǐng)求處理的準(zhǔn)備,并等待目標(biāo)應(yīng)用的可執(zhí)行代碼執(zhí)行于運(yùn)行環(huán)境,此時(shí),目標(biāo)應(yīng)用仍處于解密狀態(tài)。當(dāng)目標(biāo)應(yīng)用的可執(zhí)行代碼在運(yùn)行環(huán)境中執(zhí)行時(shí),目標(biāo)應(yīng)用進(jìn)入運(yùn)行狀態(tài),即目標(biāo)應(yīng)用運(yùn)行在運(yùn)行環(huán)境中,此時(shí),該目標(biāo)應(yīng)用能夠及時(shí)對(duì)用戶請(qǐng)求進(jìn)行處理。
也就是說(shuō),目標(biāo)應(yīng)用的解密狀態(tài)大致分為三個(gè)過(guò)程:對(duì)目標(biāo)應(yīng)用執(zhí)行解密操作、加載目標(biāo)應(yīng)用的可執(zhí)行代碼至運(yùn)行環(huán)境、啟動(dòng)目標(biāo)應(yīng)用的全部activity。
基于此,本實(shí)施例中,通過(guò)判斷運(yùn)行環(huán)境中目標(biāo)應(yīng)用的activity是否啟動(dòng)來(lái)對(duì)目標(biāo)應(yīng)用的運(yùn)行狀態(tài)進(jìn)行監(jiān)控,將能夠確保目標(biāo)應(yīng)用處于解密狀態(tài)時(shí)目標(biāo)應(yīng)用已執(zhí)行完成解密操作并且可執(zhí)行代碼已加載至運(yùn)行環(huán)境中。
具體地,若判斷得到運(yùn)行環(huán)境中目標(biāo)應(yīng)用的activity已全部啟動(dòng),則目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài),反之,若判斷得到運(yùn)行環(huán)境中目標(biāo)應(yīng)用的activity尚未全部啟動(dòng),則目標(biāo)應(yīng)用仍處于啟動(dòng)狀態(tài)。
請(qǐng)參閱圖5,在一實(shí)施例中,步驟250包括以下步驟:
步驟251,目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài)時(shí),由結(jié)構(gòu)體中得到目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境所對(duì)應(yīng)的內(nèi)存地址。
目標(biāo)應(yīng)用處于解密狀態(tài)時(shí),可執(zhí)行代碼已加載至運(yùn)行環(huán)境中,即運(yùn)行環(huán)境將為加載的可執(zhí)行代碼進(jìn)行內(nèi)存分配,以利于可執(zhí)行代碼在運(yùn)行環(huán)境中執(zhí)行。如前所述,結(jié)構(gòu)體是在目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境對(duì)應(yīng)形成的,可以理解,該結(jié)構(gòu)體中至少保存有目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境中所對(duì)應(yīng)的內(nèi)存地址。
基于此,在目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境時(shí),即能夠從對(duì)應(yīng)形成的結(jié)構(gòu)體中得到目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境所對(duì)應(yīng)的內(nèi)存地址。
步驟253,根據(jù)內(nèi)存地址獲取對(duì)應(yīng)的脫殼文件信息,并組裝脫殼文件信息得到可執(zhí)行代碼文件。
以dex格式的可執(zhí)行代碼文件(下面簡(jiǎn)稱為dex文件)為例,如圖5a所示,dex文件400包括dex頭部信息410、常量池信息430和類信息450。
每一個(gè)dex文件400在dalvik虛擬機(jī)中都對(duì)應(yīng)于一個(gè)dexorjar結(jié)構(gòu)體,該dexorjar結(jié)構(gòu)體中保存了對(duì)應(yīng)的dex文件400中的可執(zhí)行代碼加載至dalvik虛擬機(jī)所對(duì)應(yīng)的內(nèi)存地址。
進(jìn)一步地,該內(nèi)存地址包括dex頭部信息410的內(nèi)存地址、常量池信息430的內(nèi)存地址以及類信息450的內(nèi)存地址。
通過(guò)上述內(nèi)存地址即可于dalvik虛擬機(jī)所在內(nèi)存中獲取得到對(duì)應(yīng)的脫殼文件信息,即對(duì)應(yīng)的脫殼文件信息包括dex頭部信息410、常量池信息430和類信息450。
由此,通過(guò)對(duì)dex頭部信息410、常量池信息430和類信息450進(jìn)行組裝,即形成dex文件400,進(jìn)而得到dex文件400中的可執(zhí)行代碼,完成了文件脫殼。
進(jìn)一步地,請(qǐng)參閱圖6,在一實(shí)施例中,步驟251之前,如上所述的方法還包括以下步驟:
步驟310,在運(yùn)行環(huán)境中加載目標(biāo)應(yīng)用的加殼文件,通過(guò)加殼文件中的外殼代碼對(duì)加殼文件進(jìn)行的解密,得到可執(zhí)行代碼。
如前所述,加殼文件由目標(biāo)應(yīng)用的安裝包解壓得到,同時(shí)得到的還有全局配置文件以及其他數(shù)據(jù)和資源文件。通過(guò)目標(biāo)應(yīng)用在運(yùn)行環(huán)境中啟動(dòng),目標(biāo)應(yīng)用的加殼文件即被加載至運(yùn)行環(huán)境中,等待執(zhí)行解密操作。
外殼代碼則是加殼文件的文件頭中添加的一段程序指令,用以指示android系統(tǒng)如何對(duì)加殼文件進(jìn)行解密。可以理解,該外殼代碼是通過(guò)對(duì)可執(zhí)行代碼文件加殼而對(duì)應(yīng)添加至加殼文件的文件頭中的。因此,在得到加殼文件之后,即可從該加殼文件的文件頭中提取得出外殼代碼。
在提取得出外殼代碼之后,android系統(tǒng)即通過(guò)加載該外殼代碼于運(yùn)行環(huán)境中來(lái)對(duì)加殼文件進(jìn)行解密,從而得到目標(biāo)應(yīng)用的可執(zhí)行代碼。
步驟330,加載解密得到的可執(zhí)行代碼至運(yùn)行環(huán)境。
在解密得到目標(biāo)應(yīng)用的可執(zhí)行代碼之后,android系統(tǒng)將以該可執(zhí)行代碼替換外殼代碼加載至運(yùn)行環(huán)境中,以利于運(yùn)行環(huán)境執(zhí)行該可執(zhí)行代碼使目標(biāo)應(yīng)用運(yùn)行于運(yùn)行環(huán)境中。
需要說(shuō)明的是,此處解密得到的可執(zhí)行代碼是零散的,尚未形成可執(zhí)行代碼文件,只有將零散的可執(zhí)行代碼形成可執(zhí)行代碼文件之后,應(yīng)用程序在下一次運(yùn)行過(guò)程中才能夠直接加載,以利于可執(zhí)行代碼在運(yùn)行環(huán)境中執(zhí)行,而不必再經(jīng)歷目標(biāo)應(yīng)用的啟動(dòng)、解密過(guò)程,這也正是文件脫殼的意義所在。
步驟350,保存可執(zhí)行代碼加載至運(yùn)行環(huán)境所對(duì)應(yīng)的內(nèi)存地址,形成結(jié)構(gòu)體。
在目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境,即將其所對(duì)應(yīng)的內(nèi)存地址存儲(chǔ)形成一個(gè)結(jié)構(gòu)體。換而言之,該結(jié)構(gòu)體在運(yùn)行環(huán)境中對(duì)應(yīng)于目標(biāo)應(yīng)用的可執(zhí)行代碼,通過(guò)該結(jié)構(gòu)體即能夠得到目標(biāo)應(yīng)用的可執(zhí)行代碼,達(dá)到文件脫殼的目的。
請(qǐng)參閱圖7,在一實(shí)施例中,一種android系統(tǒng)中的文件脫殼裝置包括:信息獲取模塊510、狀態(tài)監(jiān)控模塊530及文件脫殼模塊550。
其中,信息獲取模塊510用以獲取目標(biāo)應(yīng)用的應(yīng)用信息。
狀態(tài)監(jiān)控模塊530用以在目標(biāo)應(yīng)用指定的運(yùn)行環(huán)境中啟動(dòng)目標(biāo)應(yīng)用,根據(jù)應(yīng)用信息監(jiān)控啟動(dòng)的目標(biāo)應(yīng)用的運(yùn)行狀態(tài)。
文件脫殼模塊550用以當(dāng)目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài)時(shí),通過(guò)結(jié)構(gòu)體得到可執(zhí)行代碼文件,結(jié)構(gòu)體是目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境對(duì)應(yīng)形成的。
請(qǐng)參閱圖8,在一實(shí)施例中,信息獲取模塊510包括:安裝包解壓?jiǎn)卧?11及文件解析單元513。
其中,安裝包解壓?jiǎn)卧?11用以解壓目標(biāo)應(yīng)用的安裝包,得到全局配置文件。
文件解析單元513用以解析全局配置文件得到目標(biāo)應(yīng)用的應(yīng)用信息。
請(qǐng)參閱圖9,在一實(shí)施例中,狀態(tài)監(jiān)控模塊530包括:組件獲取單元531及判斷單元533。
其中,組件獲取單元531用以由應(yīng)用信息中得到目標(biāo)應(yīng)用的活動(dòng)組件。
判斷單元533用以判斷運(yùn)行環(huán)境中目標(biāo)應(yīng)用的活動(dòng)組件是否啟動(dòng)。若為是,則判定目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài)。
請(qǐng)參閱圖10,在一實(shí)施例中,文件脫殼模塊550包括:地址獲取單元551及文件組裝單元553。
其中,地址獲取單元551用以目標(biāo)應(yīng)用的運(yùn)行狀態(tài)為解密狀態(tài)時(shí),由結(jié)構(gòu)體中得到目標(biāo)應(yīng)用的可執(zhí)行代碼加載至運(yùn)行環(huán)境所對(duì)應(yīng)的內(nèi)存地址。
文件組裝單元553用以根據(jù)內(nèi)存地址獲取對(duì)應(yīng)的脫殼文件信息,并組裝脫殼文件信息得到可執(zhí)行代碼文件。
請(qǐng)參閱圖11,在一實(shí)施例中,如上所述的裝置還包括:代碼獲取模塊610代碼加載模塊630及結(jié)構(gòu)體形成模塊650。
其中,代碼獲取模塊610用以在運(yùn)行環(huán)境中加載目標(biāo)應(yīng)用的加殼文件,通過(guò)加殼文件中的外殼代碼對(duì)加殼文件進(jìn)行解密,得到可執(zhí)行代碼。
代碼加載模塊630用以加載解密得到的可執(zhí)行代碼至運(yùn)行環(huán)境。
結(jié)構(gòu)體形成模塊650用以保存可執(zhí)行代碼加載至運(yùn)行環(huán)境所對(duì)應(yīng)的內(nèi)存地址,形成結(jié)構(gòu)體。
上述內(nèi)容,僅為本發(fā)明的較佳實(shí)施例,并非用于限制本發(fā)明的實(shí)施方案,本領(lǐng)域普通技術(shù)人員根據(jù)本發(fā)明的主要構(gòu)思和精神,可以十分方便地進(jìn)行相應(yīng)的變通或修改,故本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求書所要求的保護(hù)范圍為準(zhǔn)。