文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

敲键小勇士

敲键小勇士

2024-04-23 23:25

关注

  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->下载安装)

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

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

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

  这时cd进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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     425人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     198人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     158人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     236人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     61人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-游戏开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯