我的编程空间,编程开发者的网络收藏夹
学习永远不晚

手把手教你如何为Cocos2D-lua的脚本加密

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

手把手教你如何为Cocos2D-lua的脚本加密

  Cocos2D-lua怎么加密解密,你对此了解么?本篇教程将手把手教你如何为Cocos2D-lua的脚本加密。

  1、本文是以 Cocos2d-x-lua项目为例说明的。

  2、我这里只说下我自己遇到的问题和解决方法,当大家也遇到时可以参考下。

  3、我所使用的cocos2d-x版本是cocos2d-2.1rc0-x-2.1.3,这个版本使用的是luajit,而不是源生的lua,luajit有很多好处。

---------------------------------------------------------------------------------------------------------------------------

  方法一:

  这种其实并不是真正意义上的加密,而是用luajit把lua脚本编译成字节码(我之前实验过用luac编译出的字节码不能被luajit执行)。

  1)编译luajit,这里并不是编译luajit的库,而是编译luajit的控制台程序,用作后面把lua脚本代码文件编译成字节码用。

  cd到 coco2dx安装目录/scripting/lua/luajit/LuaJIT-2.0.1

  2) 输入make(如果控台显示command not found,那就要先安装make,Mac作为Unix系却没有提供make,需要打开xcode->xCode(菜单栏)->Open Developer Tool->More Developer Tools->注册/登陆appID->选择你对应的Command Line Tool->下载安装)

  这时会在class="lazy" data-src文件夹下生成可执行文件luajit(这b玩意我找了好久,根本找不到在哪生成的)

  注意:前面那个步骤你也可以输入sudo make install,这是先编译luajit,然后安装luajit环境,这样你在控台直接敲luajit就能用。

  3) 有了luajit这个可执行文件,我们就可以拿它编译lua脚本了。

  这时cd进class="lazy" data-src目录

  输入luajit -b hello1.lua hello1.out

  这个hello1.lua应该是你要编译的源文件,必要时请带上路径。

  4)把这个hello1.out加到你工程里,就可以直接当成普通的脚本一样运行。

  【严重注意】:如果你hello1.lua里面写了require "hello2"那你最好把hello2.lua的生成的文件也命名成hello2.lua,否则再执行hello1.lua的时候就找不到依赖的hello2.lua。当然你也可以require的文件写带后缀名的文件,但这我没有试验过行不行。

手把手教你如何为Cocos2D-lua的脚本加密_Cocos2D-lua加密_Cocos2D-lua教程_Cocos2D-lua_编程学习网

  方法二:

  方法二的前提是你不用luajit,而使用lua。

  这样这种方法是真正加密,原理是我们自己替换是我们自己改lua的源码。

  其实这种方法是因为我之前以为coco2dx用的lua,我在调试lua代码的时候发现的,当然也受到别的大神的启发。

  先贴出一段代码

  LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {

  LoadF lf;

  int status, readstatus;

  int c;

  int fnameindex = lua_gettop(L) + 1;

  lf.extraline = 0;

  if (filename == NULL) {

  lua_pushliteral(L, "=stdin");

  lf.f = stdin;

  }

  else {

  lua_pushfstring(L, "@%s", filename);

  lf.f = fopen(filename, "r");

  if (lf.f == NULL) return errfile(L, "open", fnameindex);

  }

  c = getc(lf.f);

  if (c == '#') {

  lf.extraline = 1;

  while ((c = getc(lf.f)) != EOF && c != '\\n') ;

  if (c == '\\n') c = getc(lf.f);

  }

  if (c == LUA_SIGNATURE[0] && filename) {

  lf.f = freopen(filename, "rb", lf.f);

  if (lf.f == NULL) return errfile(L, "reopen", fnameindex);

  

  while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;

  lf.extraline = 0;

  }

  ungetc(c, lf.f);

  status = lua_load(L, getF, &lf, lua_tostring(L, -1));

  readstatus = ferror(lf.f);

  if (filename) fclose(lf.f);

  if (readstatus) {

  lua_settop(L, fnameindex);

  return errfile(L, "read", fnameindex);

  }

  lua_remove(L, fnameindex);

  return status;

  }

  每当要加载新的lua文件时都会调用luaL_loadfile,当走到status = lua_load (L, getF , &lf,lua_tostring (L, - 1 ))时就说明要从文件读取内容了,注意这里穿了一个参数getF,它其实是个函数指针,我们把这个贴出来

  static const char *getF (lua_State *L, void *ud, size_t *size) {

  LoadF *lf = (LoadF *)ud;

  (void)L;

  if (lf->extraline) {

  lf->extraline = 0;

  *size = 1;

  return "\\n";

  }

  if (feof(lf->f)) return NULL;

  *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);

  return (*size > 0) ? lf->buff : NULL;

  }

  这个函数走完了,lf->buff就有了脚本文件的内容,说道这俩大家就明白了把,我们可以在弄个decodeGetF,在上面传函数指针参数的时候传我们新改的decodeGetF,比方

  static const char *decodeGetF (lua_State *L, void *ud, size_t *size) {

  LoadF *lf = (LoadF *)ud;

  (void)L;

  if (lf->extraline) {

  lf->extraline = 0;

  *size = 1;

  return "\\n";

  }

  if (feof(lf->f)) return NULL;

  *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);

  //咱们来瞎搞一搞

  for(int i=0; i<sizeof(lf->buff); i++)

  {

  lf->buff[i] ^= 250;//简单的异或解密,怎么加密你应该清楚了

  }

  return (*size > 0) ? lf->buff : NULL;

  }

  这种方法我没有实验,理论上是可行的。怎么加密在你,我这只是说了个简单的异或加密解密

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

手把手教你如何为Cocos2D-lua的脚本加密

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

手把手教你如何为Cocos2D-lua的脚本加密

编程学习网:Cocos2D-lua怎么加密解密,你对此了解么?本篇教程将手把手教你如何为Cocos2D-lua的脚本加密。
手把手教你如何为Cocos2D-lua的脚本加密

教你如何为你的Cocos2D-X资源加密解密

编程学习网:我们平时在用Cocos2D-X时都不想让别人看到自己的文件,本篇教程将教你如何为你的Cocos2D-X资源加密解密。
教你如何为你的Cocos2D-X资源加密解密

编程热搜

  • 教你如何为你的Cocos2D-X资源加密解密
    编程学习网:我们平时在用Cocos2D-X时都不想让别人看到自己的文件,本篇教程将教你如何为你的Cocos2D-X资源加密解密。
    教你如何为你的Cocos2D-X资源加密解密
  • 教你如何用Cocos2D实现3d效果
    编程学习网:经过了之前几篇教程,相信各位同学已经对Cocos2D不陌生了,本篇教程将教你如何用Cocos2D实现3d效果。
    教你如何用Cocos2D实现3d效果
  • 零基础学习之教你如何用Cocos2D实现画中画效果
    编程学习网:没学过Cocos2D?没关系,多看看我们的教程,一步步成为游戏开发大神。本篇教程将教你如何用Cocos2D实现画中画效果。
    零基础学习之教你如何用Cocos2D实现画中画效果
  • 解析安卓Cocos2D-X2转移项目到Cocos2D-X3过程
    编程学习网:相信有一部分同学都经历过将项目从Cocos2D-X2转到Cocos2D-X3的麻烦,本篇教程将解析将项目从Cocos2D-X2转到Cocos2D-X3的过程。
    解析安卓Cocos2D-X2转移项目到Cocos2D-X3过程
  • 游戏脚本设计基础教程
    编程学习网:类游戏编程,特别是RPG脚本起着驱动整个游戏进程的作用。事件的运作建立在脚本的基础上,而脚本的设计建立在引擎的基础上,所以设计脚本之前因该想一想引擎,好的脚本对剧情的描述具有简单、准确的性质。
    游戏脚本设计基础教程
  • 成为游戏设计师必须具备的条件
    编程学习网:很多人喜欢玩游戏,他们总在不停感叹:这款游戏实在太精彩了,我要是能设计出这样的游戏就!而在他们行动之前,还有许多需要解答的问题罗列在前,我要如何成为游戏设计师?我需要具备哪些技能和素质?游戏设计师究竟在做什么工作?那么,游戏设计师有哪些任务呢?我们将讨论这个问题。
    成为游戏设计师必须具备的条件
  • 贪食蛇小游戏开发设计基础教程
    编程学习网: 贪吃蛇是家喻户晓的益智类小游戏,大家小时候应该都有玩过,编程学习网这里就不多介绍了,本教程将教你用MicrosoftVisualC++来制作它。
    贪食蛇小游戏开发设计基础教程
  • 成为优秀的Cocos2D程序员需要的十个品质
    编程学习网:相信各位同学都在为了成为优秀的Cocos2D程序员而奋斗着,那么一个优秀的Cocos2D程序员需要具备什么品质呢?本篇教程为你揭秘成为一个优秀的Cocos2D程序员所需要的十个品质。
    成为优秀的Cocos2D程序员需要的十个品质
  • Unity3d脚本基础
    最好用游戏引擎开发游戏,推荐Unity3D引擎,该引擎学习更简单,更易上手。游戏引擎可以编辑你的游戏场景、角色和游戏需要的东西。还有,学习编写脚本。编写脚本实际上就是编程。例如,你要在游戏中按键盘方向键来控制角色行走,这必须通过编写脚本。因此,脚本是游戏的逻辑。小编推荐你去学C编程,Unity3D通常是用C语言编写的。
    Unity3d脚本基础
  • 实例教程解析制作flash小游戏
    编程学习网:flash小游戏在游戏开发中是属于比较简单的类型,本例为FlashAS3.0实例教程,介绍射击类游戏的制作,主要分游戏界面的制作和类的编写两部分,从简单的开始做起,跟着教程动手做做看吧。
    实例教程解析制作flash小游戏

目录