非常多使用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. 普通方式 分页【NOT IN】和【>】效率大PK 千万级别数据测试结果

    首现创建一张表,然后插入1000+万条数据,接下来进行测试. use TTgoif exists (select * from sysobjects where name='Tonge')drop t ...

  2. vfp 操作excel

    VFP全面控制EXCEL 收藏 VFP和Excel都可以用来进行处理数据库表格,如果巧妙地将二者的优点结合起来,将会大大方便我们的工作.比如我们可以利用VFP进行处理数据,而利用Excel的预览打印功 ...

  3. UVa 1642 (综合) Magical GCD

    题意: 给出一个数列,求一个连续的子序列,使得MGCD(i, j) =  该子序列的长度(j-i+1) × 子序列的gcd 最大,并输出这个最大值. 分析: 感觉可能要用优先队列,但貌似也用不上. 但 ...

  4. Java [Leetcode 242]Valid Anagram

    题目描述: Given two strings s and t, write a function to determine if t is an anagram of s. For example, ...

  5. (三)学习MVC之密码加密及用户登录

    1.密码加密采用SHA256 算法,此类的唯一实现是 SHA256Managed.在Common/Text.cs里添加Sha256方法: public static string Sha256(str ...

  6. SharePoint 2010 master page 控件介绍(4):隐藏placeholder

    转:http://blog.csdn.net/lgm97/article/details/6409225 <!-- form digest  安全控件用来进行form的安全校验--> &l ...

  7. 玩一个:可以显示任何xml树结构的xaml定义

    学习中, 玩一玩. 效果如下.Xaml随后. <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio ...

  8. 查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

  9. jQuery.Autocomplete实现自动完成功能

    一.http://www.w3c.com.cn/jquery-plugin-autocomplete-参数及实例 二.jQuery plugin: Autocomplete 参数 minChars: ...

  10. C++ STL@ list 应用 (leetcode: Rotate Array)

    STL中的list就是一双向链表,可高效地进行插入删除元素. List 是 C++标准程式库 中的一个 类 ,可以简单视之为双向 连结串行 ,以线性列的方式管理物件集合.list 的特色是在集合的任何 ...