本發(fā)明涉及應(yīng)用程序安全防護(hù)技術(shù)領(lǐng)域,具體涉及一種dex文件的存儲(chǔ)方法和裝置。
背景技術(shù):
隨著Android系統(tǒng)的快速發(fā)展和及設(shè)備的高速增長,基于Android的平臺(tái)應(yīng)用需求也越來越復(fù)雜。形形色色的應(yīng)用軟件壯大了Android市場,也豐富了我們的生活,越來越多的人從起初的嘗試到享受再到依賴,Android應(yīng)用越來越廣泛。與其它操作系統(tǒng)相比,Android系統(tǒng)的開源性為應(yīng)用開發(fā)者提供了更多的功能接口,但這些功能接口在提高系統(tǒng)可擴(kuò)展性的同時(shí)也為惡意軟件提供了遍歷,非法拷貝、反編譯、內(nèi)存截取等手段不斷威脅著安卓系統(tǒng)的安全,不僅危害了使用者,也給正常應(yīng)用開發(fā)者造成了嚴(yán)重的損害。因此,Android應(yīng)用安全性一直是開發(fā)者所關(guān)注的重點(diǎn)問題。
對(duì)Android應(yīng)用進(jìn)行加固防護(hù)的主要目的均是為了防止其java字節(jié)碼文件classes.dex文件被獲取,在Android平臺(tái)安裝運(yùn)行APK文件時(shí),都必須將dex文件釋放到內(nèi)存,如圖1中所示,為安卓dex文件的結(jié)構(gòu)示意圖,在dex文件加載時(shí),根據(jù)文件頭header中定義的其它結(jié)構(gòu)的偏移地址和長度信息進(jìn)行尋址解析(圖中箭頭所示),將其它結(jié)構(gòu)中的數(shù)據(jù)加載分別加載到內(nèi)存中,加載后的dex文件的內(nèi)容是存放在內(nèi)存中的一端連續(xù)的內(nèi)存空間中的,因此,破解者只需要獲取到classes.dex文件的起始地址,然后從起始地址開始dump(提取)文件總長度filesize大小的內(nèi)容,即可提取得到完整的classes.dex文件的內(nèi)容,進(jìn)而可以進(jìn)一步還原出APK文件的源代碼,使得應(yīng)用程序很容易被篡改。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明實(shí)施例的目的在于提供一種能夠克服上述問題或者至少能夠部分地解決上述問題的一種dex文件的存儲(chǔ)方法和裝置。
為實(shí)現(xiàn)上述目的,本發(fā)明的一個(gè)實(shí)施例中提供了一種dex文件的存儲(chǔ)方法,該方法包括:
解析待加載的dex文件,提取解析后的dex文件的非文件頭header中的第一指定數(shù)據(jù);
申請(qǐng)第一內(nèi)存和第二內(nèi)存,所述第一內(nèi)存用于存儲(chǔ)所述第一指定數(shù)據(jù),所述第二內(nèi)存用于存儲(chǔ)dex文件中除第一指定數(shù)據(jù)之外的其他數(shù)據(jù);所述第一內(nèi)存和第二內(nèi)存不連續(xù);
根據(jù)所述第一內(nèi)存的內(nèi)存地址信息,修改dex文件的文件頭header中所述第一指定數(shù)據(jù)的偏移地址,使其指向第一內(nèi)存。
優(yōu)選的,如上所述的方法,完成文件頭header中所述第一指定數(shù)據(jù)的偏移地址的修改后,還包括:
根據(jù)修改后的dex文件的文件頭header信息,完成解析后的dex文件的加載,將所述第一指定數(shù)據(jù)加載到第一內(nèi)存中,將所述其它數(shù)據(jù)加載到第二內(nèi)存中。
優(yōu)選的,如上所述的方法,所述第一指定數(shù)據(jù)包括以下幾種數(shù)據(jù)中的至少一種:
字符串列表區(qū)段string_ids、數(shù)據(jù)類型列表區(qū)段type_ids、方法原型列表區(qū)段proto_ids、類成員列表區(qū)段field_ids、方法列表區(qū)段method_ids、類列表區(qū)段class_defs、數(shù)據(jù)區(qū)區(qū)段data。
優(yōu)選的,如上所述的方法,所述第一內(nèi)存為一段連續(xù)的內(nèi)存空間。
優(yōu)選的,如上所述的方法,所述第一指定數(shù)據(jù)的種類大于一種,所述第一內(nèi)存至少包括兩段不連續(xù)的內(nèi)存空間,不連續(xù)的第一內(nèi)存空間的段數(shù)不大于第一指定數(shù)據(jù)的種類數(shù)。
優(yōu)選的,如上所述的方法,完成解析后的dex文件的加載后,還包括:
刪除所述第二內(nèi)存中的dex文件的文件頭header中的第二指定數(shù)據(jù)。
優(yōu)選的,如上所述的方法,所述第二指定數(shù)據(jù)包括以下數(shù)據(jù)中的至少一種:
魔數(shù)字段magic、校驗(yàn)碼字段checksum、簽名字段signature、文件總長度字段fileSize、文件頭長度字段header_size、字節(jié)順序常量標(biāo)識(shí)字段endian_tag、map數(shù)據(jù)基地址字段map_off。
本發(fā)明的實(shí)例中還公開了一種dex文件的存儲(chǔ)裝置,該裝置包括:
指定數(shù)據(jù)提取模塊,用于解析待加載的dex文件,提取解析后的dex文件的非文件頭header中的第一指定數(shù)據(jù);
內(nèi)存申請(qǐng)模塊,用于申請(qǐng)第一內(nèi)存和第二內(nèi)存,所述第一內(nèi)存用于存儲(chǔ)所述第一指定數(shù)據(jù),所述第二內(nèi)存用于存儲(chǔ)dex文件中除第一指定數(shù)據(jù)之外的其他數(shù)據(jù);所述第一內(nèi)存和第二內(nèi)存不連續(xù);
文件頭修改模塊,用于根據(jù)所述第一內(nèi)存的內(nèi)存地址信息,修改dex文件的文件頭header中所述第一指定數(shù)據(jù)的偏移地址,使其指向第一內(nèi)存。
優(yōu)選的,如上所述的裝置,還包括:
Dex內(nèi)存加載模塊,用于在完成文件頭header中所述第一指定數(shù)據(jù)的偏移地址的修改后,根據(jù)修改后的dex文件的文件頭header信息,完成解析后的dex文件的加載,將所述第一指定數(shù)據(jù)加載到第一內(nèi)存中,將所述其它數(shù)據(jù)加載到第二內(nèi)存中。
優(yōu)選的,如上所述的裝置,所述第一指定數(shù)據(jù)包括以下幾種數(shù)據(jù)中的至少一種:
字符串列表區(qū)段string_ids、數(shù)據(jù)類型列表區(qū)段type_ids、方法原型列表區(qū)段proto_ids、類成員列表區(qū)段field_ids、方法列表區(qū)段method_ids、類列表區(qū)段class_defs、數(shù)據(jù)區(qū)區(qū)段data。
優(yōu)選的,如上所述的裝置,所述第一內(nèi)存為一段連續(xù)的內(nèi)存空間。
優(yōu)選的,如上所述的裝置,所述內(nèi)存申請(qǐng)模塊包括:
多內(nèi)存申請(qǐng)單元,用于在所述第一指定數(shù)據(jù)的種類大于一種時(shí),申請(qǐng)至少兩段不連續(xù)的內(nèi)存空間,其中,不連續(xù)的第一內(nèi)存空間的段數(shù)不大于第一指定數(shù)據(jù)的種類數(shù)。
優(yōu)選的,如上所述的裝置,還包括:
文件頭數(shù)據(jù)刪除模塊,用于在完成解析后的dex文件的加載后,刪除所述第二內(nèi)存中的dex文件的文件頭header中的第二指定數(shù)據(jù)。
優(yōu)選的,如上所述的裝置,所述第二指定數(shù)據(jù)包括以下數(shù)據(jù)中的至少一種:
魔數(shù)字段magic、校驗(yàn)碼字段checksum、簽名字段signature、文件總長度字段fileSize、文件頭長度字段header_size、字節(jié)順序常量標(biāo)識(shí)字段endian_tag、map數(shù)據(jù)基地址字段map_off。
本發(fā)明的有益效果在于:本發(fā)明實(shí)施例中所提供的dex文件的存儲(chǔ)方法和裝置,通過將dex文件中的數(shù)據(jù)分別存儲(chǔ)到不同的內(nèi)存空間中,解決了現(xiàn)有技術(shù)中通過dex內(nèi)存提取工具即dexdump工具從dex文件的起始地址提取大小為dex文件總大小的數(shù)據(jù),來提取到完整dex文件的問題,該方案由于無法提取到完整的dex內(nèi)容,防止了從內(nèi)存中提取dex文件,有效避免了dex文件的動(dòng)態(tài)反編譯,提高了dex文件動(dòng)態(tài)加載的安全性。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,附圖僅限于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是本發(fā)明的限制,且對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為安卓的classes.dex文件的結(jié)構(gòu)示意圖;
圖2為本發(fā)明一個(gè)實(shí)施例中的一種dex文件的存儲(chǔ)方法的流程示意圖;
圖3為本發(fā)明的一個(gè)實(shí)施例中一種dex文件的存儲(chǔ)方法的流程示意圖;
圖4為本發(fā)明一個(gè)實(shí)施例中將dex文件存儲(chǔ)到內(nèi)存后的dex文件的結(jié)構(gòu)示意圖;
圖5為本發(fā)明一個(gè)實(shí)施例中的一種dex文件的存儲(chǔ)方法的流程示意圖;
圖6為本發(fā)明一個(gè)實(shí)施例中一種dex文件的存儲(chǔ)裝置的結(jié)構(gòu)示意圖;
圖7為本發(fā)明一個(gè)實(shí)施例中一種dex文件的存儲(chǔ)裝置的結(jié)構(gòu)示意圖;
圖8為本發(fā)明一個(gè)實(shí)施例中一種dex文件的存儲(chǔ)裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,均屬于本發(fā)明保護(hù)的范圍。
圖2示出了本發(fā)明的一個(gè)實(shí)施例中提供的一種dex文件的存儲(chǔ)方法的流程示意圖,該方法主要可以包括以下步驟:
步驟S110:解析待加載的dex文件,提取解析后的dex文件的非文件頭header中的第一指定數(shù)據(jù);
步驟S120:申請(qǐng)不連續(xù)的第一內(nèi)存空間和第二內(nèi)存空間,第一內(nèi)存用于存儲(chǔ)所述第一指定數(shù)據(jù),所述第二內(nèi)存用于存儲(chǔ)dex文件中除第一指定數(shù)據(jù)之外的其他數(shù)據(jù);
步驟S130:根據(jù)所述第一內(nèi)存的內(nèi)存地址信息,修改dex文件的文件頭header中所述第一指定數(shù)據(jù)的偏移地址,使其指向第一內(nèi)存。
為了實(shí)現(xiàn)安卓classes.dex文件的動(dòng)態(tài)加載,首先需要將dex文件進(jìn)行底層的解析與加載,將dex文件的各部分內(nèi)容加載到內(nèi)存中,再通過底層與上層之間的通信調(diào)用,由dex類加載器完成上層的dex文件的動(dòng)態(tài)加載。
dex文件的文件組成主要包括dex文件頭header、索引區(qū)和數(shù)據(jù)區(qū)三個(gè)大部分,索引區(qū)即圖中所示的字符串列表區(qū)段string_ids、數(shù)據(jù)類型列表區(qū)段type_ids、方法原型列表區(qū)段proto_ids、類成員列表區(qū)段field_ids、方法列表區(qū)段method_ids和類列表區(qū)段class_defs,數(shù)據(jù)區(qū)即數(shù)據(jù)區(qū)區(qū)段data。
為了描述方便,本實(shí)施例中,將dex文件分為了文件頭header和非文件頭header兩大部分。
為了避免dex文件加載到內(nèi)存后存放在一段連續(xù)的內(nèi)存空間中,以至于能夠從dex文件的起始地址提取到完整的dex文件,本實(shí)施例中,首先解析待加載的dex文件后,提取出dex文件的非文件頭header中的第一指定數(shù)據(jù),即提取索引區(qū)和/或數(shù)據(jù)區(qū)中的指定數(shù)據(jù)段,并申請(qǐng)空間不連續(xù)的第一內(nèi)存和第二內(nèi)存,其中,第一內(nèi)存用于存儲(chǔ)所述第一指定數(shù)據(jù),所述第二內(nèi)存用于存儲(chǔ)dex文件中除第一指定數(shù)據(jù)之外的其他數(shù)據(jù)。
為了保證后續(xù)能夠?qū)崿F(xiàn)dex文件的正常解析與加載,在完成第一內(nèi)存和第二內(nèi)存的申請(qǐng)后,根據(jù)所述第一內(nèi)存的內(nèi)存地址信息,修改dex文件的文件頭header中所述第一指定數(shù)據(jù)的偏移地址,使其指向所述第一內(nèi)存。通過該方式,在將dex文件的各部分內(nèi)容加載到內(nèi)存中時(shí),便可以根據(jù)修改后的文件頭header中各部分的偏移地址和數(shù)據(jù)長度信息等,完成dex向內(nèi)存中的加載。
本實(shí)施例中所提供的所述dex文件的存儲(chǔ)方法,通過為dex文件中的內(nèi)容分配兩塊獨(dú)立的內(nèi)存空間,在加載時(shí),將所述指定數(shù)據(jù)和其它數(shù)據(jù)分別加載到不同的獨(dú)立內(nèi)存中,使得即使通過dex文件的起始地址提取dex文件中大小filesize大小的數(shù)據(jù),也只能夠得到第二內(nèi)存中的dex數(shù)據(jù),并不能得到所述第一指定數(shù)據(jù),因此無法得到完整的dex文件,避免了dex文件被提取和篡改。
在本發(fā)明的一個(gè)實(shí)施例中,所述第一指定數(shù)據(jù)包括以下幾種數(shù)據(jù)中的至少一種:字符串列表區(qū)段string_ids、數(shù)據(jù)類型列表區(qū)段type_ids、方法原型列表區(qū)段proto_ids、類成員列表區(qū)段field_ids、方法列表區(qū)段method_ids、類列表區(qū)段class_defs、數(shù)據(jù)區(qū)區(qū)段data。
即所述第一指定數(shù)據(jù)可以為非文件頭header中的任意部分,第一指定數(shù)據(jù)可以根據(jù)實(shí)際需要進(jìn)行選擇,可以是一種或多種,如可以只是字符串列表區(qū)段string_ids,也可以是上述字段中的所有數(shù)據(jù)。
在本發(fā)明的一個(gè)實(shí)施例中,所述第一內(nèi)存的個(gè)數(shù)可以為一段連續(xù)的內(nèi)存空間一個(gè),即無論指定數(shù)據(jù)是一種還是多種,所提取出的第一指定數(shù)據(jù)加載時(shí)均加載到一段塊連續(xù)第一內(nèi)存空間中。
在本發(fā)明的另一個(gè)實(shí)施例中,若所述第一指定數(shù)據(jù)的種類大于一種,所述第一內(nèi)存可以至少包括兩段不連續(xù)的內(nèi)存空間,不連續(xù)的第一內(nèi)存空間的段數(shù)不大于第一指定數(shù)據(jù)的種類數(shù)。
即當(dāng)?shù)谝恢付〝?shù)據(jù)的種類為兩種或者兩種以上時(shí),可以根據(jù)數(shù)據(jù)的種類數(shù)分配段數(shù)小于第一數(shù)據(jù)種類數(shù)的若干個(gè)不連續(xù)的內(nèi)存空間,將第一指定數(shù)據(jù)分開存儲(chǔ)于多段不連續(xù)的內(nèi)存空間中,具體將哪種或哪幾種存于哪一段內(nèi)存空間中,可以根據(jù)需要設(shè)定。在本發(fā)明的一個(gè)實(shí)施例中,不連續(xù)的第一內(nèi)存空間的段數(shù)等于所述第一指定數(shù)據(jù)的種類數(shù),此時(shí),每一個(gè)種類的數(shù)據(jù)分別對(duì)應(yīng)于各自獨(dú)立的一段第一內(nèi)存中,進(jìn)一步提高了從內(nèi)存中dump完整dex文件的難度。
該實(shí)施例中,所述根據(jù)所述第一內(nèi)存的內(nèi)存地址信息,修改dex文件的文件頭header中所述第一指定數(shù)據(jù)的偏移地址,使其指向第一內(nèi)存,指的即是分別修改文件頭中每種第一指定數(shù)據(jù)的偏移地址,使每種第一指定數(shù)據(jù)的偏移地址指向各自對(duì)應(yīng)的第一內(nèi)存。
需要的說明的是,本實(shí)施例中,所述種類是指dex文件中的區(qū)段,一個(gè)區(qū)段中的記為一個(gè)種類。如第一指定數(shù)據(jù)為字符串列表區(qū)段string_ids和數(shù)據(jù)類型列表區(qū)段type_ids,則第一指令數(shù)據(jù)為兩種。
在本發(fā)明的一個(gè)實(shí)施例中,如圖3所示,所述dex文件的存儲(chǔ)方法還可以包括:
步驟S140:根據(jù)修改后的dex文件的文件頭header信息,完成解析后的dex文件的加載,將所述第一指定數(shù)據(jù)加載到第一內(nèi)存中,將所述其它數(shù)據(jù)加載到第二內(nèi)存中。
通過該步驟,完成了dex文件中各部分內(nèi)容向內(nèi)存的加載。由于第一指定數(shù)據(jù)部分和其它數(shù)據(jù)部分分別加載到了不連續(xù)的第一內(nèi)存空間和第二內(nèi)存空間中,因此,dex文件內(nèi)存提取工具即dexdump工具無法根據(jù)dex文件的起始地址和文件大小從內(nèi)存中提取到完整的dex文件。
圖4示出了本發(fā)明一個(gè)實(shí)施例中第一指定數(shù)據(jù)加載到內(nèi)存中的結(jié)構(gòu)示意圖,該實(shí)施例中,所述第一指定數(shù)據(jù)包括了除文件頭header區(qū)段外的所有其他區(qū)段中的全部數(shù)據(jù),即包括了字符串列表區(qū)段string_ids、數(shù)據(jù)類型列表區(qū)段type_ids、方法原型列表區(qū)段proto_ids、類成員列表區(qū)段field_ids、方法列表區(qū)段method_ids、類列表區(qū)段class_defs和數(shù)據(jù)區(qū)區(qū)段data,此時(shí),第一指定數(shù)據(jù)共包括了7個(gè)數(shù)據(jù)區(qū)段,因此,可以申請(qǐng)七塊第一內(nèi)存空間,每個(gè)區(qū)段的數(shù)據(jù)對(duì)應(yīng)一個(gè)內(nèi)存空間,完成內(nèi)存空間的申請(qǐng)與分配后,根據(jù)分配結(jié)果修改文件頭中各數(shù)據(jù)區(qū)段對(duì)應(yīng)的偏移地址,使各區(qū)段的偏移地址Off分別指向各自的內(nèi)存地址,如圖4中所示。之后,在將dex文件加載到各自獨(dú)立的內(nèi)存中時(shí),便可以根據(jù)修改后的文件頭header中對(duì)應(yīng)各區(qū)段的偏移地址,如對(duì)于方法原型列表區(qū)段proto_ids的數(shù)據(jù),根據(jù)修改后的文件頭中其偏移地址proto_ids Off和長度信息(圖中未示出),便可以將其加載到對(duì)應(yīng)的第一內(nèi)存中。
采用該實(shí)施例中的方案,通過dexdump工具從classes.dex的起始地址dump fileSize大小的內(nèi)容時(shí),除了header還在外,別的內(nèi)容都已經(jīng)不在了,因此,無法得到完整的dex文件,從而達(dá)到防止classes.dex被內(nèi)存dump的目的。
在本發(fā)明的一個(gè)實(shí)施例中,如圖5所示,所述存儲(chǔ)方法還可以包括:
步驟S150:完成解析后的dex文件的加載后,刪除所述第二內(nèi)存中的dex文件的文件頭header中的第二指定數(shù)據(jù)。
其中,所述第二指定數(shù)據(jù)包括以下數(shù)據(jù)中的至少一種:
魔數(shù)字段magic、校驗(yàn)碼字段checksum、簽名字段signature、文件總長度字段fileSize、文件頭長度字段header_size、字節(jié)順序常量標(biāo)識(shí)字段endian_tag、map數(shù)據(jù)基地址字段map_off。
本實(shí)施例中,通過在完成dex文件向內(nèi)存的加載后,刪除內(nèi)存中文件頭header中的第二指定數(shù)據(jù),使得dex文件內(nèi)存提取工具無法找到所述第二指定數(shù)據(jù),進(jìn)一步保障了內(nèi)存中dex文件的安全。
對(duì)應(yīng)于圖2中所示的dex文件加載方法,本發(fā)明的實(shí)施例中還提供了一種dex文件的存儲(chǔ)裝置,如圖6所示,該裝置包括指定數(shù)據(jù)提取模塊110、內(nèi)存申請(qǐng)模塊120和文件頭修改模塊130。
指定數(shù)據(jù)提取模塊110,用于解析待加載的dex文件,提取解析后的dex文件的非文件頭header中的第一指定數(shù)據(jù);
內(nèi)存申請(qǐng)模塊120,用于申請(qǐng)第一內(nèi)存和第二內(nèi)存,所述第一內(nèi)存用于存儲(chǔ)所述第一指定數(shù)據(jù),所述第二內(nèi)存用于存儲(chǔ)dex文件中除第一指定數(shù)據(jù)之外的其他數(shù)據(jù);所述第一內(nèi)存和第二內(nèi)存不連續(xù);
文件頭修改模塊130,用于根據(jù)所述第一內(nèi)存的內(nèi)存地址信息,修改dex文件的文件頭header中所述第一指定數(shù)據(jù)的偏移地址,使其指向第一內(nèi)存。
在本發(fā)明的一個(gè)實(shí)施例中,所述裝置還可以包括Dex內(nèi)存加載模塊140,如圖7所示。
所述Dex內(nèi)存加載模塊140,用于在完成文件頭header中所述第一指定數(shù)據(jù)的偏移地址的修改后,根據(jù)修改后的dex文件的文件頭header信息,完成解析后的dex文件的加載,將所述第一指定數(shù)據(jù)加載到第一內(nèi)存中,將所述其它數(shù)據(jù)加載到第二內(nèi)存中。
在實(shí)際操作中,所述第一指定數(shù)據(jù)可以為非文件頭中的其它任何部分的數(shù)據(jù),即dex文件的索引區(qū)和/或數(shù)據(jù)區(qū)的任意一個(gè)或多個(gè)數(shù)據(jù)段,即所述指定數(shù)據(jù)包括以下幾種數(shù)據(jù)中的至少一種:
字符串列表區(qū)段string_ids、數(shù)據(jù)類型列表區(qū)段type_ids、方法原型列表區(qū)段proto_ids、類成員列表區(qū)段field_ids、方法列表區(qū)段method_ids、類列表區(qū)段class_defs、數(shù)據(jù)區(qū)區(qū)段data。
在本發(fā)明的一個(gè)實(shí)施例中,所述第一內(nèi)存為一段連續(xù)的內(nèi)存空間。即不論指定數(shù)據(jù)包括幾部分?jǐn)?shù)據(jù)區(qū)段的數(shù)據(jù),提取出的所有指定數(shù)據(jù)加載時(shí)均加載到一塊連續(xù)的第一內(nèi)存空間中。
在本發(fā)明的一個(gè)實(shí)施例中,所述內(nèi)存申請(qǐng)模塊120還可以包括多內(nèi)存申請(qǐng)單元,所述多內(nèi)存申請(qǐng)單元,用于在所述第一指定數(shù)據(jù)的種類大于一種時(shí),申請(qǐng)至少兩段不連續(xù)的內(nèi)存空間,其中,不連續(xù)的第一內(nèi)存空間的段數(shù)不大于第一指定數(shù)據(jù)的種類數(shù)。
該實(shí)施例中,根據(jù)第一指定數(shù)據(jù)所在的數(shù)據(jù)段的個(gè)數(shù),申請(qǐng)數(shù)量不大于第一指定數(shù)據(jù)的種類數(shù)的多段不連續(xù)的第一內(nèi)存,可以將不同數(shù)據(jù)段的第一指定數(shù)據(jù)分開加載到若干個(gè)不連續(xù)的第一內(nèi)存空間中,通過該方案,進(jìn)一步提高了從內(nèi)存中提取dex文件的難度。
在本發(fā)明的一個(gè)實(shí)施例中,所述裝置還可以包括文件頭數(shù)據(jù)刪除模塊150,如圖8所示。
所述文件頭數(shù)據(jù)刪除模塊150,用于在完成解析后的dex文件的加載后,刪除所述第二內(nèi)存中的dex文件的文件頭header中的第二指定數(shù)據(jù)。
本實(shí)施例中,通過在完成dex文件向內(nèi)存的加載后,刪除內(nèi)存中文件頭header中的第二指定數(shù)據(jù),使得dex文件內(nèi)存提取工具無法找到所述第二指定數(shù)據(jù),進(jìn)一步保障了內(nèi)存中dex文件的安全。
在本發(fā)明的一個(gè)實(shí)施例中,所述第二指定數(shù)據(jù)包括以下數(shù)據(jù)中的至少一種:
魔數(shù)字段magic、校驗(yàn)碼字段checksum、簽名字段signature、文件總長度字段fileSize、文件頭長度字段header_size、字節(jié)順序常量標(biāo)識(shí)字段endian_tag、map數(shù)據(jù)基地址字段map_off。
需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。
本說明書中的各個(gè)實(shí)施例均采用相關(guān)的方式描述,各個(gè)實(shí)施例之間相同相似的部分互相參見即可,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于裝置實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述裝置實(shí)施方式中各部分的全部或部分可以以硬件實(shí)現(xiàn),或者以在一個(gè)或多個(gè)硬件上運(yùn)行的軟件模塊來實(shí)現(xiàn),方法實(shí)施方式中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成。本領(lǐng)域技術(shù)人員應(yīng)該明白,本發(fā)明所述的方法和裝置并不限于具體實(shí)施方式中所述的實(shí)施例,上面的具體描述只是為了解釋本發(fā)明的目的,并非用于限制本發(fā)明。本領(lǐng)域技術(shù)人員根據(jù)本發(fā)明的技術(shù)方案得出其他的實(shí)施方式,同樣屬于本發(fā)明的技術(shù)創(chuàng)新范圍,本發(fā)明的保護(hù)范圍由權(quán)利要求及其等同物限定。
本發(fā)明的實(shí)例中公開了:A1、一種dex文件的存儲(chǔ)方法,所述方法包括:
解析待加載的dex文件,提取解析后的dex文件的非文件頭header中的第一指定數(shù)據(jù);
申請(qǐng)第一內(nèi)存和第二內(nèi)存,所述第一內(nèi)存用于存儲(chǔ)所述第一指定數(shù)據(jù),所述第二內(nèi)存用于存儲(chǔ)dex文件中除第一指定數(shù)據(jù)之外的其他數(shù)據(jù);所述第一內(nèi)存和第二內(nèi)存不連續(xù);
根據(jù)所述第一內(nèi)存的內(nèi)存地址信息,修改dex文件的文件頭header中所述第一指定數(shù)據(jù)的偏移地址,使其指向第一內(nèi)存。
A2、根據(jù)A1所述的方法,完成文件頭header中所述第一指定數(shù)據(jù)的偏移地址的修改后,還包括:
根據(jù)修改后的dex文件的文件頭header信息,完成解析后的dex文件的加載,將所述第一指定數(shù)據(jù)加載到第一內(nèi)存中,將所述其它數(shù)據(jù)加載到第二內(nèi)存中。
A3、根據(jù)A1或A2所述的方法,所述第一指定數(shù)據(jù)包括以下幾種數(shù)據(jù)中的至少一種:
字符串列表區(qū)段string_ids、數(shù)據(jù)類型列表區(qū)段type_ids、方法原型列表區(qū)段proto_ids、類成員列表區(qū)段field_ids、方法列表區(qū)段method_ids、類列表區(qū)段class_defs、數(shù)據(jù)區(qū)區(qū)段data。
A4、根據(jù)A3所述的方法,所述第一內(nèi)存為一段連續(xù)的內(nèi)存空間。
A5、根據(jù)A3所述的方法,所述第一指定數(shù)據(jù)的種類大于一種,所述第一內(nèi)存至少包括兩段不連續(xù)的內(nèi)存空間,不連續(xù)的第一內(nèi)存空間的段數(shù)不大于第一指定數(shù)據(jù)的種類數(shù)。
A6、根據(jù)A2所述的方法,完成解析后的dex文件的加載后,還包括:
刪除所述第二內(nèi)存中的dex文件的文件頭header中的第二指定數(shù)據(jù)。
A7、根據(jù)A6所述的方法,所述第二指定數(shù)據(jù)包括以下數(shù)據(jù)中的至少一種:
魔數(shù)字段magic、校驗(yàn)碼字段checksum、簽名字段signature、文件總長度字段fileSize、文件頭長度字段header_size、字節(jié)順序常量標(biāo)識(shí)字段endian_tag、map數(shù)據(jù)基地址字段map_off。
本發(fā)明的實(shí)施例中還公開:B8、一種dex文件的存儲(chǔ)裝置,所述裝置包括:
指定數(shù)據(jù)提取模塊,用于解析待加載的dex文件,提取解析后的dex文件的非文件頭header中的第一指定數(shù)據(jù);
內(nèi)存申請(qǐng)模塊,用于申請(qǐng)第一內(nèi)存和第二內(nèi)存,所述第一內(nèi)存用于存儲(chǔ)所述第一指定數(shù)據(jù),所述第二內(nèi)存用于存儲(chǔ)dex文件中除第一指定數(shù)據(jù)之外的其他數(shù)據(jù);所述第一內(nèi)存和第二內(nèi)存不連續(xù);
文件頭修改模塊,用于根據(jù)所述第一內(nèi)存的內(nèi)存地址信息,修改dex文件的文件頭header中所述第一指定數(shù)據(jù)的偏移地址,使其指向第一內(nèi)存。
B9、根據(jù)B8所述的裝置,該裝置還包括:
Dex內(nèi)存加載模塊,用于在完成文件頭header中所述第一指定數(shù)據(jù)的偏移地址的修改后,根據(jù)修改后的dex文件的文件頭header信息,完成解析后的dex文件的加載,將所述第一指定數(shù)據(jù)加載到第一內(nèi)存中,將所述其它數(shù)據(jù)加載到第二內(nèi)存中。
B10、根據(jù)B8或B9所述的裝置,所述第一指定數(shù)據(jù)包括以下幾種數(shù)據(jù)中的至少一種:
字符串列表區(qū)段string_ids、數(shù)據(jù)類型列表區(qū)段type_ids、方法原型列表區(qū)段proto_ids、類成員列表區(qū)段field_ids、方法列表區(qū)段method_ids、類列表區(qū)段class_defs、數(shù)據(jù)區(qū)區(qū)段data。
B11、根據(jù)B10所述的裝置,所述第一內(nèi)存為一段連續(xù)的內(nèi)存空間。
B12、根據(jù)B10所述的裝置,所述內(nèi)存申請(qǐng)模塊包括:
多內(nèi)存申請(qǐng)單元,用于在所述第一指定數(shù)據(jù)的種類大于一種時(shí),申請(qǐng)至少兩段不連續(xù)的內(nèi)存空間,其中,不連續(xù)的第一內(nèi)存空間的段數(shù)不大于第一指定數(shù)據(jù)的種類數(shù)。。
B13、根據(jù)B9所述的裝置,該裝置還包括:
文件頭數(shù)據(jù)刪除模塊,用于在完成解析后的dex文件的加載后,刪除所述第二內(nèi)存中的dex文件的文件頭header中的第二指定數(shù)據(jù)。
B14、根據(jù)B13所述的裝置,其特征在于,所述第二指定數(shù)據(jù)包括以下數(shù)據(jù)中的至少一種:
魔數(shù)字段magic、校驗(yàn)碼字段checksum、簽名字段signature、文件總長度字段fileSize、文件頭長度字段header_size、字節(jié)順序常量標(biāo)識(shí)字段endian_tag、map數(shù)據(jù)基地址字段map_off。
顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其同等技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。