非常多使用cocos2dx+lua做游戏的同学。都会想到一个问题,我的游戏一旦公布,如何才干保证的我脚本代码不被破解。不泄露代码。尽管这和开源、共享的原则不合。可是代码也是coder的劳动成果,理应得到保护。

特别是商业游戏更是如此,不希望被别人破解掉源代码而且进行改动。

今天的话题就是怎样实现lua脚本文件的加密和解密。

我在网络上查过,都没有成熟的解决方式。然后我经过考虑之后,总结出两种解决方式,供大家參考。

1、轻量级的解决方式。APK打包之前,用工具把全部的lua文件加密,详细是将lua文件读到内存,然后使用zip等压缩加密库进行压缩加密,然后将压缩加密之后的数据保存为和源文件同名的文件。

打包之后执行lua文件的时候。则先读出lua数据。然后进行解密。将解密后的流数据传给lua虚拟机。

2、重量级的解决方式,此方案是上一种方案的扩展。也是商用游戏的方案,实现一个游戏文件包,打包前将资源和脚本都使用工具打包到一个文件。能够在打包的时候加密压缩,也能够不加密压缩。

然后在执行的时候直接从包内读出对应文件的数据。然后解密解压缩。然后提供给游戏引擎使用。这也是端游普遍使用的技术,手游眼下大部分也開始使用此技术。

本文主要简要解说第一种方案,另外一种方案则有时间再写一篇博客。好了。我们開始进入正题吧。

首先是压缩lua文件。代码例如以下:

int write_file_content(const char* folder)
{
//获得文件数据,并压缩文件
FILE* fpin = fopen(folder, "wb+");
if (fpin == NULL)
{
printf("无法读取文件: %s\n", 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 时错误发生\n",folder);
}
printf("%s 压缩前大小:%ld 压缩后大小:%ld\n", 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\n", 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\n", folder, code);
return 0;
} //释放资源
fclose(file);
free(con); //zip_con由外部释放
bufflen = zip_size;
return zip_con。
}

最后就把此流文件塞给lua的虚拟机就可以,即以流方式执行lua代码。

当然更高级一点的方法是直接改写lua的文件载入策略。详情能够參考我的还有一篇博文,下一篇文章我会介绍把资源和脚本打包成PAK格式的技术。

改动lua的文件载入器。自己定义lua文件载入

关于cocos2dx手游lua文件加密的解决方式的更多相关文章

  1. 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

    游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...

  2. 转 图片资源加密,Lua文件加密

    游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...

  3. 【cocos2d-x 手游研发----目录】

    感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...

  4. Cocos2d-x手游技术分享(1)-【天天打蚊子】数据存储与音效篇

    前言: 手游项目<天天打蚊子>终于上线,特地写几篇技术分享文章,分享一下其中使用到的技术,其中使用cocos2d-x引擎,首选平台iOS,也请有iPhone或者iPad的朋友帮忙下载好评. ...

  5. mir9-lua——《热血沙城》45度ARPG手游-Lua移植版

    mir9——<热血沙城>,是9秒论坛开源的一个使用Cocos2d-x-2.2.1引擎开发的45度ARPG手游Demo,源代码为c++.mir9-lua是mir9的Lua移植版,使用Quic ...

  6. 【cocos2d-x 手游研发----研发思路及感想】

          我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...

  7. 【cocos2d-x 手游研发----地图活起来了】

    谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...

  8. 【cocos2d-x 手游研发----界面UI设计】

    简单探讨一下如何在cocos2d-x的游戏引擎里面去制作各做交互UI界面,常见的UI如下: 人物头像,血条值,经验条,技能按钮,以及各种玩家交互的界面按钮:背包,人物属性,门派,等: 类似上面的图示交 ...

  9. Cocos2d-x 手游聊天系统需求分析

    手游聊天系统需求分析 转载请注明:IT_xiao小巫 移动开发狂热者群:299402133 策划需求图 參考系统:刀塔传奇 点击这个.然后弹出以下的对话框 游戏类型:卡牌 分析:刀塔传奇聊天系统分为3 ...

随机推荐

  1. ASP.NE的缓存技术提高Web站点的性能

    一:我们为什么要使用缓存? 先来理解一下asp.net缓存技术的基本原理:把访问频繁的数据以及需要花大量的时间来加载的数据缓存在内存中,那么用户在下次请求同样的数据时,直接将内存中的数据返回给用户,从 ...

  2. Apache HTTP Server多个拒绝服务漏洞

    漏洞版本: Apache Group Apache HTTP Server < 2.4.9 漏洞描述: BUGTRAQ ID: 66303 CVE ID: CVE-2013-6438,CVE-2 ...

  3. JPA--联合主键

    联合主键的一些知识: 使用@EmbeddedId标示联合主键: 在联合主键类中只是定义确定联合主键的字段即可: * 联合主键类的规则 * 1.必须包含一个无参的构造函数 * 2.必须实现序列化接口 * ...

  4. About Wisdom

    All human wisdom is summed up in two words --- wait and hope.人类所有的智慧可以归结为两个词---等待和希望. —— Alexandre D ...

  5. 安装GNS3-0.8.6-all-in-one时language里没有选项

    初次安装使用GNS3,安装的版本是GNS3-0.8.6-all-in-one,本人也是菜鸟,安装时都是一路 Next,结果安装后运行出现了这样的问题,如图 language里是没有选项的,解决方法 把 ...

  6. Oracle学习网址

    Oracle Error Search: http://www.ora-error.com/ Oracle Database Error Message - Oracle Documentation: ...

  7. C# 检测机器是否有声卡设备

    有时候我们的程序需要进行音频的播放,则我们首先需要判断机器是否有声卡能够进行音频的播放.在网上找了一下没有发现太多关于如何检机器是否有声卡的例子.我在看了一些文档后自己写了一个小测试程序,如果机器装有 ...

  8. iOS 之NSJSONReadingOptions说明【转】

    首先用代码来说明NSJSONReadingMutableContainers的作用: NSString *str = @"{\"name\":\"kaixuan ...

  9. 设计模式_Decorator_装饰模式

    形象例子: Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖 ...

  10. 线性存储结构-LinkedList

    LinkedList内部采用链表的形式构建,是一个双向链表.除了继承List外,还继承了Deque接口,可以当做堆栈结构使用. private static final class Link<E ...