关于cocos2dx手游lua文件加密的解决方式
非常多使用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格式的技术。
关于cocos2dx手游lua文件加密的解决方式的更多相关文章
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】
游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...
- 转 图片资源加密,Lua文件加密
游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...
- 【cocos2d-x 手游研发----目录】
感谢大家一直支持我写这样一系列的博客,从中我自己也获益良多,cocos2d-x这样一款非常棒的引擎,是值得我们去学习和分享的,谈到分享,那我就把这套写了差不多一两个月的框架给大家开源下载,写的很一般, ...
- Cocos2d-x手游技术分享(1)-【天天打蚊子】数据存储与音效篇
前言: 手游项目<天天打蚊子>终于上线,特地写几篇技术分享文章,分享一下其中使用到的技术,其中使用cocos2d-x引擎,首选平台iOS,也请有iPhone或者iPad的朋友帮忙下载好评. ...
- mir9-lua——《热血沙城》45度ARPG手游-Lua移植版
mir9——<热血沙城>,是9秒论坛开源的一个使用Cocos2d-x-2.2.1引擎开发的45度ARPG手游Demo,源代码为c++.mir9-lua是mir9的Lua移植版,使用Quic ...
- 【cocos2d-x 手游研发----研发思路及感想】
我半年前进入了目前的这家做教育行业的公司(在此之前一直从事原生态开发手游的迷茫之路),学习是一件很快乐的事情,来到这家公司我有了很多时间去学习,不管是公司业务,还是其他技术相关的.于是开始 ...
- 【cocos2d-x 手游研发----地图活起来了】
谈到地图不少人都说要做地图编辑器了,但是我暂时绕过这一步,如果不用寻路地图就不能移动?寻路就是会绕过障碍物的算法. 我做了一个简单的地图的思想,就是地图分层3层:背景层.可行区域层.遮罩层,但是地图就 ...
- 【cocos2d-x 手游研发----界面UI设计】
简单探讨一下如何在cocos2d-x的游戏引擎里面去制作各做交互UI界面,常见的UI如下: 人物头像,血条值,经验条,技能按钮,以及各种玩家交互的界面按钮:背包,人物属性,门派,等: 类似上面的图示交 ...
- Cocos2d-x 手游聊天系统需求分析
手游聊天系统需求分析 转载请注明:IT_xiao小巫 移动开发狂热者群:299402133 策划需求图 參考系统:刀塔传奇 点击这个.然后弹出以下的对话框 游戏类型:卡牌 分析:刀塔传奇聊天系统分为3 ...
随机推荐
- 用shell写个100以内的所有数字之和
#!/bin/bash i=2 while ((i<=100));do j=2 while ((j<=i/2));do if ((i%j==0));then break fi let j+ ...
- 大四实习准备1_java构造器_android ListView
2015-4-23 Java构造器 与类名同名;无返回值(void也不行);被不同的修饰符修饰是有区别的;当构造函数被private修饰时,只有本类可访问.其他类可以通过该类的get函数得到对象.如单 ...
- BZOJ2140: 稳定婚姻
题解: 题意就是求二分图的必须边. 我们有结论: 在残量网络上跑tarjan,对于一条边(u,v) 如果该边满流||scc[u]==scc[v],那么该边是可行边. 因为如果scc[u]==scc[v ...
- 【Web前沿技术】纯 CSS3 打造的10个精美加载进度条动画
之前向大家介绍8款优秀的 jQuery 加载动画和进度条插件,今天这篇文章向大家推荐10个纯 CSS3 代码实现精美加载进度条动画效果的方案.加载动画和进度条在网站和 Web 应用中的使用非常流行,特 ...
- 负载均衡、LVS概述
1. 负载均衡概述 负载均衡的基本思路是:在一个服务器集群中尽可能的平衡负载量.通常的做法是在服务器前端设置一个负载均衡器(一般是专门的硬件设备).然后负载均衡器将请求的连接路由到最空闲的可用服务器. ...
- PowerShell:Linux程序员喜欢的cmd增强版
Linux程序员有时偶尔使用Windows下的cmd工具,会被逼疯的,有些命令ls, cat, ps等已经条件反射一样使用. 但在cmd下,根本不知道该用什么命令,好在盖兹大叔照顾了此部分需求.从Vi ...
- 【opencv】图像细化
[原文:http://blog.csdn.net/qianchenglenger/article/details/19332011] 在我们进行图像处理的时候,有可能需要对图像进行细化,提取出图像的骨 ...
- C语言断言
1.概述 断言是对某种假设条件进行检查(可理解为若条件成立则无动作,否则应报告),它可以快速发现并定位软件问题,同时对系统错误进行自动报警.断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位 ...
- class0513(html基础加强2)
使用VS创建网页 新建Web项目(新建→ASP.Net Web应用程序),新建html页面(添加→新建项→Web→HTML页) 查看页面的方式: 切换到“设计”视图,可以在这里查看初步的预览效果,不是 ...
- POJ 1738 石子合并2 GarsiaWachs算法
石子合并(GarsiaWachs算法) 只能用该算法过!!! 详解看代码 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~ ...