專利名稱:一種用于保護(hù)代碼安全的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明的實(shí)施方式涉及軟件開發(fā)領(lǐng)域,更具體地,本發(fā)明的實(shí)施方式涉及一種適用于保護(hù)代碼安全的方法和裝置。
背景技術(shù):
本部分旨在為權(quán)利要求書中陳述的本發(fā)明的實(shí)施方式提供背景或上下文。此處的描述可包括可以探究的概念,但不一定是之前已經(jīng)想到或者已經(jīng)探究的概念。因此,除非在此指出,否則在本部分中描述的內(nèi)容對(duì)于本申請(qǐng)的說(shuō)明書和權(quán)利要求書而言不是現(xiàn)有技術(shù),并且并不因?yàn)榘ㄔ诒静糠种芯统姓J(rèn)是現(xiàn)有技術(shù)。在軟件開發(fā)領(lǐng)域,如何保護(hù)程序代碼的安全一直是人們所關(guān)注的問(wèn)題。如果不對(duì)程序代碼進(jìn)行必要的保護(hù)措施,借助于一些第三方工具,就能輕而易舉的獲取程序代碼,容易被破解和外掛,甚至被別的無(wú)良的人直接拿去改造重新發(fā)行。在現(xiàn)有技術(shù)中,已經(jīng)出現(xiàn)一些保護(hù)代碼安全的方法,例如《QQ樂(lè)團(tuán)》使用了代碼混淆的方式對(duì)其游戲客戶端進(jìn)行加密保護(hù)。所謂代碼混淆就是將原本人類能直接讀懂的代碼,用機(jī)器的方式轉(zhuǎn)換為人類讀寫都非?;逎脑创a,然后進(jìn)行編譯使用,比如將classCatclass Dog轉(zhuǎn)換成class 1011 class 1101等人類難以理解的代碼,從而提高了源代碼的安全性。雖然代碼混淆的方式在一定程度上可以避免源代碼的泄漏。但是對(duì)于稍有基礎(chǔ)的技術(shù)人員來(lái)說(shuō),通過(guò)已經(jīng)被混淆的代碼還原出編程者的原始意圖也并非難事,因?yàn)榻?jīng)過(guò)混淆的代碼依然有比較清晰的脈絡(luò),借助人力的翻譯,將局部的代碼反編譯出來(lái),就能破解軟件的關(guān)鍵部分。
發(fā)明內(nèi)容
但是,對(duì)于中間語(yǔ)言(IL)代碼來(lái)說(shuō),其經(jīng)過(guò)預(yù)編譯生成的本地代碼無(wú)法在Windows操作系統(tǒng)上運(yùn)行使得無(wú)法廣泛利用本地代碼來(lái)保護(hù)代碼安全。因此在現(xiàn)有技術(shù)中,保護(hù)代碼安全是非常令人煩惱的問(wèn)題。為此,非常需要一種改進(jìn)的保護(hù)代碼安全的方法,以使IL代碼經(jīng)過(guò)預(yù)編譯生成的本地代碼能夠在Windows操作系統(tǒng)上運(yùn)行,進(jìn)而使利用本地代碼保護(hù)代碼安全得到廣泛應(yīng)用。在本上下文中,本發(fā)明的實(shí)施方式期望提供一種用于保護(hù)代碼安全的方法和裝置。在本發(fā)明實(shí)施方式的第一方面中,提供了一種用于保護(hù)代碼安全的方法,例如可以包括:將一個(gè)或多個(gè)IL代碼函數(shù)預(yù)編譯為本地代碼;在所述預(yù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;
將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除;在所述經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替所述一個(gè)或多個(gè)IL代碼函數(shù)運(yùn)行。優(yōu)選地,其中所述以特定字符為標(biāo)志的匯編代碼段例如具體可以為以.local、.type.、和.size為標(biāo)志的匯編代碼。在本發(fā)明的一個(gè)實(shí)施例中,該方法例如還可以包括:在IL代碼函數(shù)被運(yùn)行時(shí),判斷所述IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。在本發(fā)明的另一實(shí)施例中,該方法例如還可以包括:在利用JIT編譯所述IL代碼函數(shù)時(shí),判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。優(yōu)選地,其中所述判斷IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯,例如具體可以通過(guò)判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識(shí)符來(lái)確認(rèn)是否執(zhí)行過(guò)所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符。優(yōu)選地,該方法所述將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除例如具體可以包括:在所述預(yù)編譯之后,生成所述IL代碼函數(shù)的列表;根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件;在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識(shí)符,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符;將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。在本發(fā)明的又一個(gè)實(shí)施例中,該方法例如還可以包括:從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。優(yōu)選地,其中所述從內(nèi)存加載本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)例如具體可以通過(guò)修改載入代碼函數(shù)實(shí)現(xiàn)。優(yōu)選地,其中所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)例如具體可以在客戶端啟動(dòng)時(shí),自動(dòng)從服務(wù)器獲取至內(nèi)存。優(yōu)選地,例如還可以包括:在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時(shí),若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對(duì)其進(jìn)行解密。在本發(fā)明的再一個(gè)實(shí)施例中,以上所述的方法由Mono執(zhí)行。優(yōu)選地,例如還可以包括:編譯所述Mono,生成更新的Mono, dll文件;將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文件。在本發(fā)明實(shí)施方式的第二方面中,提供了 一種用于保護(hù)代碼安全的裝置,例如可以包括:
預(yù)編譯單元:配置用于將一個(gè)或多個(gè)IL代碼函數(shù)預(yù)編譯為本地代碼,在所述預(yù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;刪除單元:配置用于將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除;執(zhí)行單元:配置用于在所述經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替所述一個(gè)或多個(gè)IL代碼函數(shù)運(yùn)行。優(yōu)選地,該裝置例如還可以包括:第一判斷單元:配置用于在IL代碼函數(shù)被運(yùn)行時(shí),判斷所述IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。優(yōu)選地,該裝置例如還可以包括:第二判斷單元:配置用于在利用JIT編譯所述IL代碼函數(shù)時(shí),判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。優(yōu)選地,所述第一判斷單元或第二判斷單元通過(guò)判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識(shí)符來(lái)確認(rèn)是否執(zhí)行過(guò)所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符。優(yōu)選地,所述刪除單元例如具體可以包括:列表生成單元:配置用于在所述預(yù)編譯單元執(zhí)行之后,生成所述IL代碼函數(shù)的列表;查詢單元:配置用于根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件;標(biāo)記單元:配置用于在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識(shí)符,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符;替換單元:配置用于將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。優(yōu)選地,該裝置例如還可以包括:加載單元:配置用于從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。優(yōu)選地,該裝置中所述加載單元具體通過(guò)修改載入代碼函數(shù)實(shí)現(xiàn)例如可以從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。優(yōu)選地,該裝置例如還可以包括:獲取單元:配置用于在客戶端啟動(dòng)時(shí),自動(dòng)從服務(wù)器獲取所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至內(nèi)存。優(yōu)選地,該裝置例如還可以包括:解密單元:配置用于在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時(shí),若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對(duì)其進(jìn)行解密。優(yōu)選地,該裝置集成在Mono中。優(yōu)選地,該裝置例如還可以包括將集成了所述裝置的Mono進(jìn)行編譯,生成更新的Mono, dll文件,將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文件。通過(guò)對(duì)上述技術(shù)方案的描述,容易得知,本發(fā)明具有如下有益效果:
由于在本發(fā)明預(yù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除,使得本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行,進(jìn)而使利用本地代碼保護(hù)代碼安全得到廣泛應(yīng)用;而且,將經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)刪除,在經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以本地代碼代替一個(gè)或多個(gè)IL代碼函數(shù)運(yùn)行,從而避免了 IL代碼的暴露,保護(hù)了代碼的安全;其次,由于在客戶端啟動(dòng)時(shí),自動(dòng)從服務(wù)器獲取本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至內(nèi)存、從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存,進(jìn)一步避免了 IL代碼的暴露,保護(hù)了代碼的安全。
通過(guò)參考附圖閱讀下文的詳細(xì)描述,本發(fā)明示例性實(shí)施方式的上述以及其他目的、特征和優(yōu)點(diǎn)將變得易于理解。在附圖中,以示例性而非限制性的方式示出了本發(fā)明的若干實(shí)施方式,其中:圖1示意性地示出了適于實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算系統(tǒng)100的框圖;圖2示意性地示出了根據(jù)本發(fā)明一實(shí)施例的方法;圖3示意性地示出了根據(jù)本發(fā)明又一實(shí)施例的裝置;在附圖中,相同或?qū)?yīng)的標(biāo)號(hào)表不相同或?qū)?yīng)的部分。
具體實(shí)施例方式下面將參考若干示例性實(shí)施方式來(lái)描述本發(fā)明的原理和精神。應(yīng)當(dāng)理解,給出這些實(shí)施方式僅僅是為了使本領(lǐng)域技術(shù)人員能夠更好地理解進(jìn)而實(shí)現(xiàn)本發(fā)明,而并非以任何方式限制本發(fā)明的范圍。相反,提供這些實(shí)施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的范圍完整地傳達(dá)給本領(lǐng)域的技術(shù)人員。圖1示出了適于實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算系統(tǒng)100的框圖。如圖1所示,計(jì)算系統(tǒng)100可以包括:中央處理單元(CPU) 101、隨機(jī)存取存儲(chǔ)器(RAM) 102、只讀存儲(chǔ)器(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)框圖僅僅是為了示例的目的,而不是對(duì)本發(fā)明范圍的限制。在某些情況下,可以根據(jù)具體情況增加或減少某些設(shè)備。本領(lǐng)域技術(shù)技術(shù)人員知道,本發(fā)明的實(shí)施方式可以實(shí)現(xiàn)為一種系統(tǒng)、方法或計(jì)算機(jī)程序產(chǎn)品。因此,本公開可以具體實(shí)現(xiàn)為以下形式,即:完全的硬件、完全的軟件(包括固件、駐留軟件、微代碼等),或者硬件和軟件結(jié)合的形式,本文一般稱為“電路”、“模塊”或“系統(tǒng)”。此外,在一些實(shí)施例中,本發(fā)明還可以實(shí)現(xiàn)為在一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì)中的計(jì)算機(jī)程序產(chǎn)品的形式,該計(jì)算機(jī)可讀介質(zhì)中包含計(jì)算機(jī)可讀的程序代碼??梢圆捎靡粋€(gè)或多個(gè)計(jì)算機(jī)可讀的介質(zhì)的任意組合。計(jì)算機(jī)可讀介質(zhì)可以是計(jì)算機(jī)可讀信號(hào)介質(zhì)或者計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)例如可以是,但不限于,電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、裝置或器件,或者任意以上的組合。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的更具體的例子(非窮舉示例)例如可以包括:具有一個(gè)或多個(gè)導(dǎo)線的電連接、便攜式計(jì)算機(jī)磁盤、硬盤、隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、可擦式可編程只讀存儲(chǔ)器(EPR0M或閃存)、光纖、便攜式緊湊磁盤只讀存儲(chǔ)器(CD-ROM)、光存儲(chǔ)器件、磁存儲(chǔ)器件、或者上述的任意合適的組合。在本文件中,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是任何包含或存儲(chǔ)程序的有形介質(zhì),該程序可以被指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用。計(jì)算機(jī)可讀的信號(hào)介質(zhì)可以包括在基帶中或者作為載波一部分傳播的數(shù)據(jù)信號(hào),其中承載了計(jì)算機(jī)可讀的程序代碼。這種傳播的數(shù)據(jù)信號(hào)可以采用多種形式,包括但不限于電磁信號(hào)、光信號(hào)或上述的任意合適的組合。計(jì)算機(jī)可讀的信號(hào)介質(zhì)還可以是計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)以外的任何計(jì)算機(jī)可讀介質(zhì),該計(jì)算機(jī)可讀介質(zhì)可以發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序。計(jì)算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括但不限于無(wú)線、電線、光纜、RF等等,或者上述的任意合適的組合。可以以一種或多種程序設(shè)計(jì)語(yǔ)言或其組合來(lái)編寫用于執(zhí)行本發(fā)明操作的計(jì)算機(jī)程序代碼,所述程序設(shè)計(jì)語(yǔ)言包括面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言-諸如Java、Smalltalk、C++,還包括常規(guī)的過(guò)程式程序設(shè)計(jì)語(yǔ)言-諸如”C ”語(yǔ)言或類似的程序設(shè)計(jì)語(yǔ)言。程序代碼可以完全地在用戶計(jì)算機(jī)上執(zhí)行、部分地在用戶計(jì)算機(jī)上執(zhí)行、作為一個(gè)獨(dú)立的軟件包執(zhí)行、部分在用戶計(jì)算機(jī)上部分在遠(yuǎn)程計(jì)算機(jī)上執(zhí)行、或者完全在遠(yuǎn)程計(jì)算機(jī)或服務(wù)器上執(zhí)行。在涉及遠(yuǎn)程計(jì)算機(jī)的情形中,遠(yuǎn)程計(jì)算機(jī)可以通過(guò)任意種類的網(wǎng)絡(luò)(包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN))連接到用戶計(jì)算機(jī),或者,可以連接到外部計(jì)算機(jī)(例如利用因特網(wǎng)服務(wù)提供商來(lái)通過(guò)因特網(wǎng)連接)。下面將參照本發(fā)明實(shí)施例的方法的流程圖和設(shè)備(或系統(tǒng))的框圖描述本發(fā)明的實(shí)施方式。應(yīng)當(dāng)理解,流程圖和/或框圖的每個(gè)方框以及流程圖和/或框圖中各方框的組合都可以由計(jì)算機(jī)程序指令實(shí)現(xiàn)。這些計(jì)算機(jī)程序指令可以提供給通用計(jì)算機(jī)、專用計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機(jī)器,這些計(jì)算機(jī)程序指令通過(guò)計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置執(zhí)行,產(chǎn)生了實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的裝置。也可以把這些計(jì)算機(jī)程序指令存儲(chǔ)在能使得計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計(jì)算機(jī)可讀介質(zhì)中,這樣,存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)中的指令就產(chǎn)生出一個(gè)包括實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置的產(chǎn)品。也可以把計(jì)算機(jī)程序指令加載到計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置、或其它設(shè)備上,使得在計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置或其它設(shè)備上執(zhí)行一系列操作步驟,以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的過(guò)程,從而使得在計(jì)算機(jī)或其它可編程裝置上執(zhí)行的指令能夠提供實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過(guò)程。根據(jù)本發(fā)明的實(shí)施方式,提出了 一種用于保護(hù)代碼安全的方法和裝置。在本文中,需要理解的是,附圖中的任何元素?cái)?shù)量均用于示例而非限制,以及任何命名都僅用于區(qū)分,而不具有任何限制含義。下面參考本發(fā)明的若干代表性實(shí)施方式,詳細(xì)闡釋本發(fā)明的原理和精神。發(fā)明概述
本發(fā)明人發(fā)現(xiàn),將IL代碼轉(zhuǎn)換成本地代碼是一種防止反向工程的有效方法,因?yàn)楸镜卮a往往難以被反向工程。如果能將以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ù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行,而且將經(jīng)過(guò)預(yù)編譯的IL代碼函數(shù)刪除,在經(jīng)過(guò)預(yù)編譯的IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替經(jīng)過(guò)預(yù)編譯的IL代碼函數(shù)運(yùn)行達(dá)到保護(hù)代碼安全的目的。在介紹了本發(fā)明的基本原理之后,下面具體介紹本發(fā)明的各種非限制性實(shí)施方式。應(yīng)用場(chǎng)景總覽例如:基于Unity3D引擎制作的游戲客戶端IL代碼程序,用Mono作為程序的運(yùn)行時(shí)庫(kù),在該應(yīng)用場(chǎng)景下,本發(fā)明的實(shí)施方式可以保護(hù)基于Unity3D引擎制作的游戲客戶端IL代碼程序。但是,本領(lǐng)域技術(shù)人員可以理解,此處的場(chǎng)景僅是示例,本發(fā)明的思想在此方面并不受到限制。相反,本發(fā)明的實(shí)施方式可以用于保護(hù)由其他引擎制作的任何軟件客戶端代碼。示例性方法下面結(jié)合上述應(yīng)用場(chǎng)景,參考圖2來(lái)描述根據(jù)本發(fā)明示例性實(shí)施方式的用于該應(yīng)用場(chǎng)景的方法。需要注意的是,上述應(yīng)用場(chǎng)景僅是為了便于理解本發(fā)明的精神和原理而示出,本發(fā)明的實(shí)施方式在此方面不受任何限制。相反,本發(fā)明的實(shí)施方式可以應(yīng)用于適用的任何場(chǎng)景。參見圖2,該示例性方法例如可以包括:S201.將一個(gè)或多個(gè)IL代碼函數(shù)預(yù)編譯為本地代碼;S202.在所述預(yù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;S203.將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除;S204.在所述經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替所述一個(gè)或多個(gè)IL代碼函數(shù)運(yùn)行。其中,所述以特定字符為標(biāo)志的匯編代碼段例如具體可以為以.local、.type.、和.size為標(biāo)志的匯編代碼。由于本發(fā)明方法包括將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除,在所述經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替所述一個(gè)或多個(gè)IL代碼函數(shù)運(yùn)行,因此,為了解決客戶端程序運(yùn)行階段IL代碼函數(shù)的正常調(diào)用,在本發(fā)明的一個(gè)實(shí)施例中,該方法例如還可以包括:在IL代碼函數(shù)被運(yùn)行時(shí),判斷所述IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。需要說(shuō)明的是,由于本地代碼不能進(jìn)行內(nèi)聯(lián)inline操作,如果執(zhí)行了 inline操作,則會(huì)出錯(cuò),因此,在本發(fā)明的另一實(shí)施例中,該方法例如還可以包括:在利用JIT編譯所述IL代碼函數(shù)時(shí),判斷內(nèi)聯(lián)(inline)優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。需要說(shuō)明的是,在該方法中,雖然將經(jīng)過(guò)預(yù)編譯的IL代碼函數(shù)刪除,但是可以通過(guò)在該IL代碼函數(shù)所在的DLL文件中該IL代碼函數(shù)首字節(jié)位置插入預(yù)設(shè)的固定標(biāo)識(shí)符來(lái)標(biāo)記該IL代碼函數(shù)被預(yù)編譯處理過(guò),使得后續(xù)在調(diào)用該IL代碼函數(shù)時(shí),能夠判斷所述IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯,進(jìn)行后續(xù)處理。因此,其中判斷IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯,例如具體可以通過(guò)判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識(shí)符來(lái)確認(rèn)是否執(zhí)行過(guò)所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符。下面對(duì)步驟S103.將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除進(jìn)行詳細(xì)介紹,在本發(fā)明的一個(gè)實(shí)施例中,該步驟例如具體可以包括:在所述預(yù)編譯之后,生成所述IL代碼函數(shù)的列表;根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件;在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識(shí)符,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符;將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。需要說(shuō)明的是,在該實(shí)施例中,給出了將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除的具體辦法,雖然將經(jīng)過(guò)預(yù)編譯的IL代碼函數(shù)刪除,也仍然保留IL代碼函數(shù)所在的DLL文件,因?yàn)樵揑L代碼函數(shù)的DLL文件里包含了用于調(diào)用該IL代碼函數(shù)的入口,雖然保留該DLL文件,但是該文件中不存在實(shí)質(zhì)的IL代碼函數(shù),這些實(shí)質(zhì)性IL代碼函數(shù)已經(jīng)被替換為亂碼,并且通過(guò)在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識(shí)符,使得執(zhí)行程序能夠通過(guò)所述固定標(biāo)識(shí)符確定以存儲(chǔ)在別的DLL文件中的本地代碼代替經(jīng)過(guò)預(yù)編譯的IL代碼函數(shù)運(yùn)行。在以上實(shí)施例中所述的固定標(biāo)識(shí)符例如可以取如OxEE這樣非IL代碼使用的字符。本領(lǐng)域技術(shù)人員可以理解,此處的OxEE僅是非IL代碼使用的字符的示例,并不用于限制本發(fā)明的思想。需要說(shuō)明的是,為了進(jìn)一步增加保護(hù)代碼安全的力度,使第三方無(wú)法直接通過(guò)磁盤文件獲取本地代碼和/或未經(jīng)編譯的IL代碼,因此,在本發(fā)明的又一個(gè)實(shí)施例中,例如還可以包括:從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。其中所述從內(nèi)存加載本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)例如具體可以通過(guò)修改載入代碼函數(shù)實(shí)現(xiàn)。其中所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)例如具體可以在客戶端啟動(dòng)時(shí),自動(dòng)從服務(wù)器獲取至內(nèi)存。
而且,游戲客戶端產(chǎn)品還可以自己選擇一種合適的流行加密手段,例如rc4,對(duì)代碼進(jìn)行加密進(jìn)一步增加保護(hù)代碼安全的力度,因此該方法還可以包括:在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時(shí),若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對(duì)其進(jìn)行解密。需要注意的是,此處的加密手段rc4僅是可用的加密手段的一個(gè)示例,本發(fā)明在此方面不受任何限制。在本發(fā)明的該實(shí)際應(yīng)用場(chǎng)景中,一個(gè)優(yōu)選的實(shí)施例是以上所述的方法由Mono執(zhí)行,也就是說(shuō),在以上所述方法中涉及到的步驟由Mono執(zhí)行,也就是將以上所述方法執(zhí)行動(dòng)作集成到Mono中,相當(dāng)于對(duì)Mono的改造,使Mono在作為客戶端程序的運(yùn)行時(shí)庫(kù)時(shí),執(zhí)行以上所述方法中涉及的步驟。在具體到Unity3D引擎制作的游戲客戶端IL代碼程序這一實(shí)際應(yīng)用中,以Mono執(zhí)行環(huán)境,因此,該方法還可以包括:編譯所述改造的Mono,生成更新的Mono, dll文件;將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文件,解決保護(hù)基于Unity3D引擎制作的游戲客戶端IL代碼程序這一實(shí)際問(wèn)題。示例性裝置在介紹了本發(fā)明示例性實(shí)施方式的方法之后,接下來(lái),參考圖3對(duì)本發(fā)明示例性實(shí)施方式的裝置進(jìn)行描述,該裝置例如可以包括:預(yù)編譯單元301:配置用于將一個(gè)或多個(gè)IL代碼函數(shù)預(yù)編譯為本地代碼,在所述預(yù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;刪除單元302:配置用于將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除;執(zhí)行單元303:配置用于在所述經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替所述一個(gè)或多個(gè)IL代碼函數(shù)運(yùn)行。在本發(fā)明該裝置的一個(gè)優(yōu)選實(shí)施例中,例如還可以包括:第一判斷單元304:配置用于在IL代碼函數(shù)被運(yùn)行時(shí),判斷所述IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。第二判斷單元305:配置用于在利用JIT編譯所述IL代碼函數(shù)時(shí),判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過(guò)所述預(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)識(shí)符,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符;替換單元302D:配置用于將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。在本發(fā)明該裝置的另一個(gè)優(yōu)選實(shí)施例中,例如還可以包括:加載單元306:配置用于從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。獲取單元307:配置用于在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時(shí),若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對(duì)其進(jìn)行解密。解密單元308:配置用于在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時(shí),若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對(duì)其進(jìn)行解密。在本發(fā)明該裝置的又一個(gè)優(yōu)選實(shí)施例中,例如還可以包括:該裝置集成在Mono309中。應(yīng)當(dāng)注意,盡管在上文詳細(xì)描述中提及了裝置的若干單元或子單元,但是這種劃分僅僅并非強(qiáng)制性的。實(shí)際上,根據(jù)本發(fā)明的實(shí)施方式,上文描述的兩個(gè)或更多裝置的特征和功能可以在一個(gè)裝置中具體化。反之,上文描述的一個(gè)裝置的特征和功能可以進(jìn)一步劃分為由多個(gè)裝置來(lái)具體化。此外,盡管在附圖中以特定順序描述了本發(fā)明方法的操作,但是,這并非要求或者暗示必須按照該特定順序來(lái)執(zhí)行這些操作,或是必須執(zhí)行全部所示的操作才能實(shí)現(xiàn)期望的結(jié)果。相反,流程圖中描繪的步驟可以改變執(zhí)行順序。附加地或備選地,可以省略某些步驟,將多個(gè)步驟合并為一個(gè)步驟執(zhí)行,和/或?qū)⒁粋€(gè)步驟分解為多個(gè)步驟執(zhí)行。申請(qǐng)文件中提及的動(dòng)詞“包括”、“包含”及其詞形變化的使用不排除除了申請(qǐng)文件中記載的那些元素或步驟之外的元素或步驟的存在。元素前的冠詞“一”或“一個(gè)”不排除多個(gè)這種元素的存在。雖然已經(jīng)參考若干具體實(shí)施方式
描述了本發(fā)明的精神和原理,但是應(yīng)該理解,本發(fā)明并不限于所公開的具體實(shí)施方式
,對(duì)各方面的劃分也不意味著這些方面中的特征不能組合以進(jìn)行受益,這種劃分僅是為了表述的方便。本發(fā)明旨在涵蓋所附權(quán)利要求的精神和范圍內(nèi)所包括的各種修改和等同布置。所附權(quán)利要求的范圍符合最寬泛的解釋,從而包含所有這樣的修改及等同結(jié)構(gòu)和功能。
權(quán)利要求
1.一種用于保護(hù)代碼安全的方法,包括: 將一個(gè)或多個(gè)IL代碼函數(shù)預(yù)編譯為本地代碼; 在所述預(yù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行; 將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除; 在所述經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替所述一個(gè)或多個(gè)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)行時(shí),判斷所述IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯; 如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行; 如果否,利用JIT編譯所述IL代碼函數(shù)。
4.根據(jù)權(quán)利要求3所述的方法,還包括: 在利用JIT編譯所述IL代碼函數(shù)時(shí),判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯; 如果是,放棄inline優(yōu)化操作。
5.根據(jù)權(quán)利要求3或4任意一項(xiàng)所述的方法,其中, 所述判斷IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯,具體通過(guò)判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識(shí)符來(lái)確認(rèn)是否執(zhí)行過(guò)所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符。
6.根據(jù)權(quán)利要求1所述的方法,其中,所述將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除具體包括: 在所述預(yù)編譯之后,生成所述IL代碼函數(shù)的列表; 根據(jù)所述IL代碼函數(shù)的列表,確定所述IL代碼函數(shù)名和所述IL代碼函數(shù)所在DLL文件; 在所述DLL文件中所述IL代碼函數(shù)所在的首字節(jié)位置加入固定標(biāo)識(shí)符,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非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ù)具體通過(guò)修改載入代碼函數(shù)實(shí)現(xiàn)。
9.根據(jù)權(quán)利要求1所述的方法,其中,所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)具體在客戶端啟動(dòng)時(shí),自動(dòng)從服務(wù)器獲取至內(nèi)存。
10.根據(jù)權(quán)利要求7或9任意一項(xiàng)所述的方法,還包括: 在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時(shí),若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對(duì)其進(jìn)行解密。
11.根據(jù)權(quán)利要求1-4、6-9任意一項(xiàng)所述的方法,其中,所述方法由Mono執(zhí)行。
12.根據(jù)權(quán)利要求11所述的方法,還包括: 編譯所述Mono,生成更新的Mono, dll文件; 將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文件。
13.一種用于保護(hù)代碼安全的裝置,包括: 預(yù)編譯單元:配置用于將一個(gè)或多個(gè)IL代碼函數(shù)預(yù)編譯為本地代碼,在所述預(yù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行; 刪除單元:配置用于將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除; 執(zhí)行單元:配置用于在所述經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替所述一個(gè)或多個(gè)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)行時(shí),判斷所述IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,以所述IL代碼函數(shù)在所述預(yù)編譯后生成的本地代碼代替所述代碼函數(shù)運(yùn)行;如果否,利用JIT編譯所述IL代碼函數(shù)。
16.根據(jù)權(quán)利要求15所述的裝置,還包括: 第二判斷單元:配置用于在利用JIT編譯所述IL代碼函數(shù)時(shí),判斷內(nèi)聯(lián)inline優(yōu)化操作展開的IL代碼函數(shù)是否執(zhí)行過(guò)所述預(yù)編譯;如果是,放棄inline優(yōu)化操作。
17.根據(jù)權(quán)利要求15或16任意一項(xiàng)所述的裝置,其中, 所述第一判斷單元或第二判斷單元通過(guò)判斷所述IL代碼函數(shù)中首字節(jié)位置是否包含預(yù)設(shè)的固定標(biāo)識(shí)符來(lái)確認(rèn)是否執(zhí)行過(guò)所述預(yù)編譯,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非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)識(shí)符,所述預(yù)設(shè)的固定標(biāo)識(shí)符具體為非IL代碼使用的字符; 替換單元:配置用于將所述DLL文件中所述IL代碼函數(shù)替換為亂碼。
19.根據(jù)權(quán)利要求13所述的裝置,還包括: 加載單元:配置用于從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。
20.根據(jù)權(quán)利要求19所述的裝置,其中,所述加載單元具體通過(guò)修改載入代碼函數(shù)實(shí)現(xiàn)從內(nèi)存加載所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至執(zhí)行程序用的內(nèi)存。
21.根據(jù)權(quán)利要求13所述的裝置,還包括: 獲取單元:配置用于在客戶端啟動(dòng)時(shí),自動(dòng)從服務(wù)器獲取所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)至內(nèi)存。
22.根據(jù)權(quán)利要求1 9或21任意一項(xiàng)所述的裝置,還包括:解密單元:配置用于在所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)進(jìn)入內(nèi)存時(shí),若所述本地代碼和/或未經(jīng)編譯的IL代碼函數(shù)為加密狀態(tài),對(duì)其進(jìn)行解密。
23.根據(jù)權(quán)利要求13-16、18-21任意一項(xiàng)所述的裝置,其中,所述裝置集成在Mono中。
24.根據(jù)權(quán)利要求23所述的裝置,還包括:將集成了所述裝置的Mono進(jìn)行編譯,生成更新的Mono, dll文件,將Unity3D引擎自帶的Mono, dll文件替換為所述更新的Mono, dll文 件。
全文摘要
本發(fā)明的實(shí)施方式提供了一種用于保護(hù)代碼安全的方法。該方法包括將一個(gè)或多個(gè)IL代碼函數(shù)預(yù)編譯為本地代碼;在所述預(yù)編譯過(guò)程中,將以特定字符為標(biāo)志的匯編代碼段刪除以使所述本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行;將經(jīng)過(guò)預(yù)編譯的所述一個(gè)或多個(gè)IL代碼函數(shù)刪除;在所述經(jīng)過(guò)預(yù)編譯的一個(gè)或多個(gè)IL代碼函數(shù)被運(yùn)行時(shí),以所述本地代碼代替所述一個(gè)或多個(gè)IL代碼函數(shù)運(yùn)行。通過(guò)將以特定字符為標(biāo)志的匯編代碼段刪除,本發(fā)明的方法使得本地代碼能夠在Windows操作系統(tǒng)下運(yùn)行,進(jìn)而使利用本地代碼保護(hù)代碼安全得到廣泛應(yīng)用。此外,本發(fā)明的實(shí)施方式提供了一種用于保護(hù)代碼安全的裝置。
文檔編號(hào)G06F21/12GK103198240SQ20121037649
公開日2013年7月10日 申請(qǐng)日期2012年9月29日 優(yōu)先權(quán)日2012年9月29日
發(fā)明者盧立祎, 程龍 申請(qǐng)人:網(wǎng)易(杭州)網(wǎng)絡(luò)有限公司