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