欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種用于保護(hù)代碼安全的方法和裝置的制作方法

文檔序號:6378257閱讀:216來源:國知局
專利名稱:一種用于保護(hù)代碼安全的方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明的實施方式涉及軟件開發(fā)領(lǐng)域,更具體地,本發(fā)明的實施方式涉及一種適用于保護(hù)代碼安全的方法和裝置。
背景技術(shù)
本部分旨在為權(quán)利要求書中陳述的本發(fā)明的實施方式提供背景或上下文。此處的描述可包括可以探究的概念,但不一定是之前已經(jīng)想到或者已經(jīng)探究的概念。因此,除非在此指出,否則在本部分中描述的內(nèi)容對于本申請的說明書和權(quán)利要求書而言不是現(xiàn)有技術(shù),并且并不因為包括在本部分中就承認(rèn)是現(xiàn)有技術(shù)。在軟件開發(fā)領(lǐng)域,如何保護(hù)程序代碼的安全一直是人們所關(guān)注的問題。如果不對程序代碼進(jìn)行必要的保護(hù)措施,借助于一些第三方工具,就能輕而易舉的獲取程序代碼,容易被破解和外掛,甚至被別的無良的人直接拿去改造重新發(fā)行。在現(xiàn)有技術(shù)中,已經(jīng)出現(xiàn)一些保護(hù)代碼安全的方法,例如《QQ樂團(tuán)》使用了代碼混淆的方式對其游戲客戶端進(jìn)行加密保護(hù)。所謂代碼混淆就是將原本人類能直接讀懂的代碼,用機(jī)器的方式轉(zhuǎn)換為人類讀寫都非常晦澀的源代碼,然后進(jìn)行編譯使用,比如將classCatclass Dog轉(zhuǎn)換成class 1011 class 1101等人類難以理解的代碼,從而提高了源代碼的安全性。雖然代碼混淆的方式在一定程度上可以避免源代碼的泄漏。但是對于稍有基礎(chǔ)的技術(shù)人員來說,通過已經(jīng)被混淆的代碼還原出編程者的原始意圖也并非難事,因為經(jīng)過混淆的代碼依然有比較清晰的脈絡(luò),借助人力的翻譯,將局部的代碼反編譯出來,就能破解軟件的關(guān)鍵部分。

發(fā)明內(nèi)容
但是,對于中間語言(IL)代碼來說,其經(jīng)過預(yù)編譯生成的本地代碼無法在Windows操作系統(tǒng)上運(yùn)行使得無法廣泛利用本地代碼來保護(hù)代碼安全。因此在現(xiàn)有技術(shù)中,保護(hù)代碼安全是非常令人煩惱的問題。為此,非常需要一種改進(jìn)的保護(hù)代碼安全的方法,以使IL代碼經(jīng)過預(yù)編譯生成的本地代碼能夠在Windows操作系統(tǒng)上運(yùn)行,進(jìn)而使利用本地代碼保護(hù)代碼安全得到廣泛應(yīng)用。在本上下文中,本發(fā)明的實施方式期望提供一種用于保護(hù)代碼安全的方法和裝置。在本發(fā)明實施方式的第一方面中,提供了一種用于保護(hù)代碼安全的方法,例如可以包括:將一個或多個IL代碼函數(shù)預(yù)編譯為本地代碼;在所述預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;
將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除;在所述經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替所述一個或多個IL代碼函數(shù)運(yùn)行。優(yōu)選地,其中所述以特定字符為標(biāo)志的匯編代碼段例如具體可以為以.local、.type.、和.size為標(biāo)志的匯編代碼。在本發(fā)明的一個實施例中,該方法例如還可以包括:在IL代碼函數(shù)被運(yùn)行時,判斷所述IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。在本發(fā)明的另一實施例中,該方法例如還可以包括:在利用JIT編譯所述IL代碼函數(shù)時,判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。優(yōu)選地,其中所述判斷IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯,例如具體可以通過判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識符來確認(rèn)是否執(zhí)行過所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符。優(yōu)選地,該方法所述將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除例如具體可以包括:在所述預(yù)編譯之后,生成所述IL代碼函數(shù)的列表;根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件;在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識符,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符;將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。在本發(fā)明的又一個實施例中,該方法例如還可以包括:從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。優(yōu)選地,其中所述從內(nèi)存加載本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)例如具體可以通過修改載入代碼函數(shù)實現(xiàn)。優(yōu)選地,其中所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)例如具體可以在客戶端啟動時,自動從服務(wù)器獲取至內(nèi)存。優(yōu)選地,例如還可以包括:在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時,若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對其進(jìn)行解密。在本發(fā)明的再一個實施例中,以上所述的方法由Mono執(zhí)行。優(yōu)選地,例如還可以包括:編譯所述Mono,生成更新的Mono, dll文件;將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文件。在本發(fā)明實施方式的第二方面中,提供了 一種用于保護(hù)代碼安全的裝置,例如可以包括:
預(yù)編譯單元:配置用于將一個或多個IL代碼函數(shù)預(yù)編譯為本地代碼,在所述預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;刪除單元:配置用于將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除;執(zhí)行單元:配置用于在所述經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替所述一個或多個IL代碼函數(shù)運(yùn)行。優(yōu)選地,該裝置例如還可以包括:第一判斷單元:配置用于在IL代碼函數(shù)被運(yùn)行時,判斷所述IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。優(yōu)選地,該裝置例如還可以包括:第二判斷單元:配置用于在利用JIT編譯所述IL代碼函數(shù)時,判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。優(yōu)選地,所述第一判斷單元或第二判斷單元通過判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識符來確認(rèn)是否執(zhí)行過所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符。優(yōu)選地,所述刪除單元例如具體可以包括:列表生成單元:配置用于在所述預(yù)編譯單元執(zhí)行之后,生成所述IL代碼函數(shù)的列表;查詢單元:配置用于根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件;標(biāo)記單元:配置用于在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識符,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符;替換單元:配置用于將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。優(yōu)選地,該裝置例如還可以包括:加載單元:配置用于從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。優(yōu)選地,該裝置中所述加載單元具體通過修改載入代碼函數(shù)實現(xiàn)例如可以從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。優(yōu)選地,該裝置例如還可以包括:獲取單元:配置用于在客戶端啟動時,自動從服務(wù)器獲取所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至內(nèi)存。優(yōu)選地,該裝置例如還可以包括:解密單元:配置用于在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時,若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對其進(jìn)行解密。優(yōu)選地,該裝置集成在Mono中。優(yōu)選地,該裝置例如還可以包括將集成了所述裝置的Mono進(jìn)行編譯,生成更新的Mono, dll文件,將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文件。通過對上述技術(shù)方案的描述,容易得知,本發(fā)明具有如下有益效果:
由于在本發(fā)明預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除,使得本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行,進(jìn)而使利用本地代碼保護(hù)代碼安全得到廣泛應(yīng)用;而且,將經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)刪除,在經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以本地代碼代替一個或多個IL代碼函數(shù)運(yùn)行,從而避免了 IL代碼的暴露,保護(hù)了代碼的安全;其次,由于在客戶端啟動時,自動從服務(wù)器獲取本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至內(nèi)存、從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存,進(jìn)一步避免了 IL代碼的暴露,保護(hù)了代碼的安全。


通過參考附圖閱讀下文的詳細(xì)描述,本發(fā)明示例性實施方式的上述以及其他目的、特征和優(yōu)點(diǎn)將變得易于理解。在附圖中,以示例性而非限制性的方式示出了本發(fā)明的若干實施方式,其中:圖1示意性地示出了適于實現(xiàn)本發(fā)明實施方式的示例性計算系統(tǒng)100的框圖;圖2示意性地示出了根據(jù)本發(fā)明一實施例的方法;圖3示意性地示出了根據(jù)本發(fā)明又一實施例的裝置;在附圖中,相同或?qū)?yīng)的標(biāo)號表不相同或?qū)?yīng)的部分。
具體實施例方式下面將參考若干示例性實施方式來描述本發(fā)明的原理和精神。應(yīng)當(dāng)理解,給出這些實施方式僅僅是為了使本領(lǐng)域技術(shù)人員能夠更好地理解進(jìn)而實現(xiàn)本發(fā)明,而并非以任何方式限制本發(fā)明的范圍。相反,提供這些實施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的范圍完整地傳達(dá)給本領(lǐng)域的技術(shù)人員。圖1示出了適于實現(xiàn)本發(fā)明實施方式的示例性計算系統(tǒng)100的框圖。如圖1所示,計算系統(tǒng)100可以包括:中央處理單元(CPU) 101、隨機(jī)存取存儲器(RAM) 102、只讀存儲器(ROM) 103、系統(tǒng)總線104、硬盤控制器105、鍵盤控制器106、串行接口控制器107、并行接口控制器108、顯示控制器109、硬盤110、鍵盤111、串行外部設(shè)備112、并行外部設(shè)備113和顯示器114。這些設(shè)備中,與系統(tǒng)總線104耦合的有CPU 10URAM 102, ROM 103、硬盤控制器105、鍵盤控制器106、串行控制器107、并行控制器108和顯示控制器109。硬盤110與硬盤控制器105耦合,鍵盤111與鍵盤控制器106耦合,串行外部設(shè)備112與串行接口控制器107耦合,并行外部設(shè)備113與并行接口控制器108耦合,以及顯示器114與顯示控制器109耦合。應(yīng)當(dāng)理解,圖1所述的結(jié)構(gòu)框圖僅僅是為了示例的目的,而不是對本發(fā)明范圍的限制。在某些情況下,可以根據(jù)具體情況增加或減少某些設(shè)備。本領(lǐng)域技術(shù)技術(shù)人員知道,本發(fā)明的實施方式可以實現(xiàn)為一種系統(tǒng)、方法或計算機(jī)程序產(chǎn)品。因此,本公開可以具體實現(xiàn)為以下形式,即:完全的硬件、完全的軟件(包括固件、駐留軟件、微代碼等),或者硬件和軟件結(jié)合的形式,本文一般稱為“電路”、“模塊”或“系統(tǒng)”。此外,在一些實施例中,本發(fā)明還可以實現(xiàn)為在一個或多個計算機(jī)可讀介質(zhì)中的計算機(jī)程序產(chǎn)品的形式,該計算機(jī)可讀介質(zhì)中包含計算機(jī)可讀的程序代碼??梢圆捎靡粋€或多個計算機(jī)可讀的介質(zhì)的任意組合。計算機(jī)可讀介質(zhì)可以是計算機(jī)可讀信號介質(zhì)或者計算機(jī)可讀存儲介質(zhì)。計算機(jī)可讀存儲介質(zhì)例如可以是,但不限于,電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、裝置或器件,或者任意以上的組合。計算機(jī)可讀存儲介質(zhì)的更具體的例子(非窮舉示例)例如可以包括:具有一個或多個導(dǎo)線的電連接、便攜式計算機(jī)磁盤、硬盤、隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、可擦式可編程只讀存儲器(EPR0M或閃存)、光纖、便攜式緊湊磁盤只讀存儲器(CD-ROM)、光存儲器件、磁存儲器件、或者上述的任意合適的組合。在本文件中,計算機(jī)可讀存儲介質(zhì)可以是任何包含或存儲程序的有形介質(zhì),該程序可以被指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用。計算機(jī)可讀的信號介質(zhì)可以包括在基帶中或者作為載波一部分傳播的數(shù)據(jù)信號,其中承載了計算機(jī)可讀的程序代碼。這種傳播的數(shù)據(jù)信號可以采用多種形式,包括但不限于電磁信號、光信號或上述的任意合適的組合。計算機(jī)可讀的信號介質(zhì)還可以是計算機(jī)可讀存儲介質(zhì)以外的任何計算機(jī)可讀介質(zhì),該計算機(jī)可讀介質(zhì)可以發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序。計算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括但不限于無線、電線、光纜、RF等等,或者上述的任意合適的組合。可以以一種或多種程序設(shè)計語言或其組合來編寫用于執(zhí)行本發(fā)明操作的計算機(jī)程序代碼,所述程序設(shè)計語言包括面向?qū)ο蟮某绦蛟O(shè)計語言-諸如Java、Smalltalk、C++,還包括常規(guī)的過程式程序設(shè)計語言-諸如”C ”語言或類似的程序設(shè)計語言。程序代碼可以完全地在用戶計算機(jī)上執(zhí)行、部分地在用戶計算機(jī)上執(zhí)行、作為一個獨(dú)立的軟件包執(zhí)行、部分在用戶計算機(jī)上部分在遠(yuǎn)程計算機(jī)上執(zhí)行、或者完全在遠(yuǎn)程計算機(jī)或服務(wù)器上執(zhí)行。在涉及遠(yuǎn)程計算機(jī)的情形中,遠(yuǎn)程計算機(jī)可以通過任意種類的網(wǎng)絡(luò)(包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN))連接到用戶計算機(jī),或者,可以連接到外部計算機(jī)(例如利用因特網(wǎng)服務(wù)提供商來通過因特網(wǎng)連接)。下面將參照本發(fā)明實施例的方法的流程圖和設(shè)備(或系統(tǒng))的框圖描述本發(fā)明的實施方式。應(yīng)當(dāng)理解,流程圖和/或框圖的每個方框以及流程圖和/或框圖中各方框的組合都可以由計算機(jī)程序指令實現(xiàn)。這些計算機(jī)程序指令可以提供給通用計算機(jī)、專用計算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機(jī)器,這些計算機(jī)程序指令通過計算機(jī)或其它可編程數(shù)據(jù)處理裝置執(zhí)行,產(chǎn)生了實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的裝置。也可以把這些計算機(jī)程序指令存儲在能使得計算機(jī)或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計算機(jī)可讀介質(zhì)中,這樣,存儲在計算機(jī)可讀介質(zhì)中的指令就產(chǎn)生出一個包括實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置的產(chǎn)品。也可以把計算機(jī)程序指令加載到計算機(jī)、其它可編程數(shù)據(jù)處理裝置、或其它設(shè)備上,使得在計算機(jī)、其它可編程數(shù)據(jù)處理裝置或其它設(shè)備上執(zhí)行一系列操作步驟,以產(chǎn)生計算機(jī)實現(xiàn)的過程,從而使得在計算機(jī)或其它可編程裝置上執(zhí)行的指令能夠提供實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過程。根據(jù)本發(fā)明的實施方式,提出了 一種用于保護(hù)代碼安全的方法和裝置。在本文中,需要理解的是,附圖中的任何元素數(shù)量均用于示例而非限制,以及任何命名都僅用于區(qū)分,而不具有任何限制含義。下面參考本發(fā)明的若干代表性實施方式,詳細(xì)闡釋本發(fā)明的原理和精神。發(fā)明概述
本發(fā)明人發(fā)現(xiàn),將IL代碼轉(zhuǎn)換成本地代碼是一種防止反向工程的有效方法,因為本地代碼往往難以被反向工程。如果能將以IL代碼形式存在于客戶端設(shè)備上的客戶端程序預(yù)編譯為本地代碼的形式,則可以大幅度提高保護(hù)代碼的力度。本發(fā)明人還發(fā)現(xiàn),現(xiàn)有技術(shù)中,可以將IL代碼預(yù)編譯為能夠在Linux上執(zhí)行的本地代碼,但是不能在Windows操作系統(tǒng)上運(yùn)行。然而,很多客戶端程序都是需要在Windows上運(yùn)行的。為了能夠?qū)L代碼預(yù)編譯為能夠在Windows上執(zhí)行的本地代碼以保護(hù)代碼的安全,本發(fā)明人提出在預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行,而且將經(jīng)過預(yù)編譯的IL代碼函數(shù)刪除,在經(jīng)過預(yù)編譯的IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替經(jīng)過預(yù)編譯的IL代碼函數(shù)運(yùn)行達(dá)到保護(hù)代碼安全的目的。在介紹了本發(fā)明的基本原理之后,下面具體介紹本發(fā)明的各種非限制性實施方式。應(yīng)用場景總覽例如:基于Unity3D引擎制作的游戲客戶端IL代碼程序,用Mono作為程序的運(yùn)行時庫,在該應(yīng)用場景下,本發(fā)明的實施方式可以保護(hù)基于Unity3D引擎制作的游戲客戶端IL代碼程序。但是,本領(lǐng)域技術(shù)人員可以理解,此處的場景僅是示例,本發(fā)明的思想在此方面并不受到限制。相反,本發(fā)明的實施方式可以用于保護(hù)由其他引擎制作的任何軟件客戶端代碼。示例性方法下面結(jié)合上述應(yīng)用場景,參考圖2來描述根據(jù)本發(fā)明示例性實施方式的用于該應(yīng)用場景的方法。需要注意的是,上述應(yīng)用場景僅是為了便于理解本發(fā)明的精神和原理而示出,本發(fā)明的實施方式在此方面不受任何限制。相反,本發(fā)明的實施方式可以應(yīng)用于適用的任何場景。參見圖2,該示例性方法例如可以包括:S201.將一個或多個IL代碼函數(shù)預(yù)編譯為本地代碼;S202.在所述預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;S203.將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除;S204.在所述經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替所述一個或多個IL代碼函數(shù)運(yùn)行。其中,所述以特定字符為標(biāo)志的匯編代碼段例如具體可以為以.local、.type.、和.size為標(biāo)志的匯編代碼。由于本發(fā)明方法包括將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除,在所述經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替所述一個或多個IL代碼函數(shù)運(yùn)行,因此,為了解決客戶端程序運(yùn)行階段IL代碼函數(shù)的正常調(diào)用,在本發(fā)明的一個實施例中,該方法例如還可以包括:在IL代碼函數(shù)被運(yùn)行時,判斷所述IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。需要說明的是,由于本地代碼不能進(jìn)行內(nèi)聯(lián)inline操作,如果執(zhí)行了 inline操作,則會出錯,因此,在本發(fā)明的另一實施例中,該方法例如還可以包括:在利用JIT編譯所述IL代碼函數(shù)時,判斷內(nèi)聯(lián)(inline)優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。需要說明的是,在該方法中,雖然將經(jīng)過預(yù)編譯的IL代碼函數(shù)刪除,但是可以通過在該IL代碼函數(shù)所在的DLL文件中該IL代碼函數(shù)首字節(jié)位置插入預(yù)設(shè)的固定標(biāo)識符來標(biāo)記該IL代碼函數(shù)被預(yù)編譯處理過,使得后續(xù)在調(diào)用該IL代碼函數(shù)時,能夠判斷所述IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯,進(jìn)行后續(xù)處理。因此,其中判斷IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯,例如具體可以通過判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識符來確認(rèn)是否執(zhí)行過所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符。下面對步驟S103.將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除進(jìn)行詳細(xì)介紹,在本發(fā)明的一個實施例中,該步驟例如具體可以包括:在所述預(yù)編譯之后,生成所述IL代碼函數(shù)的列表;根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件;在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識符,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符;將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。需要說明的是,在該實施例中,給出了將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除的具體辦法,雖然將經(jīng)過預(yù)編譯的IL代碼函數(shù)刪除,也仍然保留IL代碼函數(shù)所在的DLL文件,因為該IL代碼函數(shù)的DLL文件里包含了用于調(diào)用該IL代碼函數(shù)的入口,雖然保留該DLL文件,但是該文件中不存在實質(zhì)的IL代碼函數(shù),這些實質(zhì)性IL代碼函數(shù)已經(jīng)被替換為亂碼,并且通過在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識符,使得執(zhí)行程序能夠通過所述固定標(biāo)識符確定以存儲在別的DLL文件中的本地代碼代替經(jīng)過預(yù)編譯的IL代碼函數(shù)運(yùn)行。在以上實施例中所述的固定標(biāo)識符例如可以取如OxEE這樣非IL代碼使用的字符。本領(lǐng)域技術(shù)人員可以理解,此處的OxEE僅是非IL代碼使用的字符的示例,并不用于限制本發(fā)明的思想。需要說明的是,為了進(jìn)一步增加保護(hù)代碼安全的力度,使第三方無法直接通過磁盤文件獲取本地代碼和/或未經(jīng)編譯的IL代碼,因此,在本發(fā)明的又一個實施例中,例如還可以包括:從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。其中所述從內(nèi)存加載本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)例如具體可以通過修改載入代碼函數(shù)實現(xiàn)。其中所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)例如具體可以在客戶端啟動時,自動從服務(wù)器獲取至內(nèi)存。
而且,游戲客戶端產(chǎn)品還可以自己選擇一種合適的流行加密手段,例如rc4,對代碼進(jìn)行加密進(jìn)一步增加保護(hù)代碼安全的力度,因此該方法還可以包括:在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時,若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對其進(jìn)行解密。需要注意的是,此處的加密手段rc4僅是可用的加密手段的一個示例,本發(fā)明在此方面不受任何限制。在本發(fā)明的該實際應(yīng)用場景中,一個優(yōu)選的實施例是以上所述的方法由Mono執(zhí)行,也就是說,在以上所述方法中涉及到的步驟由Mono執(zhí)行,也就是將以上所述方法執(zhí)行動作集成到Mono中,相當(dāng)于對Mono的改造,使Mono在作為客戶端程序的運(yùn)行時庫時,執(zhí)行以上所述方法中涉及的步驟。在具體到Unity3D引擎制作的游戲客戶端IL代碼程序這一實際應(yīng)用中,以Mono執(zhí)行環(huán)境,因此,該方法還可以包括:編譯所述改造的Mono,生成更新的Mono, dll文件;將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文件,解決保護(hù)基于Unity3D引擎制作的游戲客戶端IL代碼程序這一實際問題。示例性裝置在介紹了本發(fā)明示例性實施方式的方法之后,接下來,參考圖3對本發(fā)明示例性實施方式的裝置進(jìn)行描述,該裝置例如可以包括:預(yù)編譯單元301:配置用于將一個或多個IL代碼函數(shù)預(yù)編譯為本地代碼,在所述預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;刪除單元302:配置用于將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除;執(zhí)行單元303:配置用于在所述經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替所述一個或多個IL代碼函數(shù)運(yùn)行。在本發(fā)明該裝置的一個優(yōu)選實施例中,例如還可以包括:第一判斷單元304:配置用于在IL代碼函數(shù)被運(yùn)行時,判斷所述IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。第二判斷單元305:配置用于在利用JIT編譯所述IL代碼函數(shù)時,判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。優(yōu)選地,所述刪除單元302例如具體可以包括:列表生成單元302A:配置用于在所述預(yù)編譯單元執(zhí)行之后,生成所述IL代碼函數(shù)的列表;查詢單元302B:配置用于根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件;標(biāo)記單元302C:配置用于在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識符,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符;替換單元302D:配置用于將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。在本發(fā)明該裝置的另一個優(yōu)選實施例中,例如還可以包括:加載單元306:配置用于從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。獲取單元307:配置用于在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時,若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對其進(jìn)行解密。解密單元308:配置用于在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時,若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對其進(jìn)行解密。在本發(fā)明該裝置的又一個優(yōu)選實施例中,例如還可以包括:該裝置集成在Mono309中。應(yīng)當(dāng)注意,盡管在上文詳細(xì)描述中提及了裝置的若干單元或子單元,但是這種劃分僅僅并非強(qiáng)制性的。實際上,根據(jù)本發(fā)明的實施方式,上文描述的兩個或更多裝置的特征和功能可以在一個裝置中具體化。反之,上文描述的一個裝置的特征和功能可以進(jìn)一步劃分為由多個裝置來具體化。此外,盡管在附圖中以特定順序描述了本發(fā)明方法的操作,但是,這并非要求或者暗示必須按照該特定順序來執(zhí)行這些操作,或是必須執(zhí)行全部所示的操作才能實現(xiàn)期望的結(jié)果。相反,流程圖中描繪的步驟可以改變執(zhí)行順序。附加地或備選地,可以省略某些步驟,將多個步驟合并為一個步驟執(zhí)行,和/或?qū)⒁粋€步驟分解為多個步驟執(zhí)行。申請文件中提及的動詞“包括”、“包含”及其詞形變化的使用不排除除了申請文件中記載的那些元素或步驟之外的元素或步驟的存在。元素前的冠詞“一”或“一個”不排除多個這種元素的存在。雖然已經(jīng)參考若干具體實施方式
描述了本發(fā)明的精神和原理,但是應(yīng)該理解,本發(fā)明并不限于所公開的具體實施方式
,對各方面的劃分也不意味著這些方面中的特征不能組合以進(jìn)行受益,這種劃分僅是為了表述的方便。本發(fā)明旨在涵蓋所附權(quán)利要求的精神和范圍內(nèi)所包括的各種修改和等同布置。所附權(quán)利要求的范圍符合最寬泛的解釋,從而包含所有這樣的修改及等同結(jié)構(gòu)和功能。
權(quán)利要求
1.一種用于保護(hù)代碼安全的方法,包括: 將一個或多個IL代碼函數(shù)預(yù)編譯為本地代碼; 在所述預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行; 將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除; 在所述經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替所述一個或多個IL代碼函數(shù)運(yùn)行。
2.根據(jù)權(quán)利要求1所述的方法,其中,所述以特定字符為標(biāo)志的匯編代碼段具體為以.local、.type.、和.size為標(biāo)志的匯編代碼。
3.根據(jù)權(quán)利要求1所述的方法,還包括: 在IL代碼函數(shù)被運(yùn)行時,判斷所述IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯; 如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行; 如果否,利用JIT編譯所述IL代碼函數(shù)。
4.根據(jù)權(quán)利要求3所述的方法,還包括: 在利用JIT編譯所述IL代碼函數(shù)時,判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯; 如果是,放棄inline優(yōu)化操作。
5.根據(jù)權(quán)利要求3或4任意一項所述的方法,其中, 所述判斷IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯,具體通過判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識符來確認(rèn)是否執(zhí)行過所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符。
6.根據(jù)權(quán)利要求1所述的方法,其中,所述將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除具體包括: 在所述預(yù)編譯之后,生成所述IL代碼函數(shù)的列表; 根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件; 在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識符,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符; 將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。
7.根據(jù)權(quán)利要求1所述的方法,還包括: 從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。
8.根據(jù)權(quán)利要求7所述的方法,其中,所述從內(nèi)存加載本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)具體通過修改載入代碼函數(shù)實現(xiàn)。
9.根據(jù)權(quán)利要求1所述的方法,其中,所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)具體在客戶端啟動時,自動從服務(wù)器獲取至內(nèi)存。
10.根據(jù)權(quán)利要求7或9任意一項所述的方法,還包括: 在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時,若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對其進(jìn)行解密。
11.根據(jù)權(quán)利要求1-4、6-9任意一項所述的方法,其中,所述方法由Mono執(zhí)行。
12.根據(jù)權(quán)利要求11所述的方法,還包括: 編譯所述Mono,生成更新的Mono, dll文件; 將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文件。
13.一種用于保護(hù)代碼安全的裝置,包括: 預(yù)編譯單元:配置用于將一個或多個IL代碼函數(shù)預(yù)編譯為本地代碼,在所述預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行; 刪除單元:配置用于將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除; 執(zhí)行單元:配置用于在所述經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替所述一個或多個IL代碼函數(shù)運(yùn)行。
14.根據(jù)權(quán)利要求13所述的裝置,其中,所述預(yù)編譯單元中所述以特定字符為標(biāo)志的匯編代碼段具體為以.local、.type.、和.size為標(biāo)志的匯編代碼。
15.根據(jù)權(quán)利要求13所述的裝置,還包括: 第一判斷單元:配置用于在IL代碼函數(shù)被運(yùn)行時,判斷所述IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。
16.根據(jù)權(quán)利要求15所述的裝置,還包括: 第二判斷單元:配置用于在利用JIT編譯所述IL代碼函數(shù)時,判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。
17.根據(jù)權(quán)利要求15或16任意一項所述的裝置,其中, 所述第一判斷單元或第二判斷單元通過判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識符來確認(rèn)是否執(zhí)行過所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符。
18.根據(jù)權(quán)利要求13所述的裝置,其中,所述刪除單元具體包括: 列表生成單元:配置用于在所述預(yù)編譯單元執(zhí)行之后,生成所述IL代碼函數(shù)的列表; 查詢單元:配置用于根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件; 標(biāo)記單元:配置用于在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識符,所述預(yù)設(shè)的固定標(biāo)識符具體為非IL代碼使用的字符; 替換單元:配置用于將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。
19.根據(jù)權(quán)利要求13所述的裝置,還包括: 加載單元:配置用于從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。
20.根據(jù)權(quán)利要求19所述的裝置,其中,所述加載單元具體通過修改載入代碼函數(shù)實現(xiàn)從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。
21.根據(jù)權(quán)利要求13所述的裝置,還包括: 獲取單元:配置用于在客戶端啟動時,自動從服務(wù)器獲取所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至內(nèi)存。
22.根據(jù)權(quán)利要求1 9或21任意一項所述的裝置,還包括:解密單元:配置用于在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時,若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對其進(jìn)行解密。
23.根據(jù)權(quán)利要求13-16、18-21任意一項所述的裝置,其中,所述裝置集成在Mono中。
24.根據(jù)權(quán)利要求23所述的裝置,還包括:將集成了所述裝置的Mono進(jìn)行編譯,生成更新的Mono, dll文件,將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文 件。
全文摘要
本發(fā)明的實施方式提供了一種用于保護(hù)代碼安全的方法。該方法包括將一個或多個IL代碼函數(shù)預(yù)編譯為本地代碼;在所述預(yù)編譯過程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;將經(jīng)過預(yù)編譯的所述一個或多個IL代碼函數(shù)刪除;在所述經(jīng)過預(yù)編譯的一個或多個IL代碼函數(shù)被運(yùn)行時,以所述本地代碼代替所述一個或多個IL代碼函數(shù)運(yùn)行。通過將以特定字符為標(biāo)志的匯編代碼段刪除,本發(fā)明的方法使得本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行,進(jìn)而使利用本地代碼保護(hù)代碼安全得到廣泛應(yīng)用。此外,本發(fā)明的實施方式提供了一種用于保護(hù)代碼安全的裝置。
文檔編號G06F21/12GK103198240SQ20121037649
公開日2013年7月10日 申請日期2012年9月29日 優(yōu)先權(quán)日2012年9月29日
發(fā)明者盧立祎, 程龍 申請人:網(wǎng)易(杭州)網(wǎng)絡(luò)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
岢岚县| 深泽县| 卓资县| 得荣县| 玉环县| 闵行区| 上犹县| 叶城县| 尤溪县| 黄平县| 萝北县| 青川县| 织金县| 邻水| 灯塔市| 安阳市| 交口县| 德清县| 常山县| 肃南| 新竹市| 会同县| 邵武市| 崇仁县| 鄢陵县| 诸城市| 屏东市| 永昌县| 呼图壁县| 平舆县| 菏泽市| 闻喜县| 遂川县| 饶阳县| 石阡县| 南雄市| 郓城县| SHOW| 睢宁县| 婺源县| 晋城|