本發(fā)明的實(shí)施方式涉及軟件開發(fā)技術(shù)領(lǐng)域,更具體地,本發(fā)明的實(shí)施方式涉及一種程序代碼保護(hù)方法和裝置。
背景技術(shù):
本部分旨在為權(quán)利要求書中陳述的本發(fā)明的實(shí)施方式提供背景或上下文。此處的描述不因?yàn)榘ㄔ诒静糠种芯统姓J(rèn)是現(xiàn)有技術(shù)。
app是application(應(yīng)用)的簡稱,通常是指移動(dòng)設(shè)備(包括平板電腦、手機(jī)和其他移動(dòng)設(shè)備)上的第三方開發(fā)的應(yīng)用程序。dex文件是android平臺(tái)上(dalvik虛擬機(jī))的可執(zhí)行文件,相當(dāng)于windows平臺(tái)中的exe文件,每個(gè)apk(androidpackage,android開發(fā)包)安裝包中都有dex文件,其由java語言編寫而成,其包含了app的全部操作指令以及運(yùn)行時(shí)所需的數(shù)據(jù)。dex文件可以通過第三方逆向分析工具查看其java源碼,即通過反編譯dex文件可以直接看到j(luò)ava源碼,因此,越來越多的app(包括惡意病毒app)都使用了加固技術(shù)以防止app被輕易反編譯。
現(xiàn)有技術(shù)中,通常采用以下兩種方法對(duì)dex文件進(jìn)行加固,一種是對(duì)源dex進(jìn)行加密,并把加密后的文件打包存儲(chǔ)到apk的某個(gè)目錄下(加殼),這樣,在app運(yùn)行時(shí),外殼dex首先啟動(dòng),然后將加密文件解密,待解密出源dex后再動(dòng)態(tài)加載到內(nèi)存運(yùn)行源dex。另外一種是將源dex和外殼dex混合處理成一個(gè)新dex,在app運(yùn)行時(shí),外殼dex首先啟動(dòng),然后將包含在新dex里的源dex解密出來,最后動(dòng)態(tài)加載運(yùn)行源dex。
技術(shù)實(shí)現(xiàn)要素:
但是,上述第一種方案中,由于需要加載加密文件以及解密和動(dòng)態(tài)加載加密后的源dex,需要消耗系統(tǒng)較多的處理資源;而在上述第二種方案中,其減少了dex文件內(nèi)存加載,在一定程度上降低了系統(tǒng)資源開銷,但是,其在加密過程中,仍然需要對(duì)整個(gè)dex文件進(jìn)行加密,同樣增加了系統(tǒng)處理資源的開銷。
為此,非常需要一種改進(jìn)的函數(shù)代碼指令保護(hù)方法,以提高函數(shù)代碼指令保護(hù)的安全性。
在本上下文中,本發(fā)明的實(shí)施方式期望提供一種程序代碼保護(hù)方法和裝置。
在本發(fā)明實(shí)施方式的第一方面中,提供了一種程序代碼保護(hù)方法,包括:
針對(duì)dex文件中包含的每一函數(shù),如果判斷出該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,則獲取所述函數(shù)的結(jié)構(gòu)信息,所述結(jié)構(gòu)信息中包含有函數(shù)代碼指令及其訪問標(biāo)識(shí);
修改所述訪問標(biāo)識(shí)為預(yù)設(shè)值;并
抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理。
優(yōu)選地,針對(duì)dex文件中包含的每一函數(shù),按照以下流程判斷該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令是否需要加密:
針對(duì)dex文件中包含的每一函數(shù),判斷該函數(shù)是否存在于預(yù)先存儲(chǔ)的白名單中;
如果存在,則確定該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密;
如果不存在,則確定該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令不需要加密。
優(yōu)選地,所述函數(shù)的結(jié)構(gòu)信息中還包括指令偏移信息;以及
抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理,具體包括:
根據(jù)所述指令偏移信息確定所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令的起始位置和終止位置;
抽取所述開始位置與終止位置之間包含的函數(shù)代碼指令進(jìn)行加密處理。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)方法,還包括:
存儲(chǔ)加密后的函數(shù)代碼指令;并
記錄加密后的函數(shù)代碼指令的存儲(chǔ)位置信息。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)方法,還包括:
在執(zhí)行所述dex文件時(shí),根據(jù)所述存儲(chǔ)位置信息從相應(yīng)的存儲(chǔ)位置獲取加密后的函數(shù)代碼指令進(jìn)行解密;并
執(zhí)行解密后的函數(shù)代碼指令。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)方法,還包括:
在執(zhí)行所述dex文件時(shí),根據(jù)所述存儲(chǔ)位置信息從相應(yīng)的存儲(chǔ)位置獲取加密后的函數(shù)代碼指令進(jìn)行解密;并
記錄系統(tǒng)為解密后的函數(shù)代碼指令所分配的內(nèi)存偏移信息;
修改所述函數(shù)的結(jié)構(gòu)信息中包含的指令偏移信息為分配的內(nèi)存偏移信息。
在本發(fā)明實(shí)施方式的第二方面中,提供了一種程序代碼保護(hù)裝置,包括:
第一獲取單元,用于針對(duì)dex文件中包含的每一函數(shù),如果判斷出該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,則獲取所述函數(shù)的結(jié)構(gòu)信息,所述結(jié)構(gòu)信息中包含有函數(shù)代碼指令及其訪問標(biāo)識(shí);
第一修改單元,用于修改所述訪問標(biāo)識(shí)為預(yù)設(shè)值;
加密單元,用于抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置,還包括:
判斷單元,用于針對(duì)dex文件中包含的每一函數(shù),判斷該函數(shù)是否存在于預(yù)先存儲(chǔ)的白名單中;如果存在,則確定該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密;如果不存在,則確定該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令不需要加密。
優(yōu)選地,所述文件結(jié)構(gòu)信息中還包括指令偏移信息;以及
所述加密單元,具體用于根據(jù)所述指令偏移信息確定所述訪問標(biāo)識(shí)對(duì)應(yīng)的函數(shù)代碼指令的起始位置和終止位置;抽取所述開始位置與終止位置之間包含的函數(shù)代碼指令進(jìn)行加密處理。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置,還包括:
存儲(chǔ)單元,用于存儲(chǔ)加密后的函數(shù)代碼指令;
第一記錄單元,用于記錄加密后的函數(shù)代碼指令的存儲(chǔ)位置信息。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置,還包括:
第二獲取單元,用于在執(zhí)行所述dex文件時(shí),根據(jù)所述存儲(chǔ)位置信息從相應(yīng)的存儲(chǔ)位置獲取加密后的函數(shù)代碼指令進(jìn)行解密;
執(zhí)行單元,用于執(zhí)行解密后的函數(shù)代碼指令。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置,還包括:
第三獲取單元,用于在執(zhí)行所述dex文件時(shí),根據(jù)所述存儲(chǔ)位置信息從相應(yīng)的存儲(chǔ)位置獲取加密后的函數(shù)代碼指令進(jìn)行解密;
第二記錄單元,用于記錄為解密后的函數(shù)代碼指令所分配的內(nèi)存偏移信息;
第二修改單元,用于修改所述文件結(jié)構(gòu)信息中包含的指令偏移信息為分配的內(nèi)存偏移信息。
在本發(fā)明實(shí)施方式的第三方面中,提供了一種程序代碼保護(hù)裝置,例如,可以包括存儲(chǔ)器和處理器,其中,處理器可以用于讀取存儲(chǔ)器中的程序,執(zhí)行下列過程:針對(duì)dex文件中包含的每一函數(shù),如果判斷出該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,則獲取所述函數(shù)的結(jié)構(gòu)信息,所述結(jié)構(gòu)信息中包含有函數(shù)代碼指令及其訪問標(biāo)識(shí);修改所述訪問標(biāo)識(shí)為預(yù)設(shè)值;并抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理。
在本發(fā)明實(shí)施方式的第四方面中,提供了一種程序產(chǎn)品,其包括函數(shù)代碼指令,當(dāng)所述程序產(chǎn)品運(yùn)行時(shí),所述函數(shù)代碼指令用于執(zhí)行以下過程:針對(duì)dex文件中包含的每一函數(shù),如果判斷出該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,則獲取所述函數(shù)的結(jié)構(gòu)信息,所述結(jié)構(gòu)信息中包含有函數(shù)代碼指令及其訪問標(biāo)識(shí);修改所述訪問標(biāo)識(shí)為預(yù)設(shè)值;并抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理。
根據(jù)本發(fā)明實(shí)施方式的程序保護(hù)方法和裝置,對(duì)于判斷出的dex文件中包含的需要加密的函數(shù),根據(jù)其結(jié)構(gòu)信息中包含的訪問標(biāo)識(shí)和函數(shù)代碼指令,修改訪問標(biāo)識(shí)為預(yù)設(shè)值,并將函數(shù)代碼指令進(jìn)行加密,而無需對(duì)整個(gè)dex文件進(jìn)行加密,從而能夠節(jié)省系統(tǒng)處理資源,提高了dex文件加密效率,為用戶帶來了更好的體驗(yàn)。
附圖說明
通過參考附圖閱讀下文的詳細(xì)描述,本發(fā)明示例性實(shí)施方式的上述以及其他目的、特征和優(yōu)點(diǎn)將變得易于理解。在附圖中,以示例性而非限制性的方式示出了本發(fā)明的若干實(shí)施方式,其中:
圖1示意性地示出了根據(jù)本發(fā)明實(shí)施方式的程序代碼保護(hù)方法的實(shí)施流程示意圖;
圖2示意性地示出了根據(jù)本發(fā)明實(shí)施方式的函數(shù)結(jié)構(gòu)信息示意圖;
圖3示意性地示出了根據(jù)本發(fā)明實(shí)施方式的對(duì)需要加密的函數(shù)抽取其指令代碼后的結(jié)構(gòu)信息示意圖;
圖4示意性地示出了根據(jù)本發(fā)明實(shí)施方式的判斷任一函數(shù)對(duì)應(yīng)的函數(shù)代碼指令是否需要加密的流程示意圖;
圖5示意性地示出了根據(jù)本發(fā)明實(shí)施方式的抽取函數(shù)代碼指令進(jìn)行加密的流程示意圖;
圖6示意性地示出了根據(jù)本發(fā)明實(shí)施方式的程序代碼保護(hù)裝置的結(jié)構(gòu)示意圖;
圖7示意性地示出了根據(jù)本發(fā)明實(shí)施方式的另外一種程序代碼保護(hù)裝置的結(jié)構(gòu)示意圖;
圖8示意性地示出了根據(jù)本發(fā)明實(shí)施方式的程序產(chǎn)品示意圖;
在附圖中,相同或?qū)?yīng)的標(biāo)號(hào)表示相同或?qū)?yīng)的部分。
具體實(shí)施方式
下面將參考若干示例性實(shí)施方式來描述本發(fā)明的原理和精神。應(yīng)當(dāng)理解,給出這些實(shí)施方式僅僅是為了使本領(lǐng)域技術(shù)人員能夠更好地理解進(jìn)而實(shí)現(xiàn)本發(fā)明,而并非以任何方式限制本發(fā)明的范圍。相反,提供這些實(shí)施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的范圍完整地傳達(dá)給本領(lǐng)域的技術(shù)人員。
本領(lǐng)域技術(shù)人員知道,本發(fā)明的實(shí)施方式可以實(shí)現(xiàn)為一種系統(tǒng)、裝置、設(shè)備、方法或計(jì)算機(jī)程序產(chǎn)品。因此,本公開可以具體實(shí)現(xiàn)為以下形式,即:完全的硬件、完全的軟件(包括固件、駐留軟件、微代碼等),或者硬件和軟件結(jié)合的形式。
根據(jù)本發(fā)明的實(shí)施方式,提出了一種程序代碼保護(hù)方法和裝置。
在本文中,需要理解的是,附圖中的任何元素?cái)?shù)量均用于示例而非限制,以及任何命名都僅用于區(qū)分,而不具有任何限制含義。
下面參考本發(fā)明的若干代表性實(shí)施方式,詳細(xì)闡釋本發(fā)明的原理和精神。
發(fā)明概述
本發(fā)明人發(fā)現(xiàn),在對(duì)dex文件進(jìn)行加固時(shí),通常需要對(duì)整個(gè)dex文件進(jìn)行加密,這增加了系統(tǒng)處理資源開銷,降低了dex文件加密的處理效率。
有鑒于此,本發(fā)明實(shí)施例中,針對(duì)dex文件中包含的每一函數(shù),首選確定需要加密的函數(shù),并根據(jù)需加密的函數(shù)的結(jié)構(gòu)信息,抽取其中的函數(shù)代碼指令進(jìn)行加密,由于無需對(duì)整個(gè)dex文件進(jìn)行加密,從大大減少了數(shù)據(jù)處理量,節(jié)約了系統(tǒng)資源開銷,提高了dex文件加密的效率。
在介紹了本發(fā)明的基本原理之后,下面具體介紹本發(fā)明的各種非限制性實(shí)施方式。以下結(jié)合說明書附圖對(duì)本發(fā)明的優(yōu)選實(shí)施例進(jìn)行說明,應(yīng)當(dāng)理解,此處所描述的優(yōu)選實(shí)施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明,并且在不沖突的情況下,本發(fā)明中的實(shí)施例及實(shí)施例中的特征可以相互組合。
示例性方法
如圖1所示,其為本發(fā)明實(shí)施例提供的程序代碼保護(hù)方法的實(shí)施流程示意圖,可以包括以下步驟:
s11、針對(duì)dex文件中包含的每一函數(shù),如果判斷出該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,則獲取所述函數(shù)的結(jié)構(gòu)信息,所述結(jié)構(gòu)信息中包含有函數(shù)代碼指令及其訪問標(biāo)識(shí)。
具體實(shí)施時(shí),這對(duì)待加密的dex文件,針對(duì)該dex文件中包含的每一函數(shù),依次判斷該函數(shù)是否需要加密,如果是,則獲取該函數(shù)的結(jié)構(gòu)信息,如圖2所示,其為函數(shù)的結(jié)構(gòu)信息示意圖,函數(shù)的結(jié)構(gòu)信息中包含的函數(shù)代碼指令和訪問標(biāo)識(shí)。
s12、修改結(jié)構(gòu)信息中的訪問標(biāo)識(shí)為預(yù)設(shè)值。
具體實(shí)施時(shí),當(dāng)一個(gè)函數(shù)在java源代碼中被聲明為native函數(shù)的時(shí)候,它的指令代碼并不在dex文件里,而是在注冊它的so(sharedobject,共享動(dòng)態(tài)鏈接庫)文件里。因此,本發(fā)明實(shí)施中,利用了dex文件中函數(shù)的訪問標(biāo)識(shí),通過將不是native標(biāo)識(shí)的函數(shù)變更為native類型來隱藏函數(shù)的指令代碼,源函數(shù)的指令代碼將會(huì)被加密保存起來,在app運(yùn)行的時(shí)候再動(dòng)態(tài)解密執(zhí)行。
s13、抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理。
如圖3所示,其為本發(fā)明實(shí)施例中,對(duì)需要加密的函數(shù)抽取其指令代碼后的結(jié)構(gòu)信息示意圖。圖3中,如果待加密的函數(shù)的訪問標(biāo)識(shí)不是native,則將訪問標(biāo)識(shí)修改為native,修改指令偏移信息為null,并抽取該函數(shù)對(duì)應(yīng)的函數(shù)指令代碼進(jìn)行加密處理。
具體實(shí)施時(shí),在步驟s11中,針對(duì)dex文件中包含的任一函數(shù),可以按照圖4所示的流程判斷該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令是否需要加密:
s41、針對(duì)dex文件中包含的每一函數(shù),判斷該函數(shù)是否存在于預(yù)先存儲(chǔ)的白名單中,如果是,則執(zhí)行步驟s42,否則,執(zhí)行步驟s43。
具體實(shí)施時(shí),可以預(yù)先建立函數(shù)加密白名單,其中,白名單中的函數(shù)可以根據(jù)經(jīng)驗(yàn)預(yù)先設(shè)定。
s42、確定該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,流程結(jié)束。
s43、確定該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令不需要加密。
具體實(shí)施時(shí),如圖2所示,函數(shù)的結(jié)構(gòu)信息中還包括指令偏移信息,基于此,步驟s13中,可以按照圖5所示的流程實(shí)施:
s51、根據(jù)所述指令偏移信息確定所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令的起始位置和終止位置。
s52、抽取所述開始位置與終止位置之間包含的函數(shù)代碼指令進(jìn)行加密處理。
在app運(yùn)行過程中,為了準(zhǔn)確獲取被加密的函數(shù)代碼指令并執(zhí)行,本發(fā)明實(shí)施例中,在對(duì)函數(shù)指令代碼進(jìn)行加密之后,還可以包括需要存儲(chǔ)加密后的函數(shù)代碼指令,并記錄加密后的函數(shù)代碼指令的存儲(chǔ)位置信息。
現(xiàn)有技術(shù)中,第一種加密方法在解密后,由于需要調(diào)用動(dòng)態(tài)加載相關(guān)函數(shù),這個(gè)過程中可能會(huì)被攻擊者通過鉤掛相關(guān)函數(shù)來獲取解密后的源dex,從而達(dá)到破解的目的,降低了dex文件保護(hù)的安全性;而第二種加密方法中,由于其需要解密源dex,并使用動(dòng)態(tài)加載技術(shù)來加載解密后的源dex,這個(gè)過程中,仍然存在與上述第一種加密方法相同的問題,即可能被攻擊者通過鉤掛相關(guān)函數(shù)獲取解密后的源dex,從而達(dá)到破解的目的,同樣降低了dex文件保護(hù)的安全性。
而在app運(yùn)行過程中,需要執(zhí)行被加密的函數(shù)代碼指令時(shí),基于本發(fā)明實(shí)施例提供的程序代碼保護(hù)方法,本發(fā)明實(shí)施例提供以下兩種處理方法。
方法一、直接執(zhí)行解密后的函數(shù)代碼指令。
這種實(shí)施方式下,在app運(yùn)行執(zhí)行dex文件時(shí),根據(jù)記錄的存儲(chǔ)位置信息從相應(yīng)的存儲(chǔ)位置獲取加密后的函數(shù)代碼指令進(jìn)行解密,并執(zhí)行解密后的函數(shù)代碼指令。
方法二、修復(fù)被加密函數(shù)的結(jié)構(gòu)信息。
這種實(shí)施方式下,在app運(yùn)行執(zhí)行dex文件時(shí),根據(jù)記錄的存儲(chǔ)位置信息從相應(yīng)的存儲(chǔ)位置獲取加密后的函數(shù)代碼指令進(jìn)行解密;并記錄系統(tǒng)為解密后的函數(shù)代碼指令所分配的內(nèi)存偏移信息;修改所述函數(shù)的結(jié)構(gòu)信息中包含的指令偏移信息為分配的內(nèi)存偏移信息。這樣,根據(jù)內(nèi)存偏移信息可以準(zhǔn)確獲取解密后的函數(shù)代碼指令并執(zhí)行。
上述兩種方法中,無需調(diào)用動(dòng)態(tài)加載相關(guān)函數(shù),因此,避免了被攻擊者通過鉤掛相關(guān)函數(shù)來獲取解密后的函數(shù)指令代碼,從而提高了dex文件保護(hù)的安全性。
本發(fā)明實(shí)施例提供的程序代碼保護(hù)方法中,針對(duì)dex文件中判斷出的需加密的函數(shù),利用函數(shù)的訪問標(biāo)識(shí)來抽取相應(yīng)的函數(shù)代碼指令進(jìn)行加密,相比于現(xiàn)有技術(shù)中,加密整個(gè)dex文件,大大減少了需處理的數(shù)據(jù)量,從而節(jié)約了系統(tǒng)處理資源,提高了程序代碼保護(hù)的效率,提高了用戶體驗(yàn);而在執(zhí)行解密后的函數(shù)代碼指令過程中,由于無需調(diào)用動(dòng)態(tài)加載相關(guān)函數(shù),從而避免了攻擊者通過鉤掛相關(guān)函數(shù)來獲取解密后的函數(shù)代碼指令,提高了dex文件保護(hù)的安全性。
示例性設(shè)備
在介紹了本發(fā)明示例性實(shí)施方式的方法之后,接下來,參考圖6對(duì)本發(fā)明示例性實(shí)施方式的、用于程序代碼保護(hù)的裝置。
如圖6所示,其為本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置的結(jié)構(gòu)示意圖,可以包括:
第一獲取單元61,用于針對(duì)dex文件中包含的每一函數(shù),如果判斷出該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,則獲取所述函數(shù)的結(jié)構(gòu)信息,所述結(jié)構(gòu)信息中包含有函數(shù)代碼指令及其訪問標(biāo)識(shí);
第一修改單元62,用于修改所述訪問標(biāo)識(shí)為預(yù)設(shè)值;
加密單元63,用于抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置,還可以包括:
判斷單元64,用于針對(duì)dex文件中包含的每一函數(shù),判斷該函數(shù)是否存在于預(yù)先存儲(chǔ)的白名單中;如果存在,則確定該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密;如果不存在,則確定該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令不需要加密。
優(yōu)選地,所述文件結(jié)構(gòu)信息中還包括指令偏移信息;以及
所述加密單元63,具體用于根據(jù)所述指令偏移信息確定所述訪問標(biāo)識(shí)對(duì)應(yīng)的函數(shù)代碼指令的起始位置和終止位置;抽取所述開始位置與終止位置之間包含的函數(shù)代碼指令進(jìn)行加密處理。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置,還可以包括:
存儲(chǔ)單元65,用于存儲(chǔ)加密后的函數(shù)代碼指令;
第一記錄單元66,用于記錄加密后的函數(shù)代碼指令的存儲(chǔ)位置信息。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置,還可以包括:
第二獲取單元67,用于在執(zhí)行所述dex文件時(shí),根據(jù)所述存儲(chǔ)位置信息從相應(yīng)的存儲(chǔ)位置獲取加密后的函數(shù)代碼指令進(jìn)行解密;
執(zhí)行單元68,用于執(zhí)行解密后的函數(shù)代碼指令。
可選地,本發(fā)明實(shí)施例提供的程序代碼保護(hù)裝置,還可以包括:
第三獲取單元69,用于在執(zhí)行所述dex文件時(shí),根據(jù)所述存儲(chǔ)位置信息從相應(yīng)的存儲(chǔ)位置獲取加密后的函數(shù)代碼指令進(jìn)行解密;
第二記錄單元610,用于記錄為解密后的函數(shù)代碼指令所分配的內(nèi)存偏移信息;
第二修改單元611,用于修改所述文件結(jié)構(gòu)信息中包含的指令偏移信息為分配的內(nèi)存偏移信息。
在介紹了本發(fā)明示例性實(shí)施方式的程序代碼保護(hù)方法和裝置之后,接下來,介紹根據(jù)本發(fā)明的另一示例性實(shí)施方式的程序代碼保護(hù)裝置。
所屬技術(shù)領(lǐng)域的技術(shù)人員能夠理解,本發(fā)明的各個(gè)方面可以實(shí)現(xiàn)為系統(tǒng)、方法或程序產(chǎn)品。因此,本發(fā)明的各個(gè)方面可以具體實(shí)現(xiàn)為以下形式,即:完全的硬件實(shí)施方式、完全的軟件實(shí)施方式(包括固件、微代碼等),或硬件和軟件方面結(jié)合的實(shí)施方式,這里可以統(tǒng)稱為“電路”、“模塊”或“系統(tǒng)”。
在一些可能的實(shí)施方式中,根據(jù)本發(fā)明的程序代碼保護(hù)裝置可以包括至少一個(gè)處理單元、以及至少一個(gè)存儲(chǔ)單元。其中,所述存儲(chǔ)單元存儲(chǔ)有函數(shù)代碼指令,當(dāng)所述函數(shù)代碼指令被所述處理單元執(zhí)行時(shí),使得所述處理單元執(zhí)行本說明書上述“示例性方法”部分中描述的根據(jù)本發(fā)明各種示例性實(shí)施方式的程序代碼保護(hù)方法中的各種步驟。例如,所述處理單元可以執(zhí)行如圖1中所示的步驟s11,針對(duì)dex文件中包含的每一函數(shù),如果判斷出該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,則獲取所述函數(shù)的結(jié)構(gòu)信息,所述結(jié)構(gòu)信息中包含有函數(shù)代碼指令及其訪問標(biāo)識(shí),步驟s12,修改結(jié)構(gòu)信息中的訪問標(biāo)識(shí)為預(yù)設(shè)值;以及步驟s13,抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理。
下面參照圖7來描述根據(jù)本發(fā)明的這種實(shí)施方式的程序代碼保護(hù)裝置70。圖7顯示的程序代碼保護(hù)裝置僅僅是一個(gè)示例,不應(yīng)對(duì)本發(fā)明實(shí)施例的功能和使用范圍帶來任何限制。
如圖7所示,程序代碼保護(hù)裝置70可以以通用計(jì)算設(shè)備的形式表現(xiàn),例如其可以為用戶設(shè)備。程序代碼保護(hù)裝置70的組件可以包括但不限于:上述至少一個(gè)處理單元71、上述至少一個(gè)存儲(chǔ)單元72、連接不同系統(tǒng)組件(包括存儲(chǔ)單元72和處理單元71)的總線73。
總線73表示幾類總線結(jié)構(gòu)中的一種或多種,包括存儲(chǔ)器總線或者存儲(chǔ)器控制器、外圍總線、處理器或者使用多種總線結(jié)構(gòu)中的任意總線結(jié)構(gòu)的局域總線。
存儲(chǔ)單元72可以包括易失性存儲(chǔ)器形式的可讀介質(zhì),例如隨機(jī)存取存儲(chǔ)器(ram)721和/或高速緩存存儲(chǔ)器722,還可以進(jìn)一步包括只讀存儲(chǔ)器(rom)723。
存儲(chǔ)單元72還可以包括具有一組(至少一個(gè))程序模塊724的程序/實(shí)用工具725,這樣的程序模塊724包括但不限于:操作系統(tǒng)、一個(gè)或者多個(gè)應(yīng)用程序、其它程序模塊以及程序數(shù)據(jù),這些示例中的每一個(gè)或某種組合中可能包括網(wǎng)絡(luò)環(huán)境的實(shí)現(xiàn)。
程序代碼保護(hù)裝置70也可以與一個(gè)或多個(gè)外部設(shè)備74(例如鍵盤、指向設(shè)備等)通信,還可與一個(gè)或者多個(gè)使得用戶能與該程序代碼保護(hù)裝置70交互的設(shè)備通信,和/或與使得程序代碼保護(hù)裝置70能與一個(gè)或多個(gè)其它計(jì)算設(shè)備進(jìn)行通信的任何設(shè)備(例如路由器、調(diào)制解調(diào)器等等)通信。這種通信可以通過輸入/輸出(i/o)接口75進(jìn)行。并且,程序代碼保護(hù)裝置70還可以通過網(wǎng)絡(luò)適配器76與一個(gè)或者多個(gè)網(wǎng)絡(luò)(例如局域網(wǎng)(lan),廣域網(wǎng)(wan)和/或公共網(wǎng)絡(luò),例如因特網(wǎng))通信。如圖所示,網(wǎng)絡(luò)適配器76通過總線73與程序代碼保護(hù)裝置70的其它模塊通信。應(yīng)當(dāng)明白,盡管圖中未示出,可以結(jié)合程序代碼保護(hù)裝置70使用其它硬件和/或軟件模塊,包括但不限于:微代碼、設(shè)備驅(qū)動(dòng)器、冗余處理單元、外部磁盤驅(qū)動(dòng)陣列、raid系統(tǒng)、磁帶驅(qū)動(dòng)器以及數(shù)據(jù)備份存儲(chǔ)系統(tǒng)等。
示例性程序產(chǎn)品
在一些可能的實(shí)施方式中,本發(fā)明的各個(gè)方面還可以實(shí)現(xiàn)為一種程序產(chǎn)品的形式,其包括程序代碼,當(dāng)所述程序產(chǎn)品在計(jì)算設(shè)備上運(yùn)行時(shí),所述程序代碼用于使所述計(jì)算設(shè)備執(zhí)行本說明書上述“示例性方法”部分中描述的根據(jù)本發(fā)明各種示例性實(shí)施方式的程序代碼保護(hù)方法的步驟,例如,所述計(jì)算設(shè)備可以執(zhí)行如圖1中所示的步驟s11,針對(duì)dex文件中包含的每一函數(shù),如果判斷出該函數(shù)對(duì)應(yīng)的函數(shù)代碼指令需要加密,則獲取所述函數(shù)的結(jié)構(gòu)信息,所述結(jié)構(gòu)信息中包含有函數(shù)代碼指令及其訪問標(biāo)識(shí),步驟s12,修改結(jié)構(gòu)信息中的訪問標(biāo)識(shí)為預(yù)設(shè)值;以及步驟s13,抽取所述函數(shù)對(duì)應(yīng)的函數(shù)代碼指令進(jìn)行加密處理。
所述程序產(chǎn)品可以采用一個(gè)或多個(gè)可讀介質(zhì)的任意組合??勺x介質(zhì)可以是可讀信號(hào)介質(zhì)或者可讀存儲(chǔ)介質(zhì)??勺x存儲(chǔ)介質(zhì)例如可以是——但不限于——電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、裝置或器件,或者任意以上的組合??勺x存儲(chǔ)介質(zhì)的更具體的例子(非窮舉的列表)包括:具有一個(gè)或多個(gè)導(dǎo)線的電連接、便攜式盤、硬盤、隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、可擦式可編程只讀存儲(chǔ)器(eprom或閃存)、光纖、便攜式緊湊盤只讀存儲(chǔ)器(cd-rom)、光存儲(chǔ)器件、磁存儲(chǔ)器件、或者上述的任意合適的組合。
如圖8所示,描述了根據(jù)本發(fā)明的實(shí)施方式的用于程序代碼保護(hù)的程序產(chǎn)品80,其可以采用便攜式緊湊盤只讀存儲(chǔ)器(cd-rom)并包括程序代碼,并可以在服務(wù)器設(shè)備上運(yùn)行。然而,本發(fā)明的程序產(chǎn)品不限于此,在本文件中,可讀存儲(chǔ)介質(zhì)可以是任何包含或存儲(chǔ)程序的有形介質(zhì),該程序可以被指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用。
可讀信號(hào)介質(zhì)可以包括在基帶中或者作為載波一部分傳播的數(shù)據(jù)信號(hào),其中承載了可讀程序代碼。這種傳播的數(shù)據(jù)信號(hào)可以采用多種形式,包括——但不限于——電磁信號(hào)、光信號(hào)或上述的任意合適的組合??勺x信號(hào)介質(zhì)還可以是可讀存儲(chǔ)介質(zhì)以外的任何可讀介質(zhì),該可讀介質(zhì)可以發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序。
可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括——但不限于——無線、有線、光纜、rf等等,或者上述的任意合適的組合。
可以以一種或多種程序設(shè)計(jì)語言的任意組合來編寫用于執(zhí)行本發(fā)明操作的程序代碼,所述程序設(shè)計(jì)語言包括面向?qū)ο蟮某绦蛟O(shè)計(jì)語言—諸如java、c++等,還包括常規(guī)的過程式程序設(shè)計(jì)語言—諸如“c”語言或類似的程序設(shè)計(jì)語言。程序代碼可以完全地在用戶計(jì)算設(shè)備上執(zhí)行、部分地在用戶設(shè)備上執(zhí)行、作為一個(gè)獨(dú)立的軟件包執(zhí)行、部分在用戶計(jì)算設(shè)備上部分在遠(yuǎn)程計(jì)算設(shè)備上執(zhí)行、或者完全在遠(yuǎn)程計(jì)算設(shè)備或服務(wù)器上執(zhí)行。在涉及遠(yuǎn)程計(jì)算設(shè)備的情形中,遠(yuǎn)程計(jì)算設(shè)備可以通過任意種類的網(wǎng)絡(luò)——包括局域網(wǎng)(lan)或廣域網(wǎng)(wan)—連接到用戶計(jì)算設(shè)備,或者,可以連接到外部計(jì)算設(shè)備(例如利用因特網(wǎng)服務(wù)提供商來通過因特網(wǎng)連接)。
應(yīng)當(dāng)注意,盡管在上文詳細(xì)描述中提及了裝置的若干單元或子單元,但是這種劃分僅僅是示例性的并非強(qiáng)制性的。實(shí)際上,根據(jù)本發(fā)明的實(shí)施方式,上文描述的兩個(gè)或更多單元的特征和功能可以在一個(gè)單元中具體化。反之,上文描述的一個(gè)單元的特征和功能可以進(jìn)一步劃分為由多個(gè)單元來具體化。
此外,盡管在附圖中以特定順序描述了本發(fā)明方法的操作,但是,這并非要求或者暗示必須按照該特定順序來執(zhí)行這些操作,或是必須執(zhí)行全部所示的操作才能實(shí)現(xiàn)期望的結(jié)果。附加地或備選地,可以省略某些步驟,將多個(gè)步驟合并為一個(gè)步驟執(zhí)行,和/或?qū)⒁粋€(gè)步驟分解為多個(gè)步驟執(zhí)行。
雖然已經(jīng)參考若干具體實(shí)施方式描述了本發(fā)明的精神和原理,但是應(yīng)該理解,本發(fā)明并不限于所公開的具體實(shí)施方式,對(duì)各方面的劃分也不意味著這些方面中的特征不能組合以進(jìn)行受益,這種劃分僅是為了表述的方便。本發(fā)明旨在涵蓋所附權(quán)利要求的精神和范圍內(nèi)所包括的各種修改和等同布置。