[置頂] 關(guān)于cocos2dx手游lua文件加密的解決方案
來源:程序員人生 發(fā)布時(shí)間:2014-12-01 08:00:06 閱讀次數(shù):3436次
很多使用cocos2dx+lua做游戲的同學(xué),都會(huì)想到1個(gè)問題,我的游戲1旦發(fā)布,怎樣才能保證的我腳本代碼不被破解,不泄漏代碼。雖然這和開源、同享的原則不合,但是代碼也是coder的勞動(dòng)成果,理應(yīng)得到保護(hù)。特別是商業(yè)游戲更是如此,不希望被他人破解掉源碼并且進(jìn)行修改。
今天的話題就是如何實(shí)現(xiàn)lua腳本文件的加密和解密。
我在網(wǎng)絡(luò)上查過,解決方案http://www.ijiami.cn/appprotect_mobile_games然后我經(jīng)過斟酌以后,總結(jié)出兩種解決方案,供大家參考。
1、輕量級(jí)的解決方案,APK打包之前,用工具把所有的lua文件加密,具體是將lua文件讀到內(nèi)存,然后使用zip等緊縮加密庫進(jìn)行緊縮加密,然后將緊縮加密以后的數(shù)據(jù)保存為和源文件同名的文件。打包以后運(yùn)行l(wèi)ua文件的時(shí)候,則先讀出lua數(shù)據(jù),然落后行解密,將解密后的流數(shù)據(jù)傳給lua虛擬機(jī)。
2、重量級(jí)的解決方案,此方案是上1種方案的擴(kuò)大,也是商用游戲的方案,實(shí)現(xiàn)1個(gè)游戲文件包,打包前將資源和腳本都使用工具打包到1個(gè)文件,可以在打包的時(shí)候加密緊縮,也能夠不加密緊縮。然后在運(yùn)行的時(shí)候直接從包內(nèi)讀出相應(yīng)文件的數(shù)據(jù),然后解密解緊縮,然后提供給游戲引擎使用。這也是端游普遍使用的技術(shù),手游目前大部份也開始使用此技術(shù)。
本文主要扼要講授第1種方案,第2種方案則有時(shí)間再寫1篇博客。好了,我們開始進(jìn)入正題吧。
首先是緊縮lua文件,代碼以下:
int write_file_content(const char* folder){
//取得文件數(shù)據(jù),并緊縮文件
FILE* fpin = fopen(folder, "wb+");
if (fpin == NULL)
{
printf("沒法讀取文件: %s
", folder);
return 0;
}
//得到文件大小
fseek(fpin, 0, SEEK_END);
unsigned int size = ftell(fpin);
//讀出文件內(nèi)容
fseek(fpin, 0, SEEK_SET);
void* con = malloc(size);
int r = fread(con, size, 1, fpin);
//進(jìn)行加密操作
unsigned long zip_con_size = size * 2;
void* zip_con = malloc(zip_con_size);
if (Z_OK != compress((Bytef*)zip_con, &zip_con_size, (Bytef*)con, size)){
printf("緊縮 %s 時(shí)產(chǎn)生毛病
",folder);
}
printf("%s 緊縮前大小:%ld 緊縮后大小:%ld
", folder, size, zip_con_size);//寫文件內(nèi)容
fseek(fpin, 0, SEEK_SET);
int len = fwrite(zip_con, zip_con_size, 1, fpin);//釋放資源
fclose(fpin);
free(zip_con);
free(con);
return 0;
}
復(fù)制代碼
然后是解密操作,代碼以下:
void* read_file_content(const char* folder, int& bufflen){
FILE* file = fopen(folder, "wb+");
if (file)
{
{
printf("沒法讀取文件: %s
", folder);
return 0;
}
//獲得文件大小
fseek(file, 0, SEEK_END);
unsigned int size = ftell(file);
//讀出文件內(nèi)容
void* con = malloc(size);
fseek(file, 0, SEEK_SET);
int len = fread(con, size, 1, file);
//解緊縮操作
unsigned long zip_size = size * 4;
void* zip_con = malloc(zip_size);
int code = uncompress((Bytef*)zip_con, &zip_size, (Bytef*)con, size);if (Z_OK != code)
{
printf("解壓 %s 時(shí)產(chǎn)生毛病 :%d
", folder, code);return 0;
}
//釋放資源
fclose(file);
free(con);
//zip_con由外部釋放
bufflen = zip_size;
return zip_con;
}
復(fù)制代碼
最后就把此流文件塞給lua的虛擬機(jī)便可,即以流方式運(yùn)行l(wèi)ua代碼。
對(duì)Android app,dex源碼文件安全性是最重要的,因此,這個(gè)dex源碼加密保護(hù)其實(shí)很有必要,在這個(gè)方面,可以做到的有愛加密這個(gè)平臺(tái),不同類型的利用也有不同的加密保護(hù)方案,詳細(xì)可以在這里了解:
http://www.ijiami.cn/appprotect_mobile_games修改lua的文件加載器,自定義lua文件加載
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)