本申請(qǐng)涉及計(jì)算機(jī)
技術(shù)領(lǐng)域:
:,尤其涉及一種應(yīng)用程序的處理方法及裝置。
背景技術(shù):
::程序語(yǔ)言通常是解釋性語(yǔ)言,如java程序語(yǔ)言、c程序語(yǔ)言等。在編譯的過程中,很多程序語(yǔ)言編寫的源程序代碼需要編譯成某種中間代碼,例如,java語(yǔ)言編寫的源程序代碼可編譯為一種“字節(jié)碼”形式的中間代碼。在中間代碼中會(huì)包含很多源程序代碼的信息,例如方法名、變量名等,這樣就使得中間代碼的反編譯變得非常容易,從而造成應(yīng)用程序的程序代碼的泄露或篡改。為了保護(hù)應(yīng)用程序的應(yīng)用版權(quán)等,就需要對(duì)應(yīng)用程序進(jìn)行保護(hù)。應(yīng)用程序加殼是極其普遍的應(yīng)用程序保護(hù)方式,即編寫程序代碼,并將該程序代碼設(shè)置在應(yīng)用程序的程序代碼外,設(shè)置在外層的程序代碼在待保護(hù)的程序代碼(或應(yīng)用程序)前執(zhí)行,以便執(zhí)行其中的解密程序代碼、反調(diào)試等操作,完成上述操作后,再執(zhí)行待保護(hù)的應(yīng)用程序(或其程序代碼),這樣,通過在待保護(hù)的程序代碼外層增加包含解密程序代碼、反調(diào)試等操作的程序代碼來對(duì)應(yīng)用程序進(jìn)行保護(hù)。然而,應(yīng)用程序加殼的方式盡管可以有效的阻止對(duì)待保護(hù)的應(yīng)用程序的靜態(tài)分析,但是,由于解密后的待保護(hù)的程序代碼最終要在內(nèi)存中執(zhí)行,因此,只要用戶能夠在內(nèi)存中找到解密后的待保護(hù)的程序代碼的地址,即可獲取待保護(hù)的程序代碼,因此,對(duì)于對(duì)待保護(hù)的應(yīng)用程序的動(dòng)態(tài)分析,應(yīng)用程序加殼的方式卻無法阻止,應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn)依然存在,從而使得應(yīng)用程序的程序代碼的安全性低下。技術(shù)實(shí)現(xiàn)要素:本申請(qǐng)實(shí)施例的目的是提供一種應(yīng)用程序的處理方法及裝置,以解決現(xiàn)有技術(shù)中存在的應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),從而使得應(yīng)用程序的程序代碼的安全性低下的問題。為解決上述技術(shù)問題,本申請(qǐng)實(shí)施例是這樣實(shí)現(xiàn)的:本申請(qǐng)實(shí)施例提供的一種應(yīng)用程序的處理方法,所述方法包括:獲取待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù);從所述預(yù)定程序數(shù)據(jù)中獲取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù);基于所述控制流數(shù)據(jù)、所述預(yù)定程序數(shù)據(jù)和所述預(yù)定程序函數(shù)對(duì)所述待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,得到目標(biāo)應(yīng)用程序的數(shù)據(jù),所述控制流混淆處理能夠使得所述控制流數(shù)據(jù)在所述待保護(hù)的應(yīng)用程序中被混淆??蛇x地,所述從所述預(yù)定程序數(shù)據(jù)中獲取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù),包括:將所述預(yù)定程序數(shù)據(jù)轉(zhuǎn)換為預(yù)定程序語(yǔ)言的目標(biāo)程序數(shù)據(jù);從所述目標(biāo)程序數(shù)據(jù)中提取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù)??蛇x地,所述基于所述控制流數(shù)據(jù)、所述預(yù)定程序數(shù)據(jù)和所述預(yù)定程序函數(shù)對(duì)所述待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,得到目標(biāo)應(yīng)用程序的數(shù)據(jù),包括:將所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)輸入所述預(yù)定程序函數(shù)中,得到返回值;基于所述返回值確定相應(yīng)的統(tǒng)一控制流函數(shù);將所述控制流數(shù)據(jù)輸入到所述統(tǒng)一控制流函數(shù)中,以通過所述統(tǒng)一控制流函數(shù)能夠調(diào)用所述控制流數(shù)據(jù);根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)和所述控制流數(shù)據(jù)生成目標(biāo)應(yīng)用程序的數(shù)據(jù)??蛇x地,所述方法還包括:為每個(gè)控制流數(shù)據(jù)設(shè)置相應(yīng)的索引,以標(biāo)記所述控制流數(shù)據(jù)所對(duì)應(yīng)的函數(shù)類型;相應(yīng)地,所述根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)和所述控制流數(shù)據(jù)生成目標(biāo)應(yīng)用程序的數(shù)據(jù),包括:根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)、所述控制流數(shù)據(jù)和所述索引生成目標(biāo)應(yīng)用程序的數(shù)據(jù)。可選地,所述待保護(hù)的應(yīng)用程序?yàn)榛赼ndroid操作系統(tǒng)的應(yīng)用程序,所述預(yù)定程序數(shù)據(jù)為classes.dex文件中包含的程序數(shù)據(jù),所述目標(biāo)程序數(shù)據(jù)為基于smali程序語(yǔ)言的程序數(shù)據(jù)。本申請(qǐng)實(shí)施例提供的一種應(yīng)用程序的處理裝置,所述裝置包括:預(yù)定數(shù)據(jù)獲取模塊,用于獲取待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù);預(yù)定函數(shù)生成模塊,用于從所述預(yù)定程序數(shù)據(jù)中獲取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù);目標(biāo)數(shù)據(jù)獲取模塊,用于基于所述控制流數(shù)據(jù)、所述預(yù)定程序數(shù)據(jù)和所述預(yù)定程序函數(shù)對(duì)所述待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,得到目標(biāo)應(yīng)用程序的數(shù)據(jù),所述控制流混淆處理能夠使得所述控制流數(shù)據(jù)在所述待保護(hù)的應(yīng)用程序中被混淆??蛇x地,所述預(yù)定函數(shù)生成模塊,包括:轉(zhuǎn)換單元,用于將所述預(yù)定程序數(shù)據(jù)轉(zhuǎn)換為預(yù)定程序語(yǔ)言的目標(biāo)程序數(shù)據(jù);預(yù)定函數(shù)生成單元,用于從所述目標(biāo)程序數(shù)據(jù)中提取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù)??蛇x地,所述目標(biāo)數(shù)據(jù)獲取模塊,包括:返回值獲取單元,用于將所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)輸入所述預(yù)定程序函數(shù)中,得到返回值;統(tǒng)一函數(shù)確定單元,用于基于所述返回值確定相應(yīng)的統(tǒng)一控制流函數(shù);輸入單元,用于將所述控制流數(shù)據(jù)輸入到所述統(tǒng)一控制流函數(shù)中,以通過所述統(tǒng)一控制流函數(shù)能夠調(diào)用所述控制流數(shù)據(jù);目標(biāo)數(shù)據(jù)獲取單元,用于根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)和所述控制流數(shù)據(jù)生成目標(biāo)應(yīng)用程序的數(shù)據(jù)。可選地,所述裝置還包括:索引設(shè)置模塊,用于為每個(gè)控制流數(shù)據(jù)設(shè)置相應(yīng)的索引,以標(biāo)記所述控制流數(shù)據(jù)所對(duì)應(yīng)的函數(shù)類型;相應(yīng)地,所述目標(biāo)數(shù)據(jù)獲取單元,用于根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)、所述控制流數(shù)據(jù)和所述索引生成目標(biāo)應(yīng)用程序的數(shù)據(jù)??蛇x地,所述待保護(hù)的應(yīng)用程序?yàn)榛赼ndroid操作系統(tǒng)的應(yīng)用程序,所述預(yù)定程序數(shù)據(jù)為classes.dex文件中包含的程序數(shù)據(jù),所述目標(biāo)程序數(shù)據(jù)為基于smali程序語(yǔ)言的程序數(shù)據(jù)。由以上本申請(qǐng)實(shí)施例提供的技術(shù)方案可見,本申請(qǐng)實(shí)施例通過獲取的待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù),從中獲取控制流數(shù)據(jù),基于控制流數(shù)據(jù)生成預(yù)定程序函數(shù),然后,基于控制流數(shù)據(jù)、預(yù)定程序數(shù)據(jù)和預(yù)定程序函數(shù)對(duì)待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,以使控制流數(shù)據(jù)在待保護(hù)的應(yīng)用程序中被混淆,得到目標(biāo)應(yīng)用程序的數(shù)據(jù),這樣,預(yù)定程序數(shù)據(jù)在控制流程上無法再被反編譯出具體含義,降低了應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),同時(shí),由于生成的預(yù)定程序函數(shù)在控制流程上直接操作寄存器,對(duì)預(yù)定程序數(shù)據(jù)進(jìn)行反編譯后無法直接查看到應(yīng)用程序中真實(shí)的相應(yīng)程序代碼,進(jìn)一步降低了應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),提高應(yīng)用程序的程序代碼的安全性。附圖說明為了更清楚地說明本申請(qǐng)實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請(qǐng)中記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1為本申請(qǐng)一種應(yīng)用程序的處理方法實(shí)施例;圖2為本申請(qǐng)另一種應(yīng)用程序的處理方法實(shí)施例;圖3為本申請(qǐng)一種應(yīng)用程序的處理裝置實(shí)施例。具體實(shí)施方式本申請(qǐng)實(shí)施例提供一種應(yīng)用程序的處理方法及裝置。為了使本
技術(shù)領(lǐng)域:
:的人員更好地理解本申請(qǐng)中的技術(shù)方案,下面將結(jié)合本申請(qǐng)實(shí)施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本申請(qǐng)一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾?qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請(qǐng)保護(hù)的范圍。實(shí)施例一如圖1所示,本申請(qǐng)實(shí)施例提供一種應(yīng)用程序的處理方法,該方法的執(zhí)行主體可以為終端設(shè)備,其中,終端設(shè)備可以如個(gè)人計(jì)算機(jī)、手機(jī)或平板電腦等等。該方法可以用于對(duì)任何應(yīng)用程序的程序代碼進(jìn)行保護(hù),防止除開發(fā)者外的其它用戶對(duì)程序代碼的篡改等,該方法具體可以包括以下步驟:在步驟s101中,獲取待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù)。其中,待保護(hù)的應(yīng)用程序可以包括多種,例如,基于不同操作系統(tǒng)的應(yīng)用程序,具體如,基于windows操作系統(tǒng)的應(yīng)用程序、基于android操作系統(tǒng)的應(yīng)用程序或基于ios操作系統(tǒng)的應(yīng)用程序等,應(yīng)用程序也可以是任意的應(yīng)用程序,如即時(shí)通訊應(yīng)用、某游戲應(yīng)用或購(gòu)物應(yīng)用等。預(yù)定程序數(shù)據(jù)可以是待保護(hù)的應(yīng)用程序中包含的任意程序數(shù)據(jù),例如,全部或部分的程序代碼,或者,配置文件或資源文件中包含的數(shù)據(jù)等。本申請(qǐng)實(shí)施例中考慮到應(yīng)用程序中的程序代碼的重要性,預(yù)定程序數(shù)據(jù)可以為全部或部分的程序代碼。在實(shí)施中,為了使得本申請(qǐng)實(shí)施例中的具體處理可以更加詳細(xì)和具體,以下以基于android操作系統(tǒng)的應(yīng)用程序?yàn)槔?,基于android操作系統(tǒng)的應(yīng)用程序是基于java程序語(yǔ)言而編寫的可執(zhí)行程序,該應(yīng)用程序可以封裝成apk(androidpackage,android安裝包)文件,apk文件本質(zhì)為zip壓縮文件,其中主要包括以下多種類型的文件:classes.dex文件、so文件、androidmanifest.xml文件和其他資源文件(如圖片、xml文件等)等。其中,classes.dex文件是android操作系統(tǒng)中dalvik可執(zhí)行程序的文件,該classes.dex文件中包含所有的java源程序代碼經(jīng)過編譯后的字節(jié)碼。classes.dex文件中主要由以下多個(gè)部分組成:頭部(即其中的dexheader部分)、各種類型的表(即其中的table部分)和數(shù)據(jù)段(即其中的datasection部分),其中,頭部包含了每個(gè)部分或區(qū)域的大小及偏移信息,各種類型的表中可以包含各種數(shù)據(jù),如字符串表、類名表、函數(shù)表等,數(shù)據(jù)段中包含字節(jié)碼等信息,字節(jié)碼中可以通過上述表的索引來進(jìn)行編碼。基于android操作系統(tǒng)的應(yīng)用程序除了可以使用java程序語(yǔ)言編寫外,還可以使用c/c++程序語(yǔ)言進(jìn)行混合編寫,這樣就需要提供jni接口(javanativeinterface,java本地接口)。jni接口提供了允許通過c/c++程序語(yǔ)言操作java程序語(yǔ)言中的對(duì)象的機(jī)制,如設(shè)置某個(gè)java對(duì)象的域(即field)或調(diào)用java中的某函數(shù)(如method函數(shù)等)等。通過c/c++程序語(yǔ)言編寫的源程序代碼通過androidndk(nativedevelopmentkit,原生開發(fā)工具包)編譯為動(dòng)態(tài)庫(kù)即形成了so文件。當(dāng)開發(fā)人員或用戶編寫完成某應(yīng)用程序(即待保護(hù)的應(yīng)用程序)的所有程序代碼和文件后,可以將該應(yīng)用程序的所有程序代碼和文件封裝成apk文件,如果測(cè)試人員對(duì)該apk文件對(duì)應(yīng)的應(yīng)用程序進(jìn)行測(cè)試,并測(cè)試通過后,可以將該apk文件推送給用戶使用。在將該apk文件推送給用戶使用之前,可以先對(duì)應(yīng)用程序中的程序代碼進(jìn)行保護(hù),防止其中的java字節(jié)碼很容易被其它用戶反編譯,具體地,對(duì)于android操作系統(tǒng)的應(yīng)用程序來說,java字節(jié)碼主要存在于classes.dex文件中,因此,終端設(shè)備可以獲取上述apk文件中包含的classes.dex文件中的程序數(shù)據(jù)。技術(shù)人員或用戶可以預(yù)先指定需要重點(diǎn)保護(hù)的程序數(shù)據(jù)或程序代碼中的某一個(gè)或多個(gè)程序函數(shù)的數(shù)據(jù),然后,終端設(shè)備可以從classes.dex文件中的程序數(shù)據(jù)中選取滿足預(yù)先指定的上述條件的程序數(shù)據(jù)作為預(yù)定程序數(shù)據(jù),如程序代碼中的某一個(gè)程序函數(shù)的數(shù)據(jù)等。其中,程序函數(shù)的呈現(xiàn)形式通常如:func-name(para-type1para-type2para-type3...)return-type,其中的參數(shù)與參數(shù)之間沒有任何分隔符,例如,foo()v表示voidfoo()、foo(iii)z表示booleanfoo(int,int,int)、foo(z[i[iljava/lang/string;j]ljava/lang/string)表示stringfoo(boolean,int[],int[],string,long)等。其中,形如[xxx和lxxx/yyy為數(shù)組的表示方式,即數(shù)組的表示方式是:在基本數(shù)據(jù)類型前加上前中括號(hào)“[”,例如int數(shù)組和float數(shù)組分別表示為:[i和[f,對(duì)象的表示則以l作為開頭,格式可以是lpackagename/objectname;(注意必須有個(gè)分號(hào)跟在最后),例如string對(duì)象在smali程序語(yǔ)言中為:ljava/lang/string;,其中java/lang對(duì)應(yīng)java.lang包,string就是定義在該包中的一個(gè)對(duì)象。對(duì)于windows或ios操作系統(tǒng)的應(yīng)用程序的情況可以參見上述相關(guān)內(nèi)容,并結(jié)合實(shí)際情況處理,在此不再贅述。在步驟s102中,從所述預(yù)定程序數(shù)據(jù)中獲取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù)。其中,控制流數(shù)據(jù)可以包括多種,例如分支語(yǔ)句對(duì)應(yīng)的數(shù)據(jù)和/或循環(huán)語(yǔ)句對(duì)應(yīng)的數(shù)據(jù)和/或跳轉(zhuǎn)語(yǔ)句對(duì)應(yīng)的數(shù)據(jù)等,而分支語(yǔ)句又可以包括if語(yǔ)句、if-else語(yǔ)句、if-elseif-else語(yǔ)句和switch語(yǔ)句等,循環(huán)語(yǔ)句可以包括while循環(huán)語(yǔ)句、do-while循環(huán)語(yǔ)句和for循環(huán)語(yǔ)句等,跳轉(zhuǎn)語(yǔ)句可以包括break語(yǔ)句和continue語(yǔ)句等。預(yù)定程序函數(shù)可以根據(jù)實(shí)際情況設(shè)定,例如程序語(yǔ)言中常用的程序函數(shù),或者根據(jù)實(shí)際情況自行構(gòu)建的程序函數(shù)等,所述預(yù)定程序函數(shù)可以用于對(duì)控制流數(shù)據(jù)進(jìn)行混淆,為控制流混淆處理的控制因素。在實(shí)施中,考慮到控制流數(shù)據(jù)在應(yīng)用程序中往往能夠起到較重要的作用,而且,控制流數(shù)據(jù)通常也是應(yīng)用程序中的核心數(shù)據(jù),包括較多指令集,可用于對(duì)應(yīng)用程序的整個(gè)或部分執(zhí)行流程的控制,因此,可以將基于指令集控制流數(shù)據(jù)作為混淆對(duì)象,以打亂預(yù)定程序代碼中方法的執(zhí)行流程,基于此,從所述預(yù)定程序數(shù)據(jù)中查找控制流數(shù)據(jù)所在的位置,查找到其相應(yīng)位置后,可以將控制流數(shù)據(jù)所在的位置的上部和下部分別提取指定數(shù)據(jù)量的程序數(shù)據(jù)(即提取出包含控制流數(shù)據(jù)的程序代碼),例如,程序數(shù)據(jù)中if語(yǔ)句對(duì)應(yīng)的數(shù)據(jù)所在的程序代碼的片段等??梢曰谔崛〕龅陌刂屏鲾?shù)據(jù)的程序代碼構(gòu)建新的程序函數(shù)(即預(yù)定程序函數(shù))。其中,預(yù)定程序函數(shù)中可以包括一個(gè)或多個(gè)參數(shù),例如寄存器信息、索引信息等,本申請(qǐng)實(shí)施例對(duì)此不做限定。在步驟s103中,基于所述控制流數(shù)據(jù)、所述預(yù)定程序數(shù)據(jù)和所述預(yù)定程序函數(shù)對(duì)所述待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,得到目標(biāo)應(yīng)用程序的數(shù)據(jù)。其中,控制流混淆處理可以是對(duì)提取的包括控制流數(shù)據(jù)的程序數(shù)據(jù)進(jìn)行打亂、代碼混淆等處理,所述控制流混淆處理可以使得所述控制流數(shù)據(jù)在所述待保護(hù)的應(yīng)用程序中被混淆。在實(shí)施中,可以先將所述預(yù)定程序數(shù)據(jù)中的所述控制流數(shù)據(jù)進(jìn)行混淆處理,得到混淆處理后的預(yù)定程序數(shù)據(jù),具體如,可以預(yù)先根據(jù)所述預(yù)定程序函數(shù)等信息設(shè)置混淆處理機(jī)制,如打亂控制流數(shù)據(jù)的呈現(xiàn)形式,使得控制流數(shù)據(jù)對(duì)應(yīng)的程序代碼隨機(jī)排列等,基于該混淆處理機(jī)制可以對(duì)所述預(yù)定程序數(shù)據(jù)中的所述控制流數(shù)據(jù)進(jìn)行混淆處理,從而可以得到控制流數(shù)據(jù)對(duì)應(yīng)的程序代碼隨機(jī)排列的預(yù)定程序數(shù)據(jù)??梢詫⒃摶煜幚砗蟮念A(yù)定程序數(shù)據(jù)還原到所述待保護(hù)的應(yīng)用程序的程序數(shù)據(jù)中,然后,可以通過預(yù)定的編譯工具對(duì)上述程序數(shù)據(jù)進(jìn)行重新編譯,得到編譯后的程序數(shù)據(jù)得到目標(biāo)應(yīng)用程序的數(shù)據(jù),即編譯后的apk文件。本申請(qǐng)實(shí)施例提供一種應(yīng)用程序的處理方法,通過獲取的待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù),從中獲取控制流數(shù)據(jù),基于控制流數(shù)據(jù)生成預(yù)定程序函數(shù),然后,基于控制流數(shù)據(jù)、預(yù)定程序數(shù)據(jù)和預(yù)定程序函數(shù)對(duì)待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,以使控制流數(shù)據(jù)在待保護(hù)的應(yīng)用程序中被混淆,得到目標(biāo)應(yīng)用程序的數(shù)據(jù),這樣,預(yù)定程序數(shù)據(jù)在控制流程上無法再被反編譯出具體含義,降低了應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),同時(shí),由于生成的預(yù)定程序函數(shù)在控制流程上直接操作寄存器,對(duì)預(yù)定程序數(shù)據(jù)進(jìn)行反編譯后無法直接查看到應(yīng)用程序中真實(shí)的相應(yīng)程序代碼,進(jìn)一步降低了應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),提高應(yīng)用程序的程序代碼的安全性。實(shí)施例二如圖2所示,本申請(qǐng)實(shí)施例提供一種應(yīng)用程序的處理方法,該方法的執(zhí)行主體可以為終端設(shè)備,終端設(shè)備可以如個(gè)人計(jì)算機(jī)、手機(jī)或平板電腦等。該方法可以用于對(duì)任何應(yīng)用程序的程序代碼進(jìn)行保護(hù),防止除開發(fā)者外的其它用戶對(duì)程序代碼的篡改等,本申請(qǐng)實(shí)施例中以應(yīng)用程序?yàn)榛赼ndroid操作系統(tǒng)的應(yīng)用程序?yàn)槔M(jìn)行說明,對(duì)于其它應(yīng)用程序的情況,可以參見下述相關(guān)內(nèi)容,在此不再贅述。該方法具體可以包括以下步驟:在步驟s201中,獲取待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù)。其中,所述預(yù)定程序數(shù)據(jù)為classes.dex文件中包含的程序數(shù)據(jù),可以是classes.dex文件中任意一部分或多個(gè)不同部分的程序數(shù)據(jù)。上述步驟s201的步驟內(nèi)容與上述實(shí)施例一中的步驟s101的步驟內(nèi)容相同,步驟s201的處理可以參見步驟s101的相關(guān)內(nèi)容,在此不再贅述。在步驟s202中,將所述預(yù)定程序數(shù)據(jù)轉(zhuǎn)換為預(yù)定程序語(yǔ)言的目標(biāo)程序數(shù)據(jù)。其中,預(yù)定程序語(yǔ)言可以根據(jù)實(shí)際情況確定,例如可以是除java程序語(yǔ)言外的任一種程序語(yǔ)言,具體如c程序語(yǔ)言或c++程序語(yǔ)言等,在實(shí)際應(yīng)用中,預(yù)定程序語(yǔ)言也可以是java程序語(yǔ)言,本申請(qǐng)實(shí)施例對(duì)此不做限定。在實(shí)施中,基于android操作系統(tǒng)的應(yīng)用程序采用的是java程序語(yǔ)言進(jìn)行開發(fā),通常,android操作系統(tǒng)具有相應(yīng)的虛擬機(jī)dalvik,應(yīng)用程序中的程序代碼的編譯最終并不是采用的java程序語(yǔ)言中的class完成,而是使用smali程序語(yǔ)言完成。如果反編譯的是smali程序語(yǔ)言,則反編譯后的程序代碼可以被用戶正確理解,從而造成程序代碼的泄露。由于應(yīng)用程序中的程序代碼的編譯最終使用的是smali程序語(yǔ)言完成,因此,為了簡(jiǎn)化處理過程,可以將所述預(yù)定程序數(shù)據(jù)轉(zhuǎn)換為smali程序語(yǔ)言的目標(biāo)程序數(shù)據(jù)(即所述目標(biāo)程序數(shù)據(jù)為基于smali程序語(yǔ)言的程序數(shù)據(jù))。例如,獲取的待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù)如下:可以將上述預(yù)定程序數(shù)據(jù)轉(zhuǎn)換為smali程序語(yǔ)言的目標(biāo)程序數(shù)據(jù),得到的目標(biāo)程序數(shù)據(jù)可以如下:在步驟s203中,從所述目標(biāo)程序數(shù)據(jù)中提取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù)。上述步驟s203的處理過程可以參見上述實(shí)施例一中的相關(guān)內(nèi)容,基于上述步驟s202的示例,可以從上述目標(biāo)程序數(shù)據(jù)中選取if判斷的控制語(yǔ)句if-eqz所在的片段或部分作為控制流數(shù)據(jù),可以使用該控制流數(shù)據(jù)生成新的預(yù)先設(shè)定的hello1函數(shù)(即預(yù)定程序函數(shù)),具體內(nèi)容可以如下:在步驟s204中,將所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)輸入所述預(yù)定程序函數(shù)中,得到返回值。在實(shí)施中,由于控制流數(shù)據(jù)需要做程序代碼的打亂等處理,使得用戶無法確定該控制流數(shù)據(jù)的真實(shí)情況,為了能夠在正常使用控制流數(shù)據(jù)時(shí),可以及時(shí)執(zhí)行上述控制流數(shù)據(jù),可以設(shè)置用于調(diào)用該控制流數(shù)據(jù)的統(tǒng)一控制流函數(shù),該統(tǒng)一控制流函數(shù)中包括寄存器信息,為了確定該寄存器信息可以通過步驟s204的處理執(zhí)行,具體地,可以將預(yù)定程序數(shù)據(jù)中的控制流數(shù)據(jù)(或其對(duì)應(yīng)的程序代碼)去除,并將當(dāng)前寄存器中的所有內(nèi)容都輸入到生成的新的預(yù)先設(shè)定的hello1函數(shù)(即預(yù)定程序函數(shù))中,得到相應(yīng)的返回值。需要說明的是,預(yù)先設(shè)定的hello1函數(shù)生成的偽代碼可以如下:其中,makenewreg用于將預(yù)定程序數(shù)據(jù)的寄存器裝配到hello1函數(shù)的寄存器上,makenewbuf用于將預(yù)定程序數(shù)據(jù)的程序代碼裝配到hello1函數(shù)中,genretval用于處理hello1函數(shù)的返回值。hello1函數(shù)在處理寄存器的輸入與輸出時(shí),可以判斷各種寄存器內(nèi)容,并將基礎(chǔ)數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換成object類型,同時(shí)long與double數(shù)據(jù)類型為64位,可占用兩個(gè)寄存器。在步驟s205中,基于所述返回值確定相應(yīng)的統(tǒng)一控制流函數(shù)。在實(shí)施中,可以將通過上述步驟s204中得到的返回值賦值到統(tǒng)一控制流函數(shù)中的寄存器中,將該返回值作為其中的寄存器信息,這樣,即可得到用于調(diào)用控制流數(shù)據(jù)的統(tǒng)一控制流函數(shù)。其中,預(yù)定程序數(shù)據(jù)的偽代碼可以如下:.methodpublicstatichello([ljava/lang/object;]ljava/lang/object;callhello1//預(yù)定程序數(shù)據(jù)的程序代碼callcfg_fun(寄存器,index_1)//統(tǒng)一控制流函數(shù)。在步驟s206中,將所述控制流數(shù)據(jù)輸入到所述統(tǒng)一控制流函數(shù)中,以通過所述統(tǒng)一控制流函數(shù)能夠調(diào)用所述控制流數(shù)據(jù)。在實(shí)施中,將上述控制流數(shù)據(jù)對(duì)應(yīng)的程序代碼提取到上述得到的統(tǒng)一控制流函數(shù)中,其中寄存器信息為上述返回值,這樣,可以使用調(diào)用函數(shù)的方式調(diào)用控制流數(shù)據(jù)。此外,統(tǒng)一控制流函數(shù)還可以包括索引,可以用于標(biāo)記或確定所述控制流數(shù)據(jù)所對(duì)應(yīng)的函數(shù)類型,基于此,可以為每個(gè)控制流數(shù)據(jù)、每一條控制流數(shù)據(jù)或每一個(gè)控制流數(shù)據(jù)中的程序語(yǔ)句設(shè)置相應(yīng)的索引,從而標(biāo)記所述控制流數(shù)據(jù)所對(duì)應(yīng)的函數(shù)類型,以標(biāo)記每個(gè)控制流數(shù)據(jù)、每一條控制流數(shù)據(jù)或每一個(gè)控制流數(shù)據(jù)中的程序語(yǔ)句具體屬于哪一個(gè)程序函數(shù)?;诖?,其程序數(shù)據(jù)對(duì)應(yīng)的偽代碼可以如下:funcfg_fun(registers,index)//輸入對(duì)應(yīng)寄存器,與對(duì)應(yīng)索引switchindex:1:if-eqzv2,:cond_312:…3:…其中的switchindex,及其后續(xù)內(nèi)容為索引。通過上述方式生成調(diào)用所述控制流數(shù)據(jù)統(tǒng)一控制流函數(shù),使得待保護(hù)的應(yīng)用程序中的控制流數(shù)據(jù)被混淆或被隱藏,使得程序數(shù)據(jù)對(duì)應(yīng)的程序代碼的長(zhǎng)度縮短,減少了混淆所需的時(shí)間開銷,增加了程序代碼的語(yǔ)義復(fù)雜度,提高了程序代碼的隱蔽性。需要說明的是,統(tǒng)一控制流函數(shù)在處理控制流數(shù)據(jù)的跳轉(zhuǎn)時(shí),可以將所有轉(zhuǎn)換后的程序數(shù)據(jù)中的控制流數(shù)據(jù)提取到統(tǒng)一控制流函數(shù),其中,各種判斷語(yǔ)句與所有跳轉(zhuǎn)語(yǔ)句包括:if-eq、if-ne、if-lt、if-ge、if-gt、if-le、if-eqz、if-nez、if-ltz、if-gez、if-gtz、if-lez??梢愿鶕?jù)語(yǔ)義處理各種情況,同時(shí)調(diào)整語(yǔ)句還需要保留原始判斷參數(shù)、寄存器內(nèi)容和常量。在步驟s207中,根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)和所述控制流數(shù)據(jù)生成目標(biāo)應(yīng)用程序的數(shù)據(jù)。在實(shí)施中,終端設(shè)備中可以預(yù)先設(shè)置有smali工具,可以使用smali工具將通過上述修改后的基于smali程序語(yǔ)言的程序代碼(包括所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)和所述控制流數(shù)據(jù)對(duì)應(yīng)的程序代碼)編譯成新的classes.dex文件??梢酝ㄟ^編譯成的新的classes.dex文件,以及待保護(hù)的應(yīng)用程序中的其它數(shù)據(jù)或文件生成新的apk文件,或者,使用編譯成的新的classes.dex文件替換待保護(hù)的應(yīng)用程序中的classes.dex文件,得到新的apk文件,即可將apk文件的數(shù)據(jù)作為目標(biāo)應(yīng)用程序的數(shù)據(jù)。對(duì)于上述為每個(gè)控制流數(shù)據(jù)設(shè)置相應(yīng)的索引的處理,上述步驟s207的處理相應(yīng)的可以為:根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)、所述控制流數(shù)據(jù)和所述索引生成目標(biāo)應(yīng)用程序的數(shù)據(jù)。具體處理過程可以參見上述步驟s207的相關(guān)內(nèi)容,在此不再贅述。本申請(qǐng)實(shí)施例提供一種應(yīng)用程序的處理方法,通過獲取的待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù),從中獲取控制流數(shù)據(jù),基于控制流數(shù)據(jù)生成預(yù)定程序函數(shù),然后,基于控制流數(shù)據(jù)、預(yù)定程序數(shù)據(jù)和預(yù)定程序函數(shù)對(duì)待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,以使控制流數(shù)據(jù)在待保護(hù)的應(yīng)用程序中被混淆,得到目標(biāo)應(yīng)用程序的數(shù)據(jù),這樣,預(yù)定程序數(shù)據(jù)在控制流程上無法再被反編譯出具體含義,降低了應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),同時(shí),由于生成的預(yù)定程序函數(shù)在控制流程上直接操作寄存器,對(duì)預(yù)定程序數(shù)據(jù)進(jìn)行反編譯后無法直接查看到應(yīng)用程序中真實(shí)的相應(yīng)程序代碼,進(jìn)一步降低了應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),提高應(yīng)用程序的程序代碼的安全性。實(shí)施例三以上為本申請(qǐng)實(shí)施例提供的應(yīng)用程序的處理方法,基于同樣的思路,本申請(qǐng)實(shí)施例還提供一種應(yīng)用程序的處理裝置,如圖3所示。所述應(yīng)用程序的處理裝置包括:預(yù)定數(shù)據(jù)獲取模塊301、預(yù)定函數(shù)生成模塊302和目標(biāo)數(shù)據(jù)獲取模塊303,其中:預(yù)定數(shù)據(jù)獲取模塊301,用于獲取待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù);預(yù)定函數(shù)生成模塊302,用于從所述預(yù)定程序數(shù)據(jù)中獲取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù);目標(biāo)數(shù)據(jù)獲取模塊303,用于基于所述控制流數(shù)據(jù)、所述預(yù)定程序數(shù)據(jù)和所述預(yù)定程序函數(shù)對(duì)所述待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,得到目標(biāo)應(yīng)用程序的數(shù)據(jù),所述控制流混淆處理能夠使得所述控制流數(shù)據(jù)在所述待保護(hù)的應(yīng)用程序中被混淆。本申請(qǐng)實(shí)施例中,所述預(yù)定函數(shù)生成模塊302,包括:轉(zhuǎn)換單元,用于將所述預(yù)定程序數(shù)據(jù)轉(zhuǎn)換為預(yù)定程序語(yǔ)言的目標(biāo)程序數(shù)據(jù);預(yù)定函數(shù)生成單元,用于從所述目標(biāo)程序數(shù)據(jù)中提取控制流數(shù)據(jù),基于所述控制流數(shù)據(jù)生成預(yù)定程序函數(shù)。本申請(qǐng)實(shí)施例中,所述目標(biāo)數(shù)據(jù)獲取模塊303,包括:返回值獲取單元,用于將所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)輸入所述預(yù)定程序函數(shù)中,得到返回值;統(tǒng)一函數(shù)確定單元,用于基于所述返回值確定相應(yīng)的統(tǒng)一控制流函數(shù);輸入單元,用于將所述控制流數(shù)據(jù)輸入到所述統(tǒng)一控制流函數(shù)中,以通過所述統(tǒng)一控制流函數(shù)能夠調(diào)用所述控制流數(shù)據(jù);目標(biāo)數(shù)據(jù)獲取單元,用于根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)和所述控制流數(shù)據(jù)生成目標(biāo)應(yīng)用程序的數(shù)據(jù)。本申請(qǐng)實(shí)施例中,所述裝置還包括:索引設(shè)置模塊,用于為每個(gè)控制流數(shù)據(jù)設(shè)置相應(yīng)的索引,以標(biāo)記所述控制流數(shù)據(jù)所對(duì)應(yīng)的函數(shù)類型;相應(yīng)地,所述目標(biāo)數(shù)據(jù)獲取單元,用于根據(jù)所述預(yù)定程序數(shù)據(jù)中除控制流數(shù)據(jù)外的程序數(shù)據(jù)、所述統(tǒng)一控制流函數(shù)、所述控制流數(shù)據(jù)和所述索引生成目標(biāo)應(yīng)用程序的數(shù)據(jù)。本申請(qǐng)實(shí)施例中,所述待保護(hù)的應(yīng)用程序?yàn)榛赼ndroid操作系統(tǒng)的應(yīng)用程序,所述預(yù)定程序數(shù)據(jù)為classes.dex文件中包含的程序數(shù)據(jù),所述目標(biāo)程序數(shù)據(jù)為基于smali程序語(yǔ)言的程序數(shù)據(jù)。本申請(qǐng)實(shí)施例提供一種應(yīng)用程序的處理裝置,通過獲取的待保護(hù)的應(yīng)用程序中的預(yù)定程序數(shù)據(jù),從中獲取控制流數(shù)據(jù),基于控制流數(shù)據(jù)生成預(yù)定程序函數(shù),然后,基于控制流數(shù)據(jù)、預(yù)定程序數(shù)據(jù)和預(yù)定程序函數(shù)對(duì)待保護(hù)的應(yīng)用程序進(jìn)行控制流混淆處理,以使控制流數(shù)據(jù)在待保護(hù)的應(yīng)用程序中被混淆,得到目標(biāo)應(yīng)用程序的數(shù)據(jù),這樣,預(yù)定程序數(shù)據(jù)在控制流程上無法再被反編譯出具體含義,降低了應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),同時(shí),由于生成的預(yù)定程序函數(shù)在控制流程上直接操作寄存器,對(duì)預(yù)定程序數(shù)據(jù)進(jìn)行反編譯后無法直接查看到應(yīng)用程序中真實(shí)的相應(yīng)程序代碼,進(jìn)一步降低了應(yīng)用程序的程序代碼的泄露或篡改風(fēng)險(xiǎn),提高應(yīng)用程序的程序代碼的安全性。在20世紀(jì)90年代,對(duì)于一個(gè)技術(shù)的改進(jìn)可以很明顯地區(qū)分是硬件上的改進(jìn)(例如,對(duì)二極管、晶體管、開關(guān)等電路結(jié)構(gòu)的改進(jìn))還是軟件上的改進(jìn)(對(duì)于方法流程的改進(jìn))。然而,隨著技術(shù)的發(fā)展,當(dāng)今的很多方法流程的改進(jìn)已經(jīng)可以視為硬件電路結(jié)構(gòu)的直接改進(jìn)。設(shè)計(jì)人員幾乎都通過將改進(jìn)的方法流程編程到硬件電路中來得到相應(yīng)的硬件電路結(jié)構(gòu)。因此,不能說一個(gè)方法流程的改進(jìn)就不能用硬件實(shí)體模塊來實(shí)現(xiàn)。例如,可編程邏輯器件(programmablelogicdevice,pld)(例如現(xiàn)場(chǎng)可編程門陣列(fieldprogrammablegatearray,fpga))就是這樣一種集成電路,其邏輯功能由用戶對(duì)器件編程來確定。由設(shè)計(jì)人員自行編程來把一個(gè)數(shù)字系統(tǒng)“集成”在一片pld上,而不需要請(qǐng)芯片制造廠商來設(shè)計(jì)和制作專用的集成電路芯片。而且,如今,取代手工地制作集成電路芯片,這種編程也多半改用“邏輯編譯器(logiccompiler)”軟件來實(shí)現(xiàn),它與程序開發(fā)撰寫時(shí)所用的軟件編譯器相類似,而要編譯之前的原始代碼也得用特定的編程語(yǔ)言來撰寫,此稱之為硬件描述語(yǔ)言(hardwaredescriptionlanguage,hdl),而hdl也并非僅有一種,而是有許多種,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)與verilog。本領(lǐng)域技術(shù)人員也應(yīng)該清楚,只需要將方法流程用上述幾種硬件描述語(yǔ)言稍作邏輯編程并編程到集成電路中,就可以很容易得到實(shí)現(xiàn)該邏輯方法流程的硬件電路??刂破骺梢园慈魏芜m當(dāng)?shù)姆绞綄?shí)現(xiàn),例如,控制器可以采取例如微處理器或處理器以及存儲(chǔ)可由該(微)處理器執(zhí)行的計(jì)算機(jī)可讀程序代碼(例如軟件或固件)的計(jì)算機(jī)可讀介質(zhì)、邏輯門、開關(guān)、專用集成電路(applicationspecificintegratedcircuit,asic)、可編程邏輯控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存儲(chǔ)器控制器還可以被實(shí)現(xiàn)為存儲(chǔ)器的控制邏輯的一部分。本領(lǐng)域技術(shù)人員也知道,除了以純計(jì)算機(jī)可讀程序代碼方式實(shí)現(xiàn)控制器以外,完全可以通過將方法步驟進(jìn)行邏輯編程來使得控制器以邏輯門、開關(guān)、專用集成電路、可編程邏輯控制器和嵌入微控制器等的形式來實(shí)現(xiàn)相同功能。因此這種控制器可以被認(rèn)為是一種硬件部件,而對(duì)其內(nèi)包括的用于實(shí)現(xiàn)各種功能的裝置也可以視為硬件部件內(nèi)的結(jié)構(gòu)。或者甚至,可以將用于實(shí)現(xiàn)各種功能的裝置視為既可以是實(shí)現(xiàn)方法的軟件模塊又可以是硬件部件內(nèi)的結(jié)構(gòu)。上述實(shí)施例闡明的系統(tǒng)、裝置、模塊或單元,具體可以由計(jì)算機(jī)芯片或?qū)嶓w實(shí)現(xiàn),或者由具有某種功能的產(chǎn)品來實(shí)現(xiàn)。一種典型的實(shí)現(xiàn)設(shè)備為計(jì)算機(jī)。具體的,計(jì)算機(jī)例如可以為個(gè)人計(jì)算機(jī)、膝上型計(jì)算機(jī)、蜂窩電話、相機(jī)電話、智能電話、個(gè)人數(shù)字助理、媒體播放器、導(dǎo)航設(shè)備、電子郵件設(shè)備、游戲控制臺(tái)、平板計(jì)算機(jī)、可穿戴設(shè)備或者這些設(shè)備中的任何設(shè)備的組合。為了描述的方便,描述以上裝置時(shí)以功能分為各種單元分別描述。當(dāng)然,在實(shí)施本申請(qǐng)時(shí)可以把各單元的功能在同一個(gè)或多個(gè)軟件和/或硬件中實(shí)現(xiàn)。本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。在一個(gè)典型的配置中,計(jì)算設(shè)備包括一個(gè)或多個(gè)處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲(chǔ)器(sram)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(dram)、其他類型的隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、電可擦除可編程只讀存儲(chǔ)器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。還需要說明的是,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。本領(lǐng)域技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、cd-rom、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。本申請(qǐng)可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計(jì)算環(huán)境中實(shí)踐本申請(qǐng),在這些分布式計(jì)算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲(chǔ)設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲(chǔ)介質(zhì)中。本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,各個(gè)實(shí)施例之間相同相似的部分互相參見即可,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡(jiǎn)單,相關(guān)之處參見方法實(shí)施例的部分說明即可。以上所述僅為本申請(qǐng)的實(shí)施例而已,并不用于限制本申請(qǐng)。對(duì)于本領(lǐng)域技術(shù)人員來說,本申請(qǐng)可以有各種更改和變化。凡在本申請(qǐng)的精神和原理之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)的權(quán)利要求范圍之內(nèi)。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12